Toyomasa Watarai / Mbed OS Mbed-example-WS-W27

Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 #include "NanostackRfPhySpirit1.h"
MACRUM 0:119624335925 2
MACRUM 0:119624335925 3 #ifdef MBED_CONF_NANOSTACK_CONFIGURATION
MACRUM 0:119624335925 4 #if MBED_CONF_RTOS_PRESENT
MACRUM 0:119624335925 5
MACRUM 0:119624335925 6 #include "SimpleSpirit1.h"
MACRUM 0:119624335925 7 #include "nanostack/platform/arm_hal_phy.h"
MACRUM 0:119624335925 8 #include "platform/arm_hal_interrupt.h"
MACRUM 0:119624335925 9
MACRUM 0:119624335925 10 #include "mbed_trace.h"
MACRUM 0:119624335925 11 #define TRACE_GROUP "SPIRIT"
MACRUM 0:119624335925 12
MACRUM 0:119624335925 13 /* Define beyond macro if you want to perform heavy debug tracing (includes tracing in IRQ context) */
MACRUM 0:119624335925 14 // #define HEAVY_TRACING
MACRUM 0:119624335925 15
MACRUM 0:119624335925 16 static phy_device_driver_s device_driver;
MACRUM 0:119624335925 17 static int8_t rf_radio_driver_id = -1;
MACRUM 0:119624335925 18
MACRUM 0:119624335925 19 const phy_rf_channel_configuration_s phy_subghz = {868000000, 1000000, 250000, 11, M_GFSK};
MACRUM 0:119624335925 20
MACRUM 0:119624335925 21 static phy_device_channel_page_s phy_channel_pages[] = {
MACRUM 0:119624335925 22 {CHANNEL_PAGE_2, &phy_subghz},
MACRUM 0:119624335925 23 {CHANNEL_PAGE_0, NULL}
MACRUM 0:119624335925 24 };
MACRUM 0:119624335925 25
MACRUM 0:119624335925 26 static uint8_t tx_sequence = 0xff;
MACRUM 0:119624335925 27 static uint8_t mac_tx_handle = 0;
MACRUM 0:119624335925 28
MACRUM 0:119624335925 29 static SimpleSpirit1 *rf_device = NULL;
MACRUM 0:119624335925 30 static uint8_t rf_rx_buf[MAX_PACKET_LEN];
MACRUM 0:119624335925 31
MACRUM 0:119624335925 32 static uint16_t stored_short_adr;
MACRUM 0:119624335925 33 static uint16_t stored_pan_id;
MACRUM 0:119624335925 34 static uint8_t stored_mac_address[8] = MBED_CONF_SPIRIT1_MAC_ADDRESS;
MACRUM 0:119624335925 35
MACRUM 0:119624335925 36 #define RF_SIG_ACK_NEEDED (1<<0)
MACRUM 0:119624335925 37 #define RF_SIG_CB_TX_DONE (1<<1)
MACRUM 0:119624335925 38 #define RF_SIG_CB_RX_RCVD (1<<2)
MACRUM 0:119624335925 39 static Thread rf_ack_sender(osPriorityRealtime);
MACRUM 0:119624335925 40 static volatile uint8_t rf_rx_sequence;
MACRUM 0:119624335925 41 static volatile bool rf_ack_sent = false;
MACRUM 0:119624335925 42 static volatile bool expecting_ack = false;
MACRUM 0:119624335925 43 static volatile bool need_ack = false;
MACRUM 0:119624335925 44
MACRUM 0:119624335925 45 /* MAC frame helper macros */
MACRUM 0:119624335925 46 #define MAC_FCF_FRAME_TYPE_MASK 0x0007
MACRUM 0:119624335925 47 #define MAC_FCF_FRAME_TYPE_SHIFT 0
MACRUM 0:119624335925 48 #define MAC_FCF_SECURITY_BIT_MASK 0x0008
MACRUM 0:119624335925 49 #define MAC_FCF_SECURITY_BIT_SHIFT 3
MACRUM 0:119624335925 50 #define MAC_FCF_PENDING_BIT_MASK 0x0010
MACRUM 0:119624335925 51 #define MAC_FCF_PENDING_BIT_SHIFT 4
MACRUM 0:119624335925 52 #define MAC_FCF_ACK_REQ_BIT_MASK 0x0020
MACRUM 0:119624335925 53 #define MAC_FCF_ACK_REQ_BIT_SHIFT 5
MACRUM 0:119624335925 54 #define MAC_FCF_INTRA_PANID_MASK 0x0040
MACRUM 0:119624335925 55 #define MAC_FCF_INTRA_PANID_SHIFT 6
MACRUM 0:119624335925 56 #define MAC_FCF_DST_ADDR_MASK 0x0c00
MACRUM 0:119624335925 57 #define MAC_FCF_DST_ADDR_SHIFT 10
MACRUM 0:119624335925 58 #define MAC_FCF_VERSION_MASK 0x3000
MACRUM 0:119624335925 59 #define MAC_FCF_VERSION_SHIFT 12
MACRUM 0:119624335925 60 #define MAC_FCF_SRC_ADDR_MASK 0xc000
MACRUM 0:119624335925 61 #define MAC_FCF_SRC_ADDR_SHIFT 14
MACRUM 0:119624335925 62
MACRUM 0:119624335925 63 /* MAC supported frame types */
MACRUM 0:119624335925 64 #define FC_BEACON_FRAME 0x00
MACRUM 0:119624335925 65 #define FC_DATA_FRAME 0x01
MACRUM 0:119624335925 66 #define FC_ACK_FRAME 0x02
MACRUM 0:119624335925 67 #define FC_CMD_FRAME 0x03
MACRUM 0:119624335925 68
MACRUM 0:119624335925 69 static inline void rf_if_lock(void)
MACRUM 0:119624335925 70 {
MACRUM 0:119624335925 71 platform_enter_critical();
MACRUM 0:119624335925 72 }
MACRUM 0:119624335925 73
MACRUM 0:119624335925 74 static inline void rf_if_unlock(void)
MACRUM 0:119624335925 75 {
MACRUM 0:119624335925 76 platform_exit_critical();
MACRUM 0:119624335925 77 }
MACRUM 0:119624335925 78
MACRUM 0:119624335925 79 static inline uint16_t rf_read_16_bit(uint8_t *data_ptr) { // little-endian
MACRUM 0:119624335925 80 uint16_t ret;
MACRUM 0:119624335925 81
MACRUM 0:119624335925 82 ret = ((uint16_t)data_ptr[0]) + (((uint16_t)data_ptr[1]) << 8);
MACRUM 0:119624335925 83 return ret;
MACRUM 0:119624335925 84 }
MACRUM 0:119624335925 85
MACRUM 0:119624335925 86 /* Note: we are in IRQ context */
MACRUM 0:119624335925 87 static inline void rf_send_signal(int32_t signal) {
MACRUM 0:119624335925 88 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 89 tr_info("%s (%d): %d", __func__, __LINE__, signal);
MACRUM 0:119624335925 90 #endif
MACRUM 0:119624335925 91 rf_ack_sender.signal_set(signal);
MACRUM 0:119624335925 92 }
MACRUM 0:119624335925 93
MACRUM 0:119624335925 94 static volatile phy_link_tx_status_e phy_status;
MACRUM 0:119624335925 95 /* Note: we are in IRQ context */
MACRUM 0:119624335925 96 static void rf_handle_ack(uint8_t seq_number)
MACRUM 0:119624335925 97 {
MACRUM 0:119624335925 98 /*Received ACK sequence must be equal with transmitted packet sequence*/
MACRUM 0:119624335925 99 if(tx_sequence == seq_number)
MACRUM 0:119624335925 100 {
MACRUM 0:119624335925 101 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 102 tr_info("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 103 #endif
MACRUM 0:119624335925 104
MACRUM 0:119624335925 105 /*Call PHY TX Done API*/
MACRUM 0:119624335925 106 if(device_driver.phy_tx_done_cb){
MACRUM 0:119624335925 107 phy_status = PHY_LINK_TX_DONE;
MACRUM 0:119624335925 108 rf_send_signal(RF_SIG_CB_TX_DONE);
MACRUM 0:119624335925 109 }
MACRUM 0:119624335925 110 } else {
MACRUM 0:119624335925 111 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 112 tr_info("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 113 #endif
MACRUM 0:119624335925 114
MACRUM 0:119624335925 115 /*Call PHY TX Done API*/
MACRUM 0:119624335925 116 if(device_driver.phy_tx_done_cb){
MACRUM 0:119624335925 117 phy_status = PHY_LINK_TX_FAIL;
MACRUM 0:119624335925 118 rf_send_signal(RF_SIG_CB_TX_DONE);
MACRUM 0:119624335925 119 }
MACRUM 0:119624335925 120 }
MACRUM 0:119624335925 121 }
MACRUM 0:119624335925 122
MACRUM 0:119624335925 123 /* Note: we are in IRQ context */
MACRUM 0:119624335925 124 static inline bool rf_check_mac_address(uint8_t *dest) {
MACRUM 0:119624335925 125 for(int i = 0; i < 8; i++) {
MACRUM 0:119624335925 126 if(dest[i] != stored_mac_address[7-i]) {
MACRUM 0:119624335925 127 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 128 tr_debug("%s (%d): i=%d, dest=%x, stored=%x",
MACRUM 0:119624335925 129 __func__, __LINE__,
MACRUM 0:119624335925 130 i, dest[i], stored_mac_address[7-i]);
MACRUM 0:119624335925 131 #endif
MACRUM 0:119624335925 132 return false;
MACRUM 0:119624335925 133 }
MACRUM 0:119624335925 134 }
MACRUM 0:119624335925 135 return true;
MACRUM 0:119624335925 136 }
MACRUM 0:119624335925 137
MACRUM 0:119624335925 138 /* Note: we are in IRQ context */
MACRUM 0:119624335925 139 /* Returns true if packet should be accepted */
MACRUM 0:119624335925 140 static bool rf_check_destination(int len, uint8_t *ack_requested) {
MACRUM 0:119624335925 141 uint8_t frame_type;
MACRUM 0:119624335925 142 uint16_t dst_pan_id;
MACRUM 0:119624335925 143 uint16_t dst_short_adr;
MACRUM 0:119624335925 144 uint8_t dst_addr_mode = 0x0; /*0x00 = no address 0x01 = reserved 0x02 = 16-bit short address 0x03 = 64-bit extended address */
MACRUM 0:119624335925 145 uint8_t src_addr_mode = 0x0; /*0x00 = no address 0x01 = reserved 0x02 = 16-bit short address 0x03 = 64-bit extended address */
MACRUM 0:119624335925 146 uint8_t min_size = 3; // FCF & SeqNr
MACRUM 0:119624335925 147 bool ret = false;
MACRUM 0:119624335925 148 #if defined(HEAVY_TRACING)
MACRUM 0:119624335925 149 bool panid_compr = false;
MACRUM 0:119624335925 150 #endif
MACRUM 0:119624335925 151
MACRUM 0:119624335925 152 if(len < 3) {
MACRUM 0:119624335925 153 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 154 return false;
MACRUM 0:119624335925 155 }
MACRUM 0:119624335925 156
MACRUM 0:119624335925 157 uint16_t fcf = rf_read_16_bit(rf_rx_buf);
MACRUM 0:119624335925 158 frame_type = ((fcf & MAC_FCF_FRAME_TYPE_MASK) >> MAC_FCF_FRAME_TYPE_SHIFT);
MACRUM 0:119624335925 159 (*ack_requested) = ((fcf & MAC_FCF_ACK_REQ_BIT_MASK) >> MAC_FCF_ACK_REQ_BIT_SHIFT);
MACRUM 0:119624335925 160 dst_addr_mode = ((fcf & MAC_FCF_DST_ADDR_MASK) >> MAC_FCF_DST_ADDR_SHIFT);
MACRUM 0:119624335925 161 src_addr_mode = ((fcf & MAC_FCF_SRC_ADDR_MASK) >> MAC_FCF_SRC_ADDR_SHIFT);
MACRUM 0:119624335925 162 #if defined(HEAVY_TRACING)
MACRUM 0:119624335925 163 panid_compr = ((fcf & MAC_FCF_INTRA_PANID_MASK) >> MAC_FCF_INTRA_PANID_SHIFT);
MACRUM 0:119624335925 164 #endif
MACRUM 0:119624335925 165
MACRUM 0:119624335925 166 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 167 tr_info("%s (%d): len=%d, ftype=%x, snr=%x, ack=%d, dst=%x, src=%x, intra=%d", __func__, __LINE__, len, frame_type,
MACRUM 0:119624335925 168 rf_rx_buf[2], (*ack_requested), dst_addr_mode, src_addr_mode, panid_compr);
MACRUM 0:119624335925 169 #endif
MACRUM 0:119624335925 170
MACRUM 0:119624335925 171 if(frame_type == FC_ACK_FRAME) { // betzw: we support up to two different forms of ACK frames!
MACRUM 0:119624335925 172 if((len == 3) && (dst_addr_mode == 0x0) && (src_addr_mode == 0x0)) {
MACRUM 0:119624335925 173 ret = true;
MACRUM 0:119624335925 174 }
MACRUM 0:119624335925 175
MACRUM 0:119624335925 176 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 177 tr_info("%s (%d): ret=%d", __func__, __LINE__, ret);
MACRUM 0:119624335925 178 #endif
MACRUM 0:119624335925 179 (*ack_requested) = 0; // Never acknowledge ACK frames
MACRUM 0:119624335925 180 return ret;
MACRUM 0:119624335925 181 }
MACRUM 0:119624335925 182
MACRUM 0:119624335925 183 switch(dst_addr_mode) {
MACRUM 0:119624335925 184 case 0x00:
MACRUM 0:119624335925 185 ret = true; // no check possible;
MACRUM 0:119624335925 186 break;
MACRUM 0:119624335925 187
MACRUM 0:119624335925 188 case 0x02:
MACRUM 0:119624335925 189 min_size += 4; // pan id + short dest adr
MACRUM 0:119624335925 190
MACRUM 0:119624335925 191 if(len < 5) {
MACRUM 0:119624335925 192 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 193 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 194 #endif
MACRUM 0:119624335925 195 return false;
MACRUM 0:119624335925 196 }
MACRUM 0:119624335925 197
MACRUM 0:119624335925 198 dst_pan_id = rf_read_16_bit(&rf_rx_buf[3]);
MACRUM 0:119624335925 199 if((dst_pan_id != stored_pan_id) && (dst_pan_id != 0xFFFF)) {
MACRUM 0:119624335925 200 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 201 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 202 #endif
MACRUM 0:119624335925 203 return false;
MACRUM 0:119624335925 204 }
MACRUM 0:119624335925 205
MACRUM 0:119624335925 206 if(len < 7) {
MACRUM 0:119624335925 207 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 208 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 209 #endif
MACRUM 0:119624335925 210 return false;
MACRUM 0:119624335925 211 }
MACRUM 0:119624335925 212
MACRUM 0:119624335925 213 dst_short_adr = rf_read_16_bit(&rf_rx_buf[5]);
MACRUM 0:119624335925 214 if((dst_short_adr != stored_short_adr) && (dst_short_adr != 0xFFFF)) {
MACRUM 0:119624335925 215 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 216 tr_debug("%s (%d): %d!=%d", __func__, __LINE__, dst_short_adr, stored_short_adr);
MACRUM 0:119624335925 217 #endif
MACRUM 0:119624335925 218 return false;
MACRUM 0:119624335925 219 }
MACRUM 0:119624335925 220
MACRUM 0:119624335925 221 ret = true;
MACRUM 0:119624335925 222 break;
MACRUM 0:119624335925 223
MACRUM 0:119624335925 224 case 0x03:
MACRUM 0:119624335925 225 min_size += 10; // pan id + dest mac addr
MACRUM 0:119624335925 226
MACRUM 0:119624335925 227 if(len < 5) {
MACRUM 0:119624335925 228 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 229 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 230 #endif
MACRUM 0:119624335925 231 return false;
MACRUM 0:119624335925 232 }
MACRUM 0:119624335925 233
MACRUM 0:119624335925 234 dst_pan_id = rf_read_16_bit(&rf_rx_buf[3]);
MACRUM 0:119624335925 235 if((dst_pan_id != stored_pan_id) && (dst_pan_id != 0xFFFF)) {
MACRUM 0:119624335925 236 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 237 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 238 #endif
MACRUM 0:119624335925 239 return false;
MACRUM 0:119624335925 240 }
MACRUM 0:119624335925 241
MACRUM 0:119624335925 242 if(len < 13) {
MACRUM 0:119624335925 243 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 244 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 245 #endif
MACRUM 0:119624335925 246 return false;
MACRUM 0:119624335925 247 }
MACRUM 0:119624335925 248
MACRUM 0:119624335925 249 ret = rf_check_mac_address(&rf_rx_buf[5]);
MACRUM 0:119624335925 250
MACRUM 0:119624335925 251 if(!ret) {
MACRUM 0:119624335925 252 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 253 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 254 #endif
MACRUM 0:119624335925 255 return false;
MACRUM 0:119624335925 256 }
MACRUM 0:119624335925 257
MACRUM 0:119624335925 258 break;
MACRUM 0:119624335925 259
MACRUM 0:119624335925 260 default:
MACRUM 0:119624335925 261 /* not supported */
MACRUM 0:119624335925 262 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 263 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 264 #endif
MACRUM 0:119624335925 265 return false;
MACRUM 0:119624335925 266 }
MACRUM 0:119624335925 267
MACRUM 0:119624335925 268 if(ret && (*ack_requested)) {
MACRUM 0:119624335925 269 rf_rx_sequence = rf_rx_buf[2];
MACRUM 0:119624335925 270 }
MACRUM 0:119624335925 271
MACRUM 0:119624335925 272 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 273 tr_info("%s (%d), ret=%d, ack=%d", __func__, __LINE__, ret, (*ack_requested));
MACRUM 0:119624335925 274 #endif
MACRUM 0:119624335925 275 return ret;
MACRUM 0:119624335925 276 }
MACRUM 0:119624335925 277
MACRUM 0:119624335925 278 static uint16_t rf_buffer_len = 0;
MACRUM 0:119624335925 279 static uint8_t rf_sqi;
MACRUM 0:119624335925 280 static int8_t rf_rssi;
MACRUM 0:119624335925 281 /* Note: we are in IRQ context */
MACRUM 0:119624335925 282 static inline void rf_handle_rx_end(void)
MACRUM 0:119624335925 283 {
MACRUM 0:119624335925 284 uint8_t ack_requested = 0;
MACRUM 0:119624335925 285
MACRUM 0:119624335925 286 /* Get received data */
MACRUM 0:119624335925 287 rf_buffer_len = rf_device->read(rf_rx_buf, MAX_PACKET_LEN);
MACRUM 0:119624335925 288 if(!rf_buffer_len)
MACRUM 0:119624335925 289 return;
MACRUM 0:119624335925 290
MACRUM 0:119624335925 291 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 292 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 293 #endif
MACRUM 0:119624335925 294
MACRUM 0:119624335925 295 /* Check if packet should be accepted */
MACRUM 0:119624335925 296 if(!rf_check_destination(rf_buffer_len, &ack_requested)) {
MACRUM 0:119624335925 297 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 298 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 299 #endif
MACRUM 0:119624335925 300 return;
MACRUM 0:119624335925 301 }
MACRUM 0:119624335925 302
MACRUM 0:119624335925 303 /* If waiting for ACK, check here if the packet is an ACK to a message previously sent */
MACRUM 0:119624335925 304 if(expecting_ack) {
MACRUM 0:119624335925 305 uint16_t fcf = rf_read_16_bit(rf_rx_buf);
MACRUM 0:119624335925 306 expecting_ack = false;
MACRUM 0:119624335925 307
MACRUM 0:119624335925 308 if(((fcf & MAC_FCF_FRAME_TYPE_MASK) >> MAC_FCF_FRAME_TYPE_SHIFT) == FC_ACK_FRAME) {
MACRUM 0:119624335925 309 /*Send sequence number in ACK handler*/
MACRUM 0:119624335925 310 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 311 tr_debug("%s (%d), len=%u", __func__, __LINE__, (unsigned int)rf_buffer_len);
MACRUM 0:119624335925 312 #endif
MACRUM 0:119624335925 313 rf_handle_ack(rf_rx_buf[2]);
MACRUM 0:119624335925 314 return;
MACRUM 0:119624335925 315 } else {
MACRUM 0:119624335925 316 /*Call PHY TX Done API*/
MACRUM 0:119624335925 317 if(device_driver.phy_tx_done_cb){
MACRUM 0:119624335925 318 phy_status = PHY_LINK_TX_FAIL;
MACRUM 0:119624335925 319 rf_send_signal(RF_SIG_CB_TX_DONE);
MACRUM 0:119624335925 320 }
MACRUM 0:119624335925 321 }
MACRUM 0:119624335925 322 }
MACRUM 0:119624335925 323
MACRUM 0:119624335925 324 /* Kick off ACK sending */
MACRUM 0:119624335925 325 if(ack_requested) {
MACRUM 0:119624335925 326 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 327 tr_debug("%s (%d), len=%u", __func__, __LINE__, (unsigned int)rf_buffer_len);
MACRUM 0:119624335925 328 #endif
MACRUM 0:119624335925 329 rf_send_signal(RF_SIG_ACK_NEEDED);
MACRUM 0:119624335925 330 }
MACRUM 0:119624335925 331
MACRUM 0:119624335925 332 /* Get link information */
MACRUM 0:119624335925 333 rf_rssi = (int8_t)rf_device->get_last_rssi_dbm();
MACRUM 0:119624335925 334 rf_sqi = (uint8_t)rf_device->get_last_sqi(); // use SQI as link quality
MACRUM 0:119624335925 335
MACRUM 0:119624335925 336 /* Note: Checksum of the packet must be checked and removed before entering here */
MACRUM 0:119624335925 337 /* TODO - betzw: what to do? */
MACRUM 0:119624335925 338
MACRUM 0:119624335925 339 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 340 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 341 #endif
MACRUM 0:119624335925 342
MACRUM 0:119624335925 343 /* Send received data and link information to the network stack */
MACRUM 0:119624335925 344 if( device_driver.phy_rx_cb ){
MACRUM 0:119624335925 345 rf_send_signal(RF_SIG_CB_RX_RCVD);
MACRUM 0:119624335925 346 }
MACRUM 0:119624335925 347 }
MACRUM 0:119624335925 348
MACRUM 0:119624335925 349 /* Note: we are in IRQ context */
MACRUM 0:119624335925 350 static inline void rf_handle_tx_end(void)
MACRUM 0:119624335925 351 {
MACRUM 0:119624335925 352 /* Check if this is an ACK sending which is still pending */
MACRUM 0:119624335925 353 if(rf_ack_sent) {
MACRUM 0:119624335925 354 rf_ack_sent = false;
MACRUM 0:119624335925 355 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 356 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 357 #endif
MACRUM 0:119624335925 358 return; // no need to inform stack
MACRUM 0:119624335925 359 }
MACRUM 0:119624335925 360
MACRUM 0:119624335925 361 /* Transform `need_ack` in `expecting_ack` */
MACRUM 0:119624335925 362 if(need_ack) {
MACRUM 0:119624335925 363 need_ack = false;
MACRUM 0:119624335925 364 expecting_ack = true;
MACRUM 0:119624335925 365 }
MACRUM 0:119624335925 366
MACRUM 0:119624335925 367 /*Call PHY TX Done API*/
MACRUM 0:119624335925 368 if(device_driver.phy_tx_done_cb){
MACRUM 0:119624335925 369 phy_status = PHY_LINK_TX_SUCCESS;
MACRUM 0:119624335925 370 rf_send_signal(RF_SIG_CB_TX_DONE);
MACRUM 0:119624335925 371 }
MACRUM 0:119624335925 372 }
MACRUM 0:119624335925 373
MACRUM 0:119624335925 374 /* Note: we might be in IRQ context */
MACRUM 0:119624335925 375 static inline void rf_handle_tx_err(phy_link_tx_status_e phy_val = PHY_LINK_TX_FAIL) {
MACRUM 0:119624335925 376 /*Call PHY TX Done API*/
MACRUM 0:119624335925 377 if(device_driver.phy_tx_done_cb){
MACRUM 0:119624335925 378 need_ack = false;
MACRUM 0:119624335925 379 phy_status = phy_val;
MACRUM 0:119624335925 380 rf_send_signal(RF_SIG_CB_TX_DONE);
MACRUM 0:119624335925 381 }
MACRUM 0:119624335925 382 }
MACRUM 0:119624335925 383
MACRUM 0:119624335925 384 /* Note: we are in IRQ context */
MACRUM 0:119624335925 385 static void rf_callback_func(int event) {
MACRUM 0:119624335925 386 switch(event) {
MACRUM 0:119624335925 387 case SimpleSpirit1::RX_DONE:
MACRUM 0:119624335925 388 rf_handle_rx_end();
MACRUM 0:119624335925 389 break;
MACRUM 0:119624335925 390 case SimpleSpirit1::TX_DONE:
MACRUM 0:119624335925 391 rf_handle_tx_end();
MACRUM 0:119624335925 392 break;
MACRUM 0:119624335925 393 case SimpleSpirit1::TX_ERR:
MACRUM 0:119624335925 394 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 395 tr_debug("%s (%d): TX_ERR!!!", __func__, __LINE__);
MACRUM 0:119624335925 396 #endif
MACRUM 0:119624335925 397 rf_handle_tx_err();
MACRUM 0:119624335925 398 break;
MACRUM 0:119624335925 399 }
MACRUM 0:119624335925 400 }
MACRUM 0:119624335925 401
MACRUM 0:119624335925 402 static int8_t rf_trigger_send(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol)
MACRUM 0:119624335925 403 {
MACRUM 0:119624335925 404 #ifndef NDEBUG
MACRUM 0:119624335925 405 debug_if(!(data_length >= 3), "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__);
MACRUM 0:119624335925 406 #endif
MACRUM 0:119624335925 407
MACRUM 0:119624335925 408 /* Give 'rf_ack_sender' a better chance to run */
MACRUM 0:119624335925 409 Thread::yield();
MACRUM 0:119624335925 410
MACRUM 0:119624335925 411 /* Get Lock */
MACRUM 0:119624335925 412 rf_if_lock();
MACRUM 0:119624335925 413
MACRUM 0:119624335925 414 /*Check if transmitter is busy*/
MACRUM 0:119624335925 415 if(rf_device->is_receiving()) { /* betzw - WAS: (rf_device->channel_clear() != 0)), do NOT use this but rather study and enable automatic CCA */
MACRUM 0:119624335925 416 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 417 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 418 #endif
MACRUM 0:119624335925 419
MACRUM 0:119624335925 420 /* Release Lock */
MACRUM 0:119624335925 421 rf_if_unlock();
MACRUM 0:119624335925 422
MACRUM 0:119624335925 423 /*Return busy*/
MACRUM 0:119624335925 424 return -1;
MACRUM 0:119624335925 425 } else {
MACRUM 0:119624335925 426 uint16_t fcf = rf_read_16_bit(data_ptr);
MACRUM 0:119624335925 427
MACRUM 0:119624335925 428 /*Check if transmitted data needs to be acked*/
MACRUM 0:119624335925 429 if((fcf & MAC_FCF_ACK_REQ_BIT_MASK) >> MAC_FCF_ACK_REQ_BIT_SHIFT)
MACRUM 0:119624335925 430 need_ack = true;
MACRUM 0:119624335925 431 else
MACRUM 0:119624335925 432 need_ack = false;
MACRUM 0:119624335925 433
MACRUM 0:119624335925 434 /*Store the sequence number for ACK handling*/
MACRUM 0:119624335925 435 tx_sequence = *(data_ptr + 2);
MACRUM 0:119624335925 436
MACRUM 0:119624335925 437 /*Store TX handle*/
MACRUM 0:119624335925 438 mac_tx_handle = tx_handle;
MACRUM 0:119624335925 439
MACRUM 0:119624335925 440 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 441 tr_info("%s (%d), len=%d, tx_handle=%x, tx_seq=%x, need_ack=%d (%x:%x, %x:%x, %x:%x, %x:%x)", __func__, __LINE__,
MACRUM 0:119624335925 442 data_length, tx_handle, tx_sequence, need_ack,
MACRUM 0:119624335925 443 data_ptr[3], data_ptr[4], data_ptr[5], data_ptr[6],
MACRUM 0:119624335925 444 data_ptr[7], data_ptr[8], data_ptr[9], data_ptr[10]);
MACRUM 0:119624335925 445 #endif
MACRUM 0:119624335925 446
MACRUM 0:119624335925 447 /*Send the packet*/
MACRUM 0:119624335925 448 int ret = rf_device->send(data_ptr, data_length);
MACRUM 0:119624335925 449 if(ret != RADIO_TX_OK) {
MACRUM 0:119624335925 450 rf_handle_tx_err(PHY_LINK_CCA_FAIL);
MACRUM 0:119624335925 451 }
MACRUM 0:119624335925 452
MACRUM 0:119624335925 453 /* Release Lock */
MACRUM 0:119624335925 454 rf_if_unlock();
MACRUM 0:119624335925 455 }
MACRUM 0:119624335925 456
MACRUM 0:119624335925 457 /*Return success*/
MACRUM 0:119624335925 458 return 0;
MACRUM 0:119624335925 459 }
MACRUM 0:119624335925 460
MACRUM 0:119624335925 461 static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel)
MACRUM 0:119624335925 462 {
MACRUM 0:119624335925 463 int8_t ret_val = 0;
MACRUM 0:119624335925 464 switch (new_state)
MACRUM 0:119624335925 465 {
MACRUM 0:119624335925 466 /*Reset PHY driver and set to idle*/
MACRUM 0:119624335925 467 case PHY_INTERFACE_RESET:
MACRUM 0:119624335925 468 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 469 rf_device->reset_board();
MACRUM 0:119624335925 470 break;
MACRUM 0:119624335925 471 /*Disable PHY Interface driver*/
MACRUM 0:119624335925 472 case PHY_INTERFACE_DOWN:
MACRUM 0:119624335925 473 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 474 ret_val = rf_device->off();
MACRUM 0:119624335925 475 if(ret_val != 0) ret_val = -1;
MACRUM 0:119624335925 476 break;
MACRUM 0:119624335925 477 /*Enable PHY Interface driver*/
MACRUM 0:119624335925 478 case PHY_INTERFACE_UP:
MACRUM 0:119624335925 479 ret_val = rf_device->on();
MACRUM 0:119624335925 480 if(ret_val != 0) {
MACRUM 0:119624335925 481 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 482 ret_val = -1;
MACRUM 0:119624335925 483 break;
MACRUM 0:119624335925 484 }
MACRUM 0:119624335925 485 tr_debug("%s (%d) - channel: %d", __func__, __LINE__, (int)rf_channel);
MACRUM 0:119624335925 486 rf_device->set_channel(rf_channel);
MACRUM 0:119624335925 487 break;
MACRUM 0:119624335925 488 /*Enable wireless interface ED scan mode*/
MACRUM 0:119624335925 489 case PHY_INTERFACE_RX_ENERGY_STATE:
MACRUM 0:119624335925 490 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 491 break;
MACRUM 0:119624335925 492 /*Enable Sniffer state*/
MACRUM 0:119624335925 493 case PHY_INTERFACE_SNIFFER_STATE:
MACRUM 0:119624335925 494 // TODO - if we really need this - WAS: rf_setup_sniffer(rf_channel);
MACRUM 0:119624335925 495 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 496 ret_val = -1;
MACRUM 0:119624335925 497 break;
MACRUM 0:119624335925 498 default:
MACRUM 0:119624335925 499 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 500 break;
MACRUM 0:119624335925 501 }
MACRUM 0:119624335925 502 return ret_val;
MACRUM 0:119624335925 503 }
MACRUM 0:119624335925 504
MACRUM 0:119624335925 505 static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_ptr)
MACRUM 0:119624335925 506 {
MACRUM 0:119624335925 507 switch (extension_type)
MACRUM 0:119624335925 508 {
MACRUM 0:119624335925 509 /*Control MAC pending bit for Indirect data transmission*/
MACRUM 0:119624335925 510 case PHY_EXTENSION_CTRL_PENDING_BIT:
MACRUM 0:119624335925 511 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 512 break;
MACRUM 0:119624335925 513
MACRUM 0:119624335925 514 /*Return frame pending status*/
MACRUM 0:119624335925 515 case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS:
MACRUM 0:119624335925 516 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 517 *data_ptr = 0;
MACRUM 0:119624335925 518 break;
MACRUM 0:119624335925 519
MACRUM 0:119624335925 520 /*Set channel, used for setting channel for energy scan*/
MACRUM 0:119624335925 521 case PHY_EXTENSION_SET_CHANNEL:
MACRUM 0:119624335925 522 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 523 break;
MACRUM 0:119624335925 524
MACRUM 0:119624335925 525 /*Read energy on the channel*/
MACRUM 0:119624335925 526 case PHY_EXTENSION_READ_CHANNEL_ENERGY:
MACRUM 0:119624335925 527 // TODO: *data_ptr = rf_get_channel_energy();
MACRUM 0:119624335925 528 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 529 *data_ptr = (int8_t)rf_device->get_last_rssi_dbm();
MACRUM 0:119624335925 530 break;
MACRUM 0:119624335925 531
MACRUM 0:119624335925 532 /*Read status of the link*/
MACRUM 0:119624335925 533 case PHY_EXTENSION_READ_LINK_STATUS:
MACRUM 0:119624335925 534 // TODO: *data_ptr = rf_get_link_status();
MACRUM 0:119624335925 535 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 536 *data_ptr = rf_device->get_last_sqi(); // use SQI as link quality
MACRUM 0:119624335925 537 break;
MACRUM 0:119624335925 538
MACRUM 0:119624335925 539 default:
MACRUM 0:119624335925 540 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 541 break;
MACRUM 0:119624335925 542 }
MACRUM 0:119624335925 543 return 0;
MACRUM 0:119624335925 544 }
MACRUM 0:119624335925 545
MACRUM 0:119624335925 546 static inline void rf_set_mac_address(uint8_t *ptr) {
MACRUM 0:119624335925 547 tr_debug("%s (%d), adr0=%x, adr1=%x, adr2=%x, adr3=%x, adr4=%x, adr5=%x, adr6=%x, adr7=%x",
MACRUM 0:119624335925 548 __func__, __LINE__,
MACRUM 0:119624335925 549 ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]);
MACRUM 0:119624335925 550 for(int i = 0; i < 8; i++) {
MACRUM 0:119624335925 551 stored_mac_address[i] = ptr[i];
MACRUM 0:119624335925 552 }
MACRUM 0:119624335925 553 }
MACRUM 0:119624335925 554
MACRUM 0:119624335925 555 static inline void rf_get_mac_address(uint8_t *ptr) {
MACRUM 0:119624335925 556 for(int i = 0; i < 8; i++) {
MACRUM 0:119624335925 557 ptr[i] = stored_mac_address[i];
MACRUM 0:119624335925 558 }
MACRUM 0:119624335925 559 tr_debug("%s (%d), adr0=%x, adr1=%x, adr2=%x, adr3=%x, adr4=%x, adr5=%x, adr6=%x, adr7=%x",
MACRUM 0:119624335925 560 __func__, __LINE__,
MACRUM 0:119624335925 561 ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]);
MACRUM 0:119624335925 562 }
MACRUM 0:119624335925 563
MACRUM 0:119624335925 564 static inline void rf_set_short_adr(uint8_t *ptr) {
MACRUM 0:119624335925 565 stored_short_adr = (ptr[0] << 8) + ptr[1]; // big-endian
MACRUM 0:119624335925 566 tr_debug("%s (%d), adr0=%x, adr1=%x, val=%d",
MACRUM 0:119624335925 567 __func__, __LINE__,
MACRUM 0:119624335925 568 ptr[0], ptr[1], stored_short_adr);
MACRUM 0:119624335925 569 }
MACRUM 0:119624335925 570
MACRUM 0:119624335925 571 static inline void rf_set_pan_id(uint8_t *ptr) {
MACRUM 0:119624335925 572 stored_pan_id = (ptr[0] << 8) + ptr[1]; // big-endian
MACRUM 0:119624335925 573 tr_debug("%s (%d), adr0=%x, adr1=%x, val=%d",
MACRUM 0:119624335925 574 __func__, __LINE__,
MACRUM 0:119624335925 575 ptr[0], ptr[1], stored_pan_id);
MACRUM 0:119624335925 576 }
MACRUM 0:119624335925 577
MACRUM 0:119624335925 578 static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address_ptr)
MACRUM 0:119624335925 579 {
MACRUM 0:119624335925 580 switch (address_type)
MACRUM 0:119624335925 581 {
MACRUM 0:119624335925 582 /*Set 48-bit address*/
MACRUM 0:119624335925 583 case PHY_MAC_48BIT:
MACRUM 0:119624335925 584 /* Not used in this example */
MACRUM 0:119624335925 585 // betzw - WAS: rf_set_mac_48bit(address_ptr);
MACRUM 0:119624335925 586 break;
MACRUM 0:119624335925 587 /*Set 64-bit address*/
MACRUM 0:119624335925 588 case PHY_MAC_64BIT:
MACRUM 0:119624335925 589 rf_set_mac_address(address_ptr);
MACRUM 0:119624335925 590 break;
MACRUM 0:119624335925 591 /*Set 16-bit address*/
MACRUM 0:119624335925 592 case PHY_MAC_16BIT:
MACRUM 0:119624335925 593 rf_set_short_adr(address_ptr);
MACRUM 0:119624335925 594 break;
MACRUM 0:119624335925 595 /*Set PAN Id*/
MACRUM 0:119624335925 596 case PHY_MAC_PANID:
MACRUM 0:119624335925 597 rf_set_pan_id(address_ptr);
MACRUM 0:119624335925 598 break;
MACRUM 0:119624335925 599 }
MACRUM 0:119624335925 600
MACRUM 0:119624335925 601 return 0;
MACRUM 0:119624335925 602 }
MACRUM 0:119624335925 603
MACRUM 0:119624335925 604 static void rf_ack_loop(void) {
MACRUM 0:119624335925 605 static uint16_t buffer[2] = {
MACRUM 0:119624335925 606 (FC_ACK_FRAME << MAC_FCF_FRAME_TYPE_SHIFT),
MACRUM 0:119624335925 607 0x0
MACRUM 0:119624335925 608 };
MACRUM 0:119624335925 609
MACRUM 0:119624335925 610 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 611
MACRUM 0:119624335925 612 do {
MACRUM 0:119624335925 613 /* Wait for signal */
MACRUM 0:119624335925 614 osEvent event = rf_ack_sender.signal_wait(0);
MACRUM 0:119624335925 615
MACRUM 0:119624335925 616 if(event.status != osEventSignal) {
MACRUM 0:119624335925 617 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 618 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 619 #endif
MACRUM 0:119624335925 620 continue;
MACRUM 0:119624335925 621 }
MACRUM 0:119624335925 622
MACRUM 0:119624335925 623 int32_t signals = event.value.signals;
MACRUM 0:119624335925 624
MACRUM 0:119624335925 625 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 626 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 627 #endif
MACRUM 0:119624335925 628
MACRUM 0:119624335925 629 /* Get Lock */
MACRUM 0:119624335925 630 rf_if_lock();
MACRUM 0:119624335925 631
MACRUM 0:119624335925 632 if(signals & RF_SIG_ACK_NEEDED) {
MACRUM 0:119624335925 633 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 634 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 635 #endif
MACRUM 0:119624335925 636
MACRUM 0:119624335925 637 /* Prepare payload */
MACRUM 0:119624335925 638 uint8_t *ptr = (uint8_t*)&buffer[1];
MACRUM 0:119624335925 639 ptr[0] = rf_rx_sequence; // Sequence number
MACRUM 0:119624335925 640
MACRUM 0:119624335925 641 /* Wait for device not receiving */
MACRUM 0:119624335925 642 while(rf_device->is_receiving()) {
MACRUM 0:119624335925 643 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 644 tr_info("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 645 #endif
MACRUM 0:119624335925 646 wait_us(10);
MACRUM 0:119624335925 647 }
MACRUM 0:119624335925 648
MACRUM 0:119624335925 649 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 650 tr_debug("%s (%d), hdr=%x, nr=%x", __func__, __LINE__, buffer[0], ptr[0]);
MACRUM 0:119624335925 651 #endif
MACRUM 0:119624335925 652
MACRUM 0:119624335925 653 /* Set information that we have sent an ACK */
MACRUM 0:119624335925 654 rf_ack_sent = true;
MACRUM 0:119624335925 655
MACRUM 0:119624335925 656 /*Send the packet*/
MACRUM 0:119624335925 657 rf_device->send((uint8_t*)buffer, 3, false);
MACRUM 0:119624335925 658
MACRUM 0:119624335925 659 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 660 tr_debug("%s (%d), hdr=%x, nr=%x", __func__, __LINE__, buffer[0], ptr[0]);
MACRUM 0:119624335925 661 #endif
MACRUM 0:119624335925 662 }
MACRUM 0:119624335925 663
MACRUM 0:119624335925 664 if(signals & RF_SIG_CB_TX_DONE) {
MACRUM 0:119624335925 665 device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, phy_status,
MACRUM 0:119624335925 666 (phy_status == PHY_LINK_CCA_FAIL) ? 0xFF : 0, 0);
MACRUM 0:119624335925 667 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 668 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 669 #endif
MACRUM 0:119624335925 670 }
MACRUM 0:119624335925 671
MACRUM 0:119624335925 672 if(signals & RF_SIG_CB_RX_RCVD) {
MACRUM 0:119624335925 673 device_driver.phy_rx_cb(rf_rx_buf, rf_buffer_len, rf_sqi, rf_rssi, rf_radio_driver_id);
MACRUM 0:119624335925 674 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 675 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 676 #endif
MACRUM 0:119624335925 677 }
MACRUM 0:119624335925 678
MACRUM 0:119624335925 679 /* Release Lock */
MACRUM 0:119624335925 680 rf_if_unlock();
MACRUM 0:119624335925 681
MACRUM 0:119624335925 682 #ifdef HEAVY_TRACING
MACRUM 0:119624335925 683 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 684 #endif
MACRUM 0:119624335925 685 } while(true);
MACRUM 0:119624335925 686 }
MACRUM 0:119624335925 687
MACRUM 0:119624335925 688 void NanostackRfPhySpirit1::rf_init(void) {
MACRUM 0:119624335925 689 #ifndef NDEBUG
MACRUM 0:119624335925 690 osStatus ret;
MACRUM 0:119624335925 691 #endif
MACRUM 0:119624335925 692
MACRUM 0:119624335925 693 if(rf_device == NULL) {
MACRUM 0:119624335925 694 rf_device = &SimpleSpirit1::CreateInstance(_spi_mosi, _spi_miso, _spi_sclk, _dev_irq, _dev_cs, _dev_sdn, _brd_led);
MACRUM 0:119624335925 695 rf_device->attach_irq_callback(rf_callback_func);
MACRUM 0:119624335925 696
MACRUM 0:119624335925 697 #ifndef NDEBUG
MACRUM 0:119624335925 698 ret =
MACRUM 0:119624335925 699 #endif
MACRUM 0:119624335925 700 rf_ack_sender.start(rf_ack_loop);
MACRUM 0:119624335925 701
MACRUM 0:119624335925 702 #ifndef NDEBUG
MACRUM 0:119624335925 703 debug_if(!(ret == osOK), "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__);
MACRUM 0:119624335925 704 #endif
MACRUM 0:119624335925 705 }
MACRUM 0:119624335925 706 }
MACRUM 0:119624335925 707
MACRUM 0:119624335925 708 NanostackRfPhySpirit1::NanostackRfPhySpirit1(PinName spi_mosi, PinName spi_miso, PinName spi_sclk,
MACRUM 0:119624335925 709 PinName dev_irq, PinName dev_cs, PinName dev_sdn, PinName brd_led) :
MACRUM 0:119624335925 710 _spi_mosi(spi_mosi),
MACRUM 0:119624335925 711 _spi_miso(spi_miso),
MACRUM 0:119624335925 712 _spi_sclk(spi_sclk),
MACRUM 0:119624335925 713 _dev_irq(dev_irq),
MACRUM 0:119624335925 714 _dev_cs(dev_cs),
MACRUM 0:119624335925 715 _dev_sdn(dev_sdn),
MACRUM 0:119624335925 716 _brd_led(brd_led)
MACRUM 0:119624335925 717 {
MACRUM 0:119624335925 718 /* Nothing to do */
MACRUM 0:119624335925 719 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 720 }
MACRUM 0:119624335925 721
MACRUM 0:119624335925 722 NanostackRfPhySpirit1::~NanostackRfPhySpirit1()
MACRUM 0:119624335925 723 {
MACRUM 0:119624335925 724 /* Nothing to do */
MACRUM 0:119624335925 725 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 726 }
MACRUM 0:119624335925 727
MACRUM 0:119624335925 728 int8_t NanostackRfPhySpirit1::rf_register()
MACRUM 0:119624335925 729 {
MACRUM 0:119624335925 730 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 731
MACRUM 0:119624335925 732 /* Get Lock */
MACRUM 0:119624335925 733 rf_if_lock();
MACRUM 0:119624335925 734
MACRUM 0:119624335925 735 /* Do some initialization */
MACRUM 0:119624335925 736 rf_init();
MACRUM 0:119624335925 737
MACRUM 0:119624335925 738 /* Set pointer to MAC address */
MACRUM 0:119624335925 739 device_driver.PHY_MAC = stored_mac_address;
MACRUM 0:119624335925 740
MACRUM 0:119624335925 741 /* Set driver Name */
MACRUM 0:119624335925 742 device_driver.driver_description = (char*)"Spirit1 Sub-GHz RF";
MACRUM 0:119624335925 743
MACRUM 0:119624335925 744 /*Type of RF PHY is SubGHz*/
MACRUM 0:119624335925 745 device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE;
MACRUM 0:119624335925 746
MACRUM 0:119624335925 747 /*Maximum size of payload*/
MACRUM 0:119624335925 748 device_driver.phy_MTU = MAX_PACKET_LEN;
MACRUM 0:119624335925 749
MACRUM 0:119624335925 750 /*No header in PHY*/
MACRUM 0:119624335925 751 device_driver.phy_header_length = 0;
MACRUM 0:119624335925 752
MACRUM 0:119624335925 753 /*No tail in PHY*/
MACRUM 0:119624335925 754 device_driver.phy_tail_length = 0;
MACRUM 0:119624335925 755
MACRUM 0:119624335925 756 /*Set up driver functions*/
MACRUM 0:119624335925 757 device_driver.address_write = &rf_address_write;
MACRUM 0:119624335925 758 device_driver.extension = &rf_extension;
MACRUM 0:119624335925 759 device_driver.state_control = &rf_interface_state_control;
MACRUM 0:119624335925 760 device_driver.tx = &rf_trigger_send;
MACRUM 0:119624335925 761
MACRUM 0:119624335925 762 /*Set supported channel pages*/
MACRUM 0:119624335925 763 device_driver.phy_channel_pages = phy_channel_pages;
MACRUM 0:119624335925 764
MACRUM 0:119624335925 765 //Nullify rx/tx callbacks
MACRUM 0:119624335925 766 device_driver.phy_rx_cb = NULL;
MACRUM 0:119624335925 767 device_driver.phy_tx_done_cb = NULL;
MACRUM 0:119624335925 768 device_driver.arm_net_virtual_rx_cb = NULL;
MACRUM 0:119624335925 769 device_driver.arm_net_virtual_tx_cb = NULL;
MACRUM 0:119624335925 770
MACRUM 0:119624335925 771 /*Register device driver*/
MACRUM 0:119624335925 772 rf_radio_driver_id = arm_net_phy_register(&device_driver);
MACRUM 0:119624335925 773
MACRUM 0:119624335925 774 /* Release Lock */
MACRUM 0:119624335925 775 rf_if_unlock();
MACRUM 0:119624335925 776
MACRUM 0:119624335925 777 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 778 return rf_radio_driver_id;
MACRUM 0:119624335925 779 }
MACRUM 0:119624335925 780
MACRUM 0:119624335925 781 void NanostackRfPhySpirit1::rf_unregister()
MACRUM 0:119624335925 782 {
MACRUM 0:119624335925 783 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 784
MACRUM 0:119624335925 785 /* Get Lock */
MACRUM 0:119624335925 786 rf_if_lock();
MACRUM 0:119624335925 787
MACRUM 0:119624335925 788 if (rf_radio_driver_id >= 0) {
MACRUM 0:119624335925 789 arm_net_phy_unregister(rf_radio_driver_id);
MACRUM 0:119624335925 790 rf_radio_driver_id = -1;
MACRUM 0:119624335925 791 }
MACRUM 0:119624335925 792
MACRUM 0:119624335925 793 /* Release Lock */
MACRUM 0:119624335925 794 rf_if_unlock();
MACRUM 0:119624335925 795 }
MACRUM 0:119624335925 796
MACRUM 0:119624335925 797 void NanostackRfPhySpirit1::get_mac_address(uint8_t *mac)
MACRUM 0:119624335925 798 {
MACRUM 0:119624335925 799 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 800
MACRUM 0:119624335925 801 /* Get Lock */
MACRUM 0:119624335925 802 rf_if_lock();
MACRUM 0:119624335925 803
MACRUM 0:119624335925 804 if(rf_radio_driver_id >= 0) {
MACRUM 0:119624335925 805 rf_get_mac_address(mac);
MACRUM 0:119624335925 806 } else {
MACRUM 0:119624335925 807 error("NanostackRfPhySpirit1 must be registered to read mac address");
MACRUM 0:119624335925 808 }
MACRUM 0:119624335925 809
MACRUM 0:119624335925 810 /* Release Lock */
MACRUM 0:119624335925 811 rf_if_unlock();
MACRUM 0:119624335925 812 }
MACRUM 0:119624335925 813
MACRUM 0:119624335925 814 void NanostackRfPhySpirit1::set_mac_address(uint8_t *mac)
MACRUM 0:119624335925 815 {
MACRUM 0:119624335925 816 tr_debug("%s (%d)", __func__, __LINE__);
MACRUM 0:119624335925 817
MACRUM 0:119624335925 818 /* Get Lock */
MACRUM 0:119624335925 819 rf_if_lock();
MACRUM 0:119624335925 820
MACRUM 0:119624335925 821 if(rf_radio_driver_id < 0) {
MACRUM 0:119624335925 822 rf_set_mac_address(mac);
MACRUM 0:119624335925 823 } else {
MACRUM 0:119624335925 824 error("NanostackRfPhySpirit1 cannot change mac address when running");
MACRUM 0:119624335925 825 }
MACRUM 0:119624335925 826
MACRUM 0:119624335925 827 /* Release Lock */
MACRUM 0:119624335925 828 rf_if_unlock();
MACRUM 0:119624335925 829 }
MACRUM 0:119624335925 830
MACRUM 0:119624335925 831 #endif /* MBED_CONF_RTOS_PRESENT */
MACRUM 0:119624335925 832 #endif /* MBED_CONF_NANOSTACK_CONFIGURATION */