59#define LOG_MODULE "TZRadio"
60#define LOG_LEVEL LOG_LEVEL_INFO
63#define TZ_RADIO_MAX_PAYLOAD 128
64#define TZ_RADIO_MAX_OBJECT 140
65#define TZ_RADIO_BUF_SIZE \
66 (TZ_RADIO_MAX_OBJECT > TZ_RADIO_MAX_PAYLOAD \
67 ? TZ_RADIO_MAX_OBJECT : TZ_RADIO_MAX_PAYLOAD)
71static tz_radio_ns_rx_callback_t ns_rx_callback;
72static bool rx_callback_registered;
75static int8_t last_rx_rssi;
76static uint8_t last_rx_lqi;
85static uint8_t secure_buf[TZ_RADIO_BUF_SIZE];
87CC_TRUSTZONE_SECURE_CALL
int
90 return ipc_radio_driver.
init();
93CC_TRUSTZONE_SECURE_CALL
int
94tz_radio_prepare(
const void *payload,
unsigned short payload_len)
96 if(payload_len > TZ_RADIO_MAX_PAYLOAD) {
100 if(cmse_check_address_range((
void *)payload, payload_len,
101 CMSE_NONSECURE) == NULL) {
102 LOG_ERR(
"prepare: invalid NS pointer\n");
106 memcpy(secure_buf, payload, payload_len);
108 return ipc_radio_driver.
prepare(secure_buf, payload_len);
111CC_TRUSTZONE_SECURE_CALL
int
112tz_radio_transmit(
unsigned short transmit_len)
114 return ipc_radio_driver.
transmit(transmit_len);
119CC_TRUSTZONE_SECURE_CALL
int
120tz_radio_send(
const void *payload,
unsigned short payload_len)
122 if(payload_len > TZ_RADIO_MAX_PAYLOAD) {
126 if(cmse_check_address_range((
void *)payload, payload_len,
127 CMSE_NONSECURE) == NULL) {
128 LOG_ERR(
"send: invalid NS pointer\n");
132 memcpy(secure_buf, payload, payload_len);
134 return ipc_radio_driver.
send(secure_buf, payload_len);
137CC_TRUSTZONE_SECURE_CALL
int
138tz_radio_read(
void *buf,
unsigned short buf_len)
142 if(cmse_check_address_range(buf, buf_len, CMSE_NONSECURE) == NULL) {
143 LOG_ERR(
"read: invalid NS pointer\n");
147 len = ipc_radio_driver.
read(secure_buf,
148 buf_len < TZ_RADIO_MAX_PAYLOAD
149 ? buf_len : TZ_RADIO_MAX_PAYLOAD);
151 memcpy(buf, secure_buf, len);
157CC_TRUSTZONE_SECURE_CALL
int
158tz_radio_channel_clear(
void)
163CC_TRUSTZONE_SECURE_CALL
int
164tz_radio_receiving_packet(
void)
169CC_TRUSTZONE_SECURE_CALL
int
170tz_radio_pending_packet(
void)
175CC_TRUSTZONE_SECURE_CALL
int
178 return ipc_radio_driver.
on();
181CC_TRUSTZONE_SECURE_CALL
int
184 return ipc_radio_driver.
off();
193 if(cmse_check_address_range(value,
sizeof(*value),
194 CMSE_NONSECURE) == NULL) {
195 LOG_ERR(
"get_value: invalid NS pointer\n");
199 result = ipc_radio_driver.
get_value(param, &secure_value);
201 *value = secure_value;
210 return ipc_radio_driver.
set_value(param, value);
214tz_radio_get_object(radio_param_t param,
void *dest,
size_t size)
218 if(size > TZ_RADIO_MAX_OBJECT) {
222 if(cmse_check_address_range(dest, size, CMSE_NONSECURE) == NULL) {
223 LOG_ERR(
"get_object: invalid NS pointer\n");
227 result = ipc_radio_driver.
get_object(param, secure_buf, size);
229 memcpy(dest, secure_buf, size);
236tz_radio_set_object(radio_param_t param,
const void *src,
size_t size)
238 if(size > TZ_RADIO_MAX_OBJECT) {
242 if(cmse_check_address_range((
void *)src, size, CMSE_NONSECURE) == NULL) {
243 LOG_ERR(
"set_object: invalid NS pointer\n");
247 memcpy(secure_buf, src, size);
249 return ipc_radio_driver.
set_object(param, secure_buf, size);
252CC_TRUSTZONE_SECURE_CALL
bool
253tz_radio_get_device_id(uint32_t *id0, uint32_t *id1)
255 if(cmse_check_address_range(id0,
sizeof(*id0),
256 CMSE_NONSECURE) == NULL) {
259 if(cmse_check_address_range(id1,
sizeof(*id1),
260 CMSE_NONSECURE) == NULL) {
264#if defined(NRF_FICR_S)
265 *id0 = nrf_ficr_deviceid_get(NRF_FICR_S, 0);
266 *id1 = nrf_ficr_deviceid_get(NRF_FICR_S, 1);
267#elif defined(NRF_FICR)
268 *id0 = nrf_ficr_deviceid_get(NRF_FICR, 0);
269 *id1 = nrf_ficr_deviceid_get(NRF_FICR, 1);
278CC_TRUSTZONE_SECURE_CALL
bool
279tz_radio_get_rx_attributes(int8_t *rssi, uint8_t *lqi)
281 if(cmse_check_address_range(rssi,
sizeof(*rssi),
282 CMSE_NONSECURE) == NULL) {
285 if(cmse_check_address_range(lqi,
sizeof(*lqi),
286 CMSE_NONSECURE) == NULL) {
290 *rssi = last_rx_rssi;
295CC_TRUSTZONE_SECURE_CALL
bool
296tz_radio_register_rx_callback(tz_radio_ns_rx_callback_t callback)
298 if(rx_callback_registered) {
302 if(cmse_check_address_range((
void *)callback,
sizeof(callback),
303 CMSE_NONSECURE) == NULL) {
304 LOG_ERR(
"register_rx_callback: invalid NS function pointer\n");
312 (tz_radio_ns_rx_callback_t)cmse_nsfptr_create((
void *)callback);
313 rx_callback_registered =
true;
315 LOG_INFO(
"RX callback registered\n");
320tz_radio_notify_rx(int8_t rssi, uint8_t lqi)
325 if(rx_callback_registered && cmse_is_nsfptr((
void *)ns_rx_callback)) {
enum radio_result_e radio_result_t
Radio return values when setting or getting radio parameters.
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio.
@ RADIO_RESULT_ERROR
An error occurred when getting/setting the parameter, but the arguments were otherwise correct.
@ RADIO_RESULT_INVALID_VALUE
The value argument was incorrect.
@ RADIO_RESULT_OK
The parameter was set/read successfully.
@ RADIO_TX_ERR
An error occurred during transmission.
Header file for the logging system.
Header file for the radio API.
The structure of a Contiki-NG radio device driver.
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
int(* read)(void *buf, unsigned short buf_len)
Read a received packet into a buffer.
int(* prepare)(const void *payload, unsigned short payload_len)
Prepare the radio with a packet to be sent.
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
int(* off)(void)
Turn the radio off.
int(* init)(void)
Initialise the radio hardware.
int(* send)(const void *payload, unsigned short payload_len)
Prepare & transmit a packet.
int(* receiving_packet)(void)
Check if the radio driver is currently receiving a packet.
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
int(* on)(void)
Turn the radio on.
int(* transmit)(unsigned short transmit_len)
Send the packet that has previously been prepared.
int(* pending_packet)(void)
Check if a packet has been received and is available in the radio driver's buffers.
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
int(* channel_clear)(void)
Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not.