Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F86495715
register.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Oct 6, 20:29
Size
3 KB
Mime Type
text/x-c
Expires
Tue, Oct 8, 20:29 (2 d)
Engine
blob
Format
Raw Data
Handle
21430935
Attached To
R6616 sbcp-uc
register.c
View Options
#include <p33Fxxxx.h>
#include <sbcp-uc/register.h>
#include <sbcp-uc/buffers.h>
enum
sbcp_reg_persistent_state
{
SBCP_REG_P_UNDECIDED
,
SBCP_REG_P_ALREADY_SET
,
SBCP_REG_P_TO_SET
};
enum
sbcp_reg_persistent_state
sbcp_reg_p_state
=
SBCP_REG_P_UNDECIDED
;
sbcp_reg_val
_NEAR
sbcp_reg_table
[
SBCP_REG_TABLE_SIZE
];
sbcp_reg_ctrl_params
_NEAR
sbcp_reg_params
[
SBCP_REG_TABLE_SIZE
];
void
set_volatile_register
(
sbcp_reg_address
address
,
uint16_t
value
){
sbcp_reg_table
[
address
].
u
=
value
;
}
void
set_persistent_register
(
sbcp_reg_address
address
,
uint16_t
value
){
unsigned
int
in_eeprom
=
DataEERead
(
address
);
if
(
sbcp_reg_p_state
==
SBCP_REG_P_UNDECIDED
){
if
(
in_eeprom
==
0xffff
&&
GetaddrNotFound
()){
sbcp_reg_p_state
=
SBCP_REG_P_TO_SET
;
}
else
{
sbcp_reg_p_state
=
SBCP_REG_P_ALREADY_SET
;
}
}
if
(
sbcp_reg_p_state
==
SBCP_REG_P_ALREADY_SET
){
sbcp_reg_table
[
address
].
u
=
in_eeprom
;
return
;
}
else
if
(
sbcp_reg_p_state
==
SBCP_REG_P_TO_SET
){
sbcp_reg_table
[
address
].
u
=
value
;
DataEEWrite
(
value
,
address
);
}
}
void
sbcp_add_register_private
(
sbcp_reg_address
address
,
uint16_t
value
,
sbcp_reg_flags
flags
,
sbcp_reg_host_wr_callback
clb
){
if
(
flags
&
SBCP_REG_PERSISTENT
){
set_persistent_register
(
address
,
value
);
}
else
{
set_volatile_register
(
address
,
value
);
}
sbcp_reg_flags
(
address
)
=
flags
&
SBCP_REG_USER_SETABLE_FLAGS
;
if
(
flags
&
SBCP_REG_WRITABLE
)
{
sbcp_reg_clbck
(
address
)
=
clb
;
}
else
{
sbcp_reg_clbck
(
address
)
=
SBCP_REG_NO_CALLBACK
;
}
}
sbcp_error
sbcp_id_register_callback
(
sbcp_reg_address
address
,
sbcp_reg_val
*
val
){
if
(
address
!=
SBCP_REG_ID
){
return
SBCP_CERR_REG_PROTECTED
;
}
val
->
u
&=
0x00ff
;
init_buffers
(
SBCP_MY_CLASS
,
val
->
u
);
return
SBCP_NO_ERROR
;
}
void
sbcp_add_register
(
sbcp_reg_address
address
,
uint16_t
value
,
sbcp_reg_flags
flags
,
sbcp_reg_host_wr_callback
clb
){
if
(
address
>=
SBCP_REG_TABLE_SIZE
){
return
;
}
if
(
address
<
SBCP_SPECIFIC_REG_START
){
return
;
}
sbcp_add_register_private
(
address
,
value
,
flags
,
clb
);
}
void
sbcp_add_register_no_callback
(
sbcp_reg_address
address
,
uint16_t
value
,
sbcp_reg_flags
flags
){
sbcp_add_register
(
address
,
value
,
flags
,
SBCP_REG_NO_CALLBACK
);
}
void
sbcp_init_registers
(
sbcp_class
klass
,
sbcp_id
id
,
sbcp_fw_version
version
,
sbcp_init_device_registers_fptr
device_specific_init
){
unsigned
int
i
;
for
(
i
=
0
;
i
<
SBCP_REG_TABLE_SIZE
;
++
i
){
sbcp_reg_table
[
i
].
i
=
0
;
sbcp_reg_params
[
i
].
flags
=
SBCP_REG_UNIMPLEMENTED
;
sbcp_reg_params
[
i
].
callback
=
SBCP_REG_NO_CALLBACK
;
}
if
(
DataEEInit
()){
return
;
}
dataEEFlags
.
val
=
0
;
sbcp_add_register_private
(
SBCP_REG_FW
,
version
,
SBCP_REG_READABLE
|
SBCP_REG_PERSISTENT
,
SBCP_REG_NO_CALLBACK
);
sbcp_add_register_private
(
SBCP_REG_CLASS
,
klass
,
SBCP_REG_READABLE
|
SBCP_REG_PERSISTENT
,
SBCP_REG_NO_CALLBACK
);
sbcp_add_register_private
(
SBCP_REG_ID
,
id
,
SBCP_REG_READABLE
|
SBCP_REG_WRITABLE
|
SBCP_REG_PERSISTENT
,
&
sbcp_id_register_callback
);
if
(
device_specific_init
!=
(
void
*
)
0
){
(
*
device_specific_init
)();
}
}
Event Timeline
Log In to Comment