Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers NanostackRfPhyAtmel.cpp Source File

NanostackRfPhyAtmel.cpp

00001 /*
00002  * Copyright (c) 2014-2015 ARM Limited. All rights reserved.
00003  * SPDX-License-Identifier: Apache-2.0
00004  * Licensed under the Apache License, Version 2.0 (the License); you may
00005  * not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  * http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
00012  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 #include <string.h>
00017 
00018 #ifdef MBED_CONF_NANOSTACK_CONFIGURATION
00019 
00020 #include "platform/arm_hal_interrupt.h"
00021 #include "nanostack/platform/arm_hal_phy.h"
00022 #include "ns_types.h"
00023 #include "NanostackRfPhyAtmel.h"
00024 #include "randLIB.h"
00025 #include "AT86RFReg.h"
00026 #include "nanostack/platform/arm_hal_phy.h"
00027 #include "mbed_trace.h"
00028 #include "mbed_toolchain.h"
00029 
00030 #define TRACE_GROUP "AtRF"
00031 
00032 /*Worst case sensitivity*/
00033 #define RF_DEFAULT_SENSITIVITY -88
00034 /*Run calibration every 5 minutes*/
00035 #define RF_CALIBRATION_INTERVAL 6000000
00036 /*Wait ACK for 2.5ms*/
00037 #define RF_ACK_WAIT_DEFAULT_TIMEOUT 50
00038 /*Base CCA backoff (50us units) - substitutes for Inter-Frame Spacing*/
00039 #define RF_CCA_BASE_BACKOFF 13 /* 650us */
00040 /*CCA random backoff (50us units)*/
00041 #define RF_CCA_RANDOM_BACKOFF 51 /* 2550us */
00042 
00043 #define RF_MTU 127
00044 
00045 #define RF_PHY_MODE OQPSK_SIN_250
00046 
00047 /*Radio RX and TX state definitions*/
00048 #define RFF_ON 0x01
00049 #define RFF_RX 0x02
00050 #define RFF_TX 0x04
00051 #define RFF_CCA 0x08
00052 
00053 typedef enum
00054 {
00055     RF_MODE_NORMAL = 0,
00056     RF_MODE_SNIFFER = 1,
00057     RF_MODE_ED = 2
00058 }rf_mode_t;
00059 
00060 /*Atmel RF Part Type*/
00061 typedef enum
00062 {
00063     ATMEL_UNKNOW_DEV = 0,
00064     ATMEL_AT86RF212,
00065     ATMEL_AT86RF231, // No longer supported (doesn't give ED+status on frame read)
00066     ATMEL_AT86RF233
00067 }rf_trx_part_e;
00068 
00069 /*Atmel RF states*/
00070 typedef enum
00071 {
00072     NOP = 0x00,
00073     BUSY_RX = 0x01,
00074     BUSY_TX = 0x02,
00075     RF_TX_START = 0x02,
00076     FORCE_TRX_OFF = 0x03,
00077     FORCE_PLL_ON = 0x04,
00078     RX_ON = 0x06,
00079     TRX_OFF = 0x08,
00080     PLL_ON = 0x09,
00081     BUSY_RX_AACK = 0x11,
00082     SLEEP = 0x0F,
00083     RX_AACK_ON = 0x16,
00084     TX_ARET_ON = 0x19,
00085     STATE_TRANSITION_IN_PROGRESS = 0x1F
00086 }rf_trx_states_t;
00087 
00088 static const uint8_t *rf_tx_data; // Points to Nanostack's buffer
00089 static uint8_t rf_tx_length;
00090 /*ACK wait duration changes depending on data rate*/
00091 static uint16_t rf_ack_wait_duration = RF_ACK_WAIT_DEFAULT_TIMEOUT;
00092 
00093 static int8_t rf_sensitivity = RF_DEFAULT_SENSITIVITY;
00094 static rf_mode_t rf_mode = RF_MODE_NORMAL;
00095 static uint8_t radio_tx_power = 0x00;   // Default to +4dBm
00096 static uint8_t rf_phy_channel = 12;
00097 static uint8_t rf_tuned = 1;
00098 static uint8_t rf_use_antenna_diversity = 0;
00099 static int16_t expected_ack_sequence = -1;
00100 static uint8_t rf_rx_mode = 0;
00101 static uint8_t rf_flags = 0;
00102 static int8_t rf_radio_driver_id = -1;
00103 static phy_device_driver_s device_driver;
00104 static uint8_t mac_tx_handle = 0;
00105 static uint8_t xah_ctrl_1;
00106 
00107 /* Channel configurations for 2.4 and sub-GHz */
00108 static const phy_rf_channel_configuration_s phy_24ghz = {2405000000U, 5000000U, 250000U, 16U, M_OQPSK};
00109 static const phy_rf_channel_configuration_s phy_subghz = {868300000U, 2000000U, 250000U, 11U, M_OQPSK};
00110 
00111 static const phy_device_channel_page_s phy_channel_pages[] = {
00112         { CHANNEL_PAGE_0, &phy_24ghz},
00113         { CHANNEL_PAGE_2, &phy_subghz},
00114         { CHANNEL_PAGE_0, NULL}
00115 };
00116 
00117 /**
00118  *  RF output power write
00119  *
00120  * \brief TX power has to be set before network start.
00121  *
00122  * \param power
00123  *              AT86RF233
00124  *              0 = 4 dBm
00125  *              1 = 3.7 dBm
00126  *              2 = 3.4 dBm
00127  *              3 = 3 dBm
00128  *              4 = 2.5 dBm
00129  *              5 = 2 dBm
00130  *              6 = 1 dBm
00131  *              7 = 0 dBm
00132  *              8 = -1 dBm
00133  *              9 = -2 dBm
00134  *              10 = -3 dBm
00135  *              11 = -4 dBm
00136  *              12 = -6 dBm
00137  *              13 = -8 dBm
00138  *              14 = -12 dBm
00139  *              15 = -17 dBm
00140  *
00141  *              AT86RF212B
00142  *              See datasheet for TX power settings
00143  *
00144  * \return 0, Supported Value
00145  * \return -1, Not Supported Value
00146  */
00147 static int8_t rf_tx_power_set(uint8_t power);
00148 static rf_trx_part_e rf_radio_type_read(void);
00149 static void rf_ack_wait_timer_start(uint16_t slots);
00150 static void rf_ack_wait_timer_stop(void);
00151 static void rf_handle_cca_ed_done(uint8_t full_trx_status);
00152 static void rf_handle_tx_end(rf_trx_states_t trx_status);
00153 static void rf_handle_rx_end(rf_trx_states_t trx_status);
00154 static void rf_on(void);
00155 static void rf_give_up_on_ack(void);
00156 static void rf_receive(rf_trx_states_t trx_status = STATE_TRANSITION_IN_PROGRESS);
00157 static rf_trx_states_t rf_poll_trx_state_change(rf_trx_states_t trx_state);
00158 static void rf_init(void);
00159 static int8_t rf_device_register(const uint8_t *mac_addr);
00160 static void rf_device_unregister(void);
00161 static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol );
00162 static void rf_cca_abort(void);
00163 static void rf_calibration_cb(void);
00164 static void rf_init_phy_mode(void);
00165 static void rf_ack_wait_timer_interrupt(void);
00166 static void rf_calibration_timer_interrupt(void);
00167 static void rf_calibration_timer_start(uint32_t slots);
00168 static void rf_cca_timer_interrupt(void);
00169 static void rf_cca_timer_start(uint32_t slots);
00170 static uint8_t rf_scale_lqi(int8_t rssi);
00171 
00172 static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel);
00173 static int8_t rf_extension(phy_extension_type_e extension_type,uint8_t *data_ptr);
00174 static int8_t rf_address_write(phy_address_type_e address_type,uint8_t *address_ptr);
00175 
00176 static void rf_if_cca_timer_start(uint32_t slots);
00177 static void rf_if_enable_promiscuous_mode(void);
00178 static void rf_if_lock(void);
00179 static void rf_if_unlock(void);
00180 static uint8_t rf_if_read_rnd(void);
00181 static void rf_if_calibration_timer_start(uint32_t slots);
00182 static void rf_if_interrupt_handler(void);
00183 static void rf_if_ack_wait_timer_start(uint16_t slots);
00184 static void rf_if_ack_wait_timer_stop(void);
00185 static void rf_if_ack_pending_ctrl(uint8_t state);
00186 static void rf_if_calibration(void);
00187 static uint8_t rf_if_read_register(uint8_t addr);
00188 static void rf_if_set_bit(uint8_t addr, uint8_t bit, uint8_t bit_mask);
00189 static void rf_if_clear_bit(uint8_t addr, uint8_t bit);
00190 static void rf_if_write_register(uint8_t addr, uint8_t data);
00191 static void rf_if_reset_radio(void);
00192 static void rf_if_enable_ant_div(void);
00193 static void rf_if_disable_ant_div(void);
00194 static void rf_if_enable_slptr(void);
00195 static void rf_if_disable_slptr(void);
00196 static void rf_if_write_antenna_diversity_settings(void);
00197 static void rf_if_write_set_tx_power_register(uint8_t value);
00198 static void rf_if_write_rf_settings(void);
00199 static rf_trx_states_t rf_if_read_trx_state(void);
00200 static uint16_t rf_if_read_packet(uint8_t data[RF_MTU], uint8_t *lqi_out, uint8_t *ed_out, bool *crc_good);
00201 static void rf_if_write_short_addr_registers(uint8_t *short_address);
00202 static uint8_t rf_if_last_acked_pending(void);
00203 static void rf_if_write_pan_id_registers(uint8_t *pan_id);
00204 static void rf_if_write_ieee_addr_registers(uint8_t *address);
00205 static void rf_if_write_frame_buffer(const uint8_t *ptr, uint8_t length);
00206 static rf_trx_states_t rf_if_change_trx_state(rf_trx_states_t trx_state);
00207 static void rf_if_start_cca_process(void);
00208 static int8_t rf_if_scale_rssi(uint8_t ed_level);
00209 static void rf_if_set_channel_register(uint8_t channel);
00210 static void rf_if_enable_promiscuous_mode(void);
00211 static void rf_if_disable_promiscuous_mode(void);
00212 static uint8_t rf_if_read_part_num(void);
00213 static void rf_if_enable_irq(void);
00214 static void rf_if_disable_irq(void);
00215 static void rf_if_spi_exchange_n(const void *tx, size_t tx_len, void *rx, size_t rx_len);
00216 
00217 static inline rf_trx_states_t rf_if_trx_status_from_full(uint8_t full_trx_status)
00218 {
00219     return (rf_trx_states_t) (full_trx_status & 0x1F);
00220 }
00221 
00222 #ifdef MBED_CONF_RTOS_PRESENT
00223 #include "mbed.h"
00224 #include "rtos.h"
00225 
00226 static void rf_if_irq_task_process_irq();
00227 
00228 #define SIG_RADIO       1
00229 #define SIG_TIMER_ACK   2
00230 #define SIG_TIMER_CAL   4
00231 #define SIG_TIMER_CCA   8
00232 
00233 #define SIG_TIMERS (SIG_TIMER_ACK|SIG_TIMER_CAL|SIG_TIMER_CCA)
00234 #define SIG_ALL (SIG_RADIO|SIG_TIMERS)
00235 #endif
00236 
00237 // HW pins to RF chip
00238 
00239 class UnlockedSPI : public SPI {
00240 public:
00241     UnlockedSPI(PinName mosi, PinName miso, PinName sclk) :
00242         SPI(mosi, miso, sclk) { }
00243     virtual void lock() { }
00244     virtual void unlock() { }
00245 };
00246 
00247 class RFBits {
00248 public:
00249     RFBits(PinName spi_mosi, PinName spi_miso,
00250            PinName spi_sclk, PinName spi_cs,
00251            PinName spi_rst, PinName spi_slp, PinName spi_irq);
00252     UnlockedSPI spi;
00253     DigitalOut CS;
00254     DigitalOut RST;
00255     DigitalOut SLP_TR;
00256     InterruptIn IRQ;
00257     Timeout ack_timer;
00258     Timeout cal_timer;
00259     Timeout cca_timer;
00260 #ifdef MBED_CONF_RTOS_PRESENT
00261     Thread irq_thread;
00262     Mutex mutex;
00263     void rf_if_irq_task();
00264 #endif
00265 };
00266 
00267 RFBits::RFBits(PinName spi_mosi, PinName spi_miso,
00268                PinName spi_sclk, PinName spi_cs,
00269                PinName spi_rst, PinName spi_slp, PinName spi_irq)
00270     :   spi(spi_mosi, spi_miso, spi_sclk),
00271         CS(spi_cs),
00272         RST(spi_rst),
00273         SLP_TR(spi_slp),
00274         IRQ(spi_irq)
00275 #ifdef MBED_CONF_RTOS_PRESENT
00276 ,irq_thread(osPriorityRealtime, 1024)
00277 #endif
00278 {
00279 #ifdef MBED_CONF_RTOS_PRESENT
00280     irq_thread.start(mbed::callback(this, &RFBits::rf_if_irq_task));
00281 #endif
00282 }
00283 
00284 static RFBits *rf;
00285 static uint8_t rf_part_num = 0;
00286 /*TODO: RSSI Base value setting*/
00287 static int8_t rf_rssi_base_val = -91;
00288 
00289 static void rf_if_lock(void)
00290 {
00291     platform_enter_critical();
00292 }
00293 
00294 static void rf_if_unlock(void)
00295 {
00296     platform_exit_critical();
00297 }
00298 
00299 #ifdef MBED_CONF_RTOS_PRESENT
00300 static void rf_if_cca_timer_signal(void)
00301 {
00302     rf->irq_thread.signal_set(SIG_TIMER_CCA);
00303 }
00304 
00305 static void rf_if_cal_timer_signal(void)
00306 {
00307     rf->irq_thread.signal_set(SIG_TIMER_CAL);
00308 }
00309 
00310 static void rf_if_ack_timer_signal(void)
00311 {
00312     rf->irq_thread.signal_set(SIG_TIMER_ACK);
00313 }
00314 #endif
00315 
00316 
00317 /* Delay functions for RF Chip SPI access */
00318 #ifdef __CC_ARM
00319 __asm static void delay_loop(uint32_t count)
00320 {
00321 1
00322   SUBS a1, a1, #1
00323   BCS  %BT1
00324   BX   lr
00325 }
00326 #elif defined (__ICCARM__)
00327 static void delay_loop(uint32_t count)
00328 {
00329   __asm volatile(
00330     "loop: \n"
00331     " SUBS %0, %0, #1 \n"
00332     " BCS.n  loop\n"
00333     : "+r" (count)
00334     :
00335     : "cc"
00336   );
00337 }
00338 #else // GCC
00339 static void delay_loop(uint32_t count)
00340 {
00341   __asm__ volatile (
00342     "%=:\n\t"
00343 #if defined(__thumb__) && !defined(__thumb2__)
00344     "SUB  %0, #1\n\t"
00345 #else
00346     "SUBS %0, %0, #1\n\t"
00347 #endif
00348     "BCS  %=b\n\t"
00349     : "+l" (count)
00350     :
00351     : "cc"
00352   );
00353 }
00354 #endif
00355 
00356 static void delay_ns(uint32_t ns)
00357 {
00358   uint32_t cycles_per_us = SystemCoreClock / 1000000;
00359   // Cortex-M0 takes 4 cycles per loop (SUB=1, BCS=3)
00360   // Cortex-M3 and M4 takes 3 cycles per loop (SUB=1, BCS=2)
00361   // Cortex-M7 - who knows?
00362   // Cortex M3-M7 have "CYCCNT" - would be better than a software loop, but M0 doesn't
00363   // Assume 3 cycles per loop for now - will be 33% slow on M0. No biggie,
00364   // as original version of code was 300% slow on M4.
00365   // [Note that this very calculation, plus call overhead, will take multiple
00366   // cycles. Could well be 100ns on its own... So round down here, startup is
00367   // worth at least one loop iteration.]
00368   uint32_t count = (cycles_per_us * ns) / 3000;
00369 
00370   delay_loop(count);
00371 }
00372 
00373 // t1 = 180ns, SEL falling edge to MISO active [SPI setup assumed slow enough to not need manual delay]
00374 #define CS_SELECT()  {rf->CS = 0; /* delay_ns(180); */}
00375  // t9 = 250ns, last clock to SEL rising edge, t8 = 250ns, SPI idle time between consecutive access
00376 #define CS_RELEASE() {delay_ns(250); rf->CS = 1; delay_ns(250);}
00377 
00378 /*
00379  * \brief Function sets the TX power variable.
00380  *
00381  * \param power TX power setting
00382  *
00383  * \return 0 Success
00384  * \return -1 Fail
00385  */
00386 MBED_UNUSED static int8_t rf_tx_power_set(uint8_t power)
00387 {
00388     int8_t ret_val = -1;
00389 
00390     radio_tx_power = power;
00391     rf_if_lock();
00392     rf_if_write_set_tx_power_register(radio_tx_power);
00393     rf_if_unlock();
00394     ret_val = 0;
00395 
00396     return ret_val;
00397 }
00398 
00399 /*
00400  * \brief Read connected radio part.
00401  *
00402  * This function only return valid information when rf_init() is called
00403  *
00404  * \return
00405  */
00406 static rf_trx_part_e rf_radio_type_read(void)
00407 {
00408   rf_trx_part_e ret_val = ATMEL_UNKNOW_DEV;
00409 
00410   switch (rf_part_num)
00411   {
00412     case PART_AT86RF212:
00413       ret_val = ATMEL_AT86RF212;
00414       break;
00415     case PART_AT86RF233:
00416       ret_val = ATMEL_AT86RF233;
00417       break;
00418     default:
00419       break;
00420   }
00421 
00422   return ret_val;
00423 }
00424 
00425 
00426 /*
00427  * \brief Function starts the ACK wait timeout.
00428  *
00429  * \param slots Given slots, resolution 50us
00430  *
00431  * \return none
00432  */
00433 static void rf_if_ack_wait_timer_start(uint16_t slots)
00434 {
00435 #ifdef MBED_CONF_RTOS_PRESENT
00436   rf->ack_timer.attach_us(rf_if_ack_timer_signal, slots*50);
00437 #else
00438   rf->ack_timer.attach_us(rf_ack_wait_timer_interrupt, slots*50);
00439 #endif
00440 }
00441 
00442 /*
00443  * \brief Function starts the calibration interval.
00444  *
00445  * \param slots Given slots, resolution 50us
00446  *
00447  * \return none
00448  */
00449 static void rf_if_calibration_timer_start(uint32_t slots)
00450 {
00451 #ifdef MBED_CONF_RTOS_PRESENT
00452   rf->cal_timer.attach_us(rf_if_cal_timer_signal, slots*50);
00453 #else
00454   rf->cal_timer.attach_us(rf_calibration_timer_interrupt, slots*50);
00455 #endif
00456 }
00457 
00458 /*
00459  * \brief Function starts the CCA interval.
00460  *
00461  * \param slots Given slots, resolution 50us
00462  *
00463  * \return none
00464  */
00465 static void rf_if_cca_timer_start(uint32_t slots)
00466 {
00467 #ifdef MBED_CONF_RTOS_PRESENT
00468   rf->cca_timer.attach_us(rf_if_cca_timer_signal, slots*50);
00469 #else
00470   rf->cca_timer.attach_us(rf_cca_timer_interrupt, slots*50);
00471 #endif
00472 }
00473 
00474 /*
00475  * \brief Function stops the CCA interval.
00476  *
00477  * \return none
00478  */
00479 static void rf_if_cca_timer_stop(void)
00480 {
00481   rf->cca_timer.detach();
00482 }
00483 
00484 /*
00485  * \brief Function stops the ACK wait timeout.
00486  *
00487  * \param none
00488  *
00489  * \return none
00490  */
00491 static void rf_if_ack_wait_timer_stop(void)
00492 {
00493   rf->ack_timer.detach();
00494 }
00495 
00496 /*
00497  * \brief Function sets bit(s) in given RF register.
00498  *
00499  * \param addr Address of the register to set
00500  * \param bit Bit(s) to set
00501  * \param bit_mask Masks the field inside the register
00502  *
00503  * \return none
00504  */
00505 static void rf_if_set_bit(uint8_t addr, uint8_t bit, uint8_t bit_mask)
00506 {
00507   uint8_t reg = rf_if_read_register(addr);
00508   reg &= ~bit_mask;
00509   reg |= bit;
00510   rf_if_write_register(addr, reg);
00511 }
00512 
00513 /*
00514  * \brief Function clears bit(s) in given RF register.
00515  *
00516  * \param addr Address of the register to clear
00517  * \param bit Bit(s) to clear
00518  *
00519  * \return none
00520  */
00521 static void rf_if_clear_bit(uint8_t addr, uint8_t bit)
00522 {
00523   rf_if_set_bit(addr, 0, bit);
00524 }
00525 
00526 /*
00527  * \brief Function writes register in RF.
00528  *
00529  * \param addr Address on the RF
00530  * \param data Written data
00531  *
00532  * \return none
00533  */
00534 static void rf_if_write_register(uint8_t addr, uint8_t data)
00535 {
00536   const uint8_t tx[2] = { static_cast<uint8_t>(0xC0 | addr), data };
00537   uint8_t rx[2];
00538   CS_SELECT();
00539   rf_if_spi_exchange_n(tx, 2, rx, 2);
00540   CS_RELEASE();
00541 }
00542 
00543 /*
00544  * \brief Function reads RF register, and also outputs PHY_STATUS
00545  *
00546  * \param addr Address on the RF
00547  * \param[out] status_out Pointer to store PHY_STATUS
00548  *
00549  * \return Read register data
00550  */
00551 static uint8_t rf_if_read_register_with_status(uint8_t addr, uint8_t *status_out)
00552 {
00553   const uint8_t tx[1] = { static_cast<uint8_t>(0x80 | addr) };
00554   uint8_t rx[2];
00555   CS_SELECT();
00556   rf_if_spi_exchange_n(tx, 1, rx, 2);
00557   CS_RELEASE();
00558   if (status_out) {
00559       *status_out = rx[0];
00560   }
00561   return rx[1];
00562 }
00563 
00564 /*
00565  * \brief Function reads RF register.
00566  *
00567  * \param addr Address on the RF
00568  *
00569  * \return Read register data
00570  */
00571 static uint8_t rf_if_read_register(uint8_t addr)
00572 {
00573   return rf_if_read_register_with_status(addr, NULL);
00574 }
00575 
00576 /*
00577  * \brief Function resets the RF.
00578  *
00579  * \param none
00580  *
00581  * \return none
00582  */
00583 static void rf_if_reset_radio(void)
00584 {
00585 #if MBED_CONF_ATMEL_RF_USE_SPI_SPACING_API
00586   rf->spi.frequency(MBED_CONF_ATMEL_RF_FULL_SPI_SPEED);
00587   int spacing = rf->spi.write_spacing(MBED_CONF_ATMEL_RF_FULL_SPI_SPEED_BYTE_SPACING);
00588   if (spacing < MBED_CONF_ATMEL_RF_FULL_SPI_SPEED_BYTE_SPACING) {
00589       rf->spi.frequency(MBED_CONF_ATMEL_RF_LOW_SPI_SPEED);
00590       rf->spi.write_spacing(0);
00591   }
00592 #elif MBED_CONF_ATMEL_RF_ASSUME_SPACED_SPI
00593   rf->spi.frequency(MBED_CONF_ATMEL_RF_FULL_SPI_SPEED);
00594 #else
00595   rf->spi.frequency(MBED_CONF_ATMEL_RF_LOW_SPI_SPEED);
00596 #endif
00597   rf->IRQ.rise(0);
00598   rf->RST = 1;
00599   wait_ms(1);
00600   rf->RST = 0;
00601   wait_ms(10);
00602   CS_RELEASE();
00603   rf->SLP_TR = 0;
00604   wait_ms(10);
00605   rf->RST = 1;
00606   wait_ms(10);
00607 
00608   rf->IRQ.rise(&rf_if_interrupt_handler);
00609 }
00610 
00611 /*
00612  * \brief Function enables the promiscuous mode.
00613  *
00614  * \param none
00615  *
00616  * \return none
00617  */
00618 static void rf_if_enable_promiscuous_mode(void)
00619 {
00620   if (!(xah_ctrl_1 & AACK_PROM_MODE)) {
00621     /*Set AACK_PROM_MODE to enable the promiscuous mode*/
00622     rf_if_write_register(XAH_CTRL_1, xah_ctrl_1 |= AACK_PROM_MODE);
00623   }
00624 }
00625 
00626 /*
00627  * \brief Function disable the promiscuous mode.
00628  *
00629  * \param none
00630  *
00631  * \return none
00632  */
00633 static void rf_if_disable_promiscuous_mode(void)
00634 {
00635   if (xah_ctrl_1 & AACK_PROM_MODE) {
00636     /*Clear AACK_PROM_MODE to disable the promiscuous mode*/
00637     rf_if_write_register(XAH_CTRL_1, xah_ctrl_1 &= ~AACK_PROM_MODE);
00638   }
00639 }
00640 
00641 /*
00642  * \brief Function enables the Antenna diversity usage.
00643  *
00644  * \param none
00645  *
00646  * \return none
00647  */
00648 static void rf_if_enable_ant_div(void)
00649 {
00650   /*Set ANT_EXT_SW_EN to enable controlling of antenna diversity*/
00651   rf_if_set_bit(ANT_DIV, ANT_EXT_SW_EN, ANT_EXT_SW_EN);
00652 }
00653 
00654 /*
00655  * \brief Function disables the Antenna diversity usage.
00656  *
00657  * \param none
00658  *
00659  * \return none
00660  */
00661 static void rf_if_disable_ant_div(void)
00662 {
00663   rf_if_clear_bit(ANT_DIV, ANT_EXT_SW_EN);
00664 }
00665 
00666 /*
00667  * \brief Function sets the SLP TR pin.
00668  *
00669  * \param none
00670  *
00671  * \return none
00672  */
00673 static void rf_if_enable_slptr(void)
00674 {
00675   rf->SLP_TR = 1;
00676 }
00677 
00678 /*
00679  * \brief Function clears the SLP TR pin.
00680  *
00681  * \param none
00682  *
00683  * \return none
00684  */
00685 static void rf_if_disable_slptr(void)
00686 {
00687   rf->SLP_TR = 0;
00688 }
00689 
00690 /*
00691  * \brief Function writes the antenna diversity settings.
00692  *
00693  * \param none
00694  *
00695  * \return none
00696  */
00697 static void rf_if_write_antenna_diversity_settings(void)
00698 {
00699   /*Recommended setting of PDT_THRES is 3 when antenna diversity is used*/
00700   rf_if_set_bit(RX_CTRL, 0x03, 0x0f);
00701   rf_if_write_register(ANT_DIV, ANT_DIV_EN | ANT_EXT_SW_EN | ANT_CTRL_DEFAULT);
00702 }
00703 
00704 /*
00705  * \brief Function writes the TX output power register.
00706  *
00707  * \param value Given register value
00708  *
00709  * \return none
00710  */
00711 static void rf_if_write_set_tx_power_register(uint8_t value)
00712 {
00713   rf_if_write_register(PHY_TX_PWR, value);
00714 }
00715 
00716 /*
00717  * \brief Function returns the RF part number.
00718  *
00719  * \param none
00720  *
00721  * \return part number
00722  */
00723 static uint8_t rf_if_read_part_num(void)
00724 {
00725   return rf_if_read_register(PART_NUM);
00726 }
00727 
00728 /*
00729  * \brief Function writes the RF settings and initialises SPI interface.
00730  *
00731  * \param none
00732  *
00733  * \return none
00734  */
00735 static void rf_if_write_rf_settings(void)
00736 {
00737   /*Reset RF module*/
00738   rf_if_reset_radio();
00739 
00740   rf_part_num = rf_if_read_part_num();
00741 
00742   rf_if_write_register(XAH_CTRL_0,0);
00743 
00744   /* Auto CRC on, IRQ status shows unmasked only, TRX_STATUS output on all accesses */
00745   rf_if_write_register(TRX_CTRL_1, TX_AUTO_CRC_ON | SPI_CMD_MODE_TRX_STATUS);
00746 
00747   rf_if_write_register(IRQ_MASK, CCA_ED_DONE | TRX_END | TRX_UR);
00748 
00749   xah_ctrl_1 = rf_if_read_register(XAH_CTRL_1);
00750 
00751   /*Read transceiver PART_NUM*/
00752   rf_part_num = rf_if_read_register(PART_NUM);
00753 
00754   /*Sub-GHz RF settings*/
00755   if(rf_part_num == PART_AT86RF212)
00756   {
00757     /*GC_TX_OFFS mode-dependent setting - OQPSK*/
00758     rf_if_write_register(RF_CTRL_0, 0x32);
00759 
00760     if(rf_if_read_register(VERSION_NUM) == VERSION_AT86RF212B)
00761     {
00762       /*TX Output Power setting - 0 dBm North American Band*/
00763       rf_if_write_register(PHY_TX_PWR, 0x03);
00764     }
00765     else
00766     {
00767       /*TX Output Power setting - 0 dBm North American Band*/
00768       rf_if_write_register(PHY_TX_PWR, 0x24);
00769     }
00770 
00771     /*PHY Mode: IEEE 802.15.4-2006/2011 - OQPSK-SIN-250*/
00772     rf_if_write_register(TRX_CTRL_2, RX_SAFE_MODE | RF_PHY_MODE);
00773     /*Based on receiver Characteristics. See AT86RF212B Datasheet where RSSI BASE VALUE in range -97 - -100 dBm*/
00774     rf_rssi_base_val = -98;
00775   }
00776   /*2.4GHz RF settings*/
00777   else
00778   {
00779 #if 0
00780     /* Disable power saving functions for now - can only impact reliability,
00781      * and don't have any users demanding it. */
00782     /*Set RPC register*/
00783     rf_if_write_register(TRX_RPC, RX_RPC_CTRL|RX_RPC_EN|PLL_RPC_EN|XAH_TX_RPC_EN|IPAN_RPC_EN|TRX_RPC_RSVD_1);
00784 #endif
00785     /*PHY Mode: IEEE 802.15.4 - Data Rate 250 kb/s*/
00786     rf_if_write_register(TRX_CTRL_2, RX_SAFE_MODE);
00787     rf_rssi_base_val = -91;
00788   }
00789 }
00790 
00791 /*
00792  * \brief Function returns the RF state
00793  *
00794  * \param none
00795  *
00796  * \return RF state
00797  */
00798 static rf_trx_states_t rf_if_read_trx_state(void)
00799 {
00800   return rf_if_trx_status_from_full(rf_if_read_register(TRX_STATUS));
00801 }
00802 
00803 /*
00804  * \brief Function reads packet buffer.
00805  *
00806  * \param data_out Output buffer
00807  * \param lqi_out LQI output
00808  * \param ed_out ED output
00809  * \param crc_good CRC good indication
00810  *
00811  * \return PSDU length [0..RF_MTU]
00812  */
00813 static uint16_t rf_if_read_packet(uint8_t data_out[RF_MTU], uint8_t *lqi_out, uint8_t *ed_out, bool *crc_good)
00814 {
00815   CS_SELECT();
00816   const uint8_t tx[1] = { 0x20 };
00817   uint8_t rx[3];
00818   rf_if_spi_exchange_n(tx, 1, rx, 2);
00819   uint8_t len = rx[1] & 0x7F;
00820   rf_if_spi_exchange_n(NULL, 0, data_out, len);
00821   rf_if_spi_exchange_n(NULL, 0, rx, 3);
00822   *lqi_out = rx[0];
00823   *ed_out = rx[1];
00824   *crc_good = rx[2] & 0x80;
00825   CS_RELEASE();
00826 
00827   return len;
00828 }
00829 
00830 /*
00831  * \brief Function writes RF short address registers
00832  *
00833  * \param short_address Given short address
00834  *
00835  * \return none
00836  */
00837 static void rf_if_write_short_addr_registers(uint8_t *short_address)
00838 {
00839   rf_if_write_register(SHORT_ADDR_1, *short_address++);
00840   rf_if_write_register(SHORT_ADDR_0, *short_address);
00841 }
00842 
00843 /*
00844  * \brief Function sets the frame pending in ACK message
00845  *
00846  * \param state Given frame pending state
00847  *
00848  * \return none
00849  */
00850 static void rf_if_ack_pending_ctrl(uint8_t state)
00851 {
00852   rf_if_lock();
00853   if(state)
00854   {
00855     rf_if_set_bit(CSMA_SEED_1, (1 << AACK_SET_PD), (1 << AACK_SET_PD));
00856   }
00857   else
00858   {
00859     rf_if_clear_bit(CSMA_SEED_1, (1 << AACK_SET_PD));
00860   }
00861   rf_if_unlock();
00862 }
00863 
00864 /*
00865  * \brief Function returns the state of frame pending control
00866  *
00867  * \param none
00868  *
00869  * \return Frame pending state
00870  */
00871 static uint8_t rf_if_last_acked_pending(void)
00872 {
00873   uint8_t last_acked_data_pending;
00874 
00875   rf_if_lock();
00876   if(rf_if_read_register(CSMA_SEED_1) & (1 << AACK_SET_PD))
00877     last_acked_data_pending = 1;
00878   else
00879     last_acked_data_pending = 0;
00880   rf_if_unlock();
00881 
00882   return last_acked_data_pending;
00883 }
00884 
00885 /*
00886  * \brief Function calibrates the RF part.
00887  *
00888  * \param none
00889  *
00890  * \return none
00891  */
00892 static void rf_if_calibration(void)
00893 {
00894   rf_if_set_bit(FTN_CTRL, FTN_START, FTN_START);
00895   /*Wait while calibration is running*/
00896   while(rf_if_read_register(FTN_CTRL) & FTN_START);
00897 }
00898 
00899 /*
00900  * \brief Function writes RF PAN Id registers
00901  *
00902  * \param pan_id Given PAN Id
00903  *
00904  * \return none
00905  */
00906 static void rf_if_write_pan_id_registers(uint8_t *pan_id)
00907 {
00908   rf_if_write_register(PAN_ID_1, *pan_id++);
00909   rf_if_write_register(PAN_ID_0, *pan_id);
00910 }
00911 
00912 /*
00913  * \brief Function writes RF IEEE Address registers
00914  *
00915  * \param address Given IEEE Address
00916  *
00917  * \return none
00918  */
00919 static void rf_if_write_ieee_addr_registers(uint8_t *address)
00920 {
00921   uint8_t i;
00922   uint8_t temp = IEEE_ADDR_0;
00923 
00924   for(i=0; i<8; i++)
00925     rf_if_write_register(temp++, address[7-i]);
00926 }
00927 
00928 /*
00929  * \brief Function writes data in RF frame buffer.
00930  *
00931  * \param ptr Pointer to data (PSDU, except FCS)
00932  * \param length Pointer to length (PSDU length, minus 2 for FCS)
00933  *
00934  * \return none
00935  */
00936 static void rf_if_write_frame_buffer(const uint8_t *ptr, uint8_t length)
00937 {
00938   const uint8_t cmd[2] = { 0x60, static_cast<uint8_t>(length + 2) };
00939 
00940   CS_SELECT();
00941   rf_if_spi_exchange_n(cmd, 2, NULL, 0);
00942   rf_if_spi_exchange_n(ptr, length, NULL, 0);
00943   CS_RELEASE();
00944 }
00945 
00946 /*
00947  * \brief Function returns 8-bit random value.
00948  *
00949  * \param none
00950  *
00951  * \return random value
00952  */
00953 static uint8_t rf_if_read_rnd(void)
00954 {
00955   uint8_t temp;
00956   uint8_t tmp_rpc_val = 0;
00957   /*RPC must be disabled while reading the random number*/
00958   if(rf_part_num == PART_AT86RF233)
00959   {
00960     tmp_rpc_val = rf_if_read_register(TRX_RPC);
00961     rf_if_write_register(TRX_RPC, RX_RPC_CTRL|TRX_RPC_RSVD_1);
00962   }
00963 
00964   wait_ms(1);
00965   temp = ((rf_if_read_register(PHY_RSSI)>>5) << 6);
00966   wait_ms(1);
00967   temp |= ((rf_if_read_register(PHY_RSSI)>>5) << 4);
00968   wait_ms(1);
00969   temp |= ((rf_if_read_register(PHY_RSSI)>>5) << 2);
00970   wait_ms(1);
00971   temp |= ((rf_if_read_register(PHY_RSSI)>>5));
00972   wait_ms(1);
00973   if(rf_part_num == PART_AT86RF233)
00974     rf_if_write_register(TRX_RPC, tmp_rpc_val);
00975   return temp;
00976 }
00977 
00978 /*
00979  * \brief Function changes the state of the RF.
00980  *
00981  * \param trx_state Given RF state
00982  *
00983  * \return none
00984  */
00985 static rf_trx_states_t rf_if_change_trx_state(rf_trx_states_t trx_state)
00986 {
00987   rf_if_write_register(TRX_STATE, trx_state);
00988   /*Wait while not in desired state*/
00989   return rf_poll_trx_state_change(trx_state);
00990 }
00991 
00992 /*
00993  * \brief Function starts the CCA process
00994  *
00995  * \param none
00996  *
00997  * \return none
00998  */
00999 static void rf_if_start_cca_process(void)
01000 {
01001   rf_if_write_register(PHY_CC_CCA, CCA_REQUEST | CCA_MODE_3A | rf_phy_channel);
01002 }
01003 
01004 /*
01005  * \brief Function scales RSSI
01006  *
01007  * \param ed_level ED level read from chip
01008  *
01009  * \return appropriately scaled RSSI dBm
01010  */
01011 static int8_t rf_if_scale_rssi(uint8_t ed_level)
01012 {
01013   if (rf_part_num == PART_AT86RF212) {
01014     /* Data sheet says to multiply by 1.03 - this is 1.03125, rounding down */
01015     ed_level += ed_level >> 5;
01016   }
01017   return rf_rssi_base_val + ed_level;
01018 }
01019 
01020 /*
01021  * \brief Function sets the RF channel field
01022  *
01023  * \param Given channel
01024  *
01025  * \return none
01026  */
01027 static void rf_if_set_channel_register(uint8_t channel)
01028 {
01029   rf_if_set_bit(PHY_CC_CCA, channel, CCA_CHANNEL_MASK);
01030 }
01031 
01032 /*
01033  * \brief Function enables RF irq pin interrupts in RF interface.
01034  *
01035  * \param none
01036  *
01037  * \return none
01038  */
01039 static void rf_if_enable_irq(void)
01040 {
01041   rf->IRQ.enable_irq();
01042 }
01043 
01044 /*
01045  * \brief Function disables RF irq pin interrupts in RF interface.
01046  *
01047  * \param none
01048  *
01049  * \return none
01050  */
01051 static void rf_if_disable_irq(void)
01052 {
01053   rf->IRQ.disable_irq();
01054 }
01055 
01056 #ifdef MBED_CONF_RTOS_PRESENT
01057 static void rf_if_interrupt_handler(void)
01058 {
01059     rf->irq_thread.signal_set(SIG_RADIO);
01060 }
01061 
01062 // Started during construction of rf, so variable
01063 // rf isn't set at the start. Uses 'this' instead.
01064 void RFBits::rf_if_irq_task(void)
01065 {
01066     for (;;) {
01067         osEvent event = irq_thread.signal_wait(0);
01068         if (event.status != osEventSignal) {
01069             continue;
01070         }
01071         rf_if_lock();
01072         if (event.value.signals & SIG_RADIO) {
01073             rf_if_irq_task_process_irq();
01074         }
01075         if (event.value.signals & SIG_TIMER_ACK) {
01076             rf_ack_wait_timer_interrupt();
01077         }
01078         if (event.value.signals & SIG_TIMER_CCA) {
01079             rf_cca_timer_interrupt();
01080         }
01081         if (event.value.signals & SIG_TIMER_CAL) {
01082             rf_calibration_timer_interrupt();
01083         }
01084         rf_if_unlock();
01085     }
01086 }
01087 
01088 static void rf_if_irq_task_process_irq(void)
01089 #else
01090 /*
01091  * \brief Function is a RF interrupt vector. End of frame in RX and TX are handled here as well as CCA process interrupt.
01092  *
01093  * \param none
01094  *
01095  * \return none
01096  */
01097 static void rf_if_interrupt_handler(void)
01098 #endif
01099 {
01100   static uint8_t last_is, last_ts;
01101   uint8_t irq_status, full_trx_status;
01102   uint8_t orig_xah_ctrl_1 = xah_ctrl_1;
01103 
01104   /*Read and clear interrupt flag, and pick up trx_status*/
01105   irq_status = rf_if_read_register_with_status(IRQ_STATUS, &full_trx_status);
01106   uint8_t orig_flags = rf_flags;
01107 
01108   /*Frame end interrupt (RX and TX)*/
01109   if(irq_status & TRX_END)
01110   {
01111     /*TX done interrupt*/
01112     rf_trx_states_t trx_status = rf_if_trx_status_from_full(full_trx_status);
01113     if(trx_status == PLL_ON || trx_status == TX_ARET_ON)
01114     {
01115       rf_handle_tx_end(trx_status);
01116     }
01117     /*Frame received interrupt*/
01118     else
01119     {
01120       rf_handle_rx_end(trx_status);
01121     }
01122   }
01123   if(irq_status & CCA_ED_DONE)
01124   {
01125     rf_handle_cca_ed_done(full_trx_status);
01126   }
01127   if (irq_status & TRX_UR)
01128   {
01129     tr_error("Radio underrun is %x->%x ts %x->%x fl %x->%x x1 %x", last_is, irq_status, last_ts, full_trx_status, orig_flags, rf_flags, orig_xah_ctrl_1);
01130   }
01131   last_is = irq_status;
01132   last_ts = full_trx_status;
01133 }
01134 
01135 /*
01136  * \brief Function writes/read data in SPI interface
01137  */
01138 static void rf_if_spi_exchange_n(const void *tx, size_t tx_len, void *rx, size_t rx_len)
01139 {
01140 #if 1
01141   rf->spi.write(static_cast<const char *>(tx), tx_len,
01142                 static_cast<char *>(rx), rx_len);
01143 #else
01144   const uint8_t *txb = static_cast<const uint8_t *>(tx);
01145   uint8_t *rxb = static_cast<uint8_t *>(rx);
01146   while (tx_len > 0 || rx_len > 0) {
01147       uint8_t b;
01148       if (tx_len) {
01149           tx_len--;
01150           b = *txb++;
01151       } else {
01152           b = 0xFF;
01153       }
01154       b = rf->spi.write(b);
01155       if (rx_len) {
01156           rx_len--;
01157           *rxb++ = b;
01158       }
01159   }
01160 #endif
01161 }
01162 
01163 /*
01164  * \brief Function sets given RF flag on.
01165  *
01166  * \param x Given RF flag
01167  *
01168  * \return none
01169  */
01170 static void rf_flags_set(uint8_t x)
01171 {
01172     rf_flags |= x;
01173 }
01174 
01175 /*
01176  * \brief Function clears given RF flag on.
01177  *
01178  * \param x Given RF flag
01179  *
01180  * \return none
01181  */
01182 static void rf_flags_clear(uint8_t x)
01183 {
01184     rf_flags &= ~x;
01185 }
01186 
01187 /*
01188  * \brief Function checks if given RF flag is on.
01189  *
01190  * \param x Given RF flag
01191  *
01192  * \return states of the given flags
01193  */
01194 static uint8_t rf_flags_check(uint8_t x)
01195 {
01196     return (rf_flags & x);
01197 }
01198 
01199 /*
01200  * \brief Function clears all RF flags.
01201  *
01202  * \param none
01203  *
01204  * \return none
01205  */
01206 static void rf_flags_reset(void)
01207 {
01208     rf_flags = 0;
01209 }
01210 
01211 /*
01212  * \brief Function initialises and registers the RF driver.
01213  *
01214  * \param none
01215  *
01216  * \return rf_radio_driver_id Driver ID given by NET library
01217  */
01218 static int8_t rf_device_register(const uint8_t *mac_addr)
01219 {
01220     rf_trx_part_e radio_type;
01221 
01222     rf_init();
01223 
01224     radio_type = rf_radio_type_read();
01225     if(radio_type != ATMEL_UNKNOW_DEV)
01226     {
01227         /*Set pointer to MAC address*/
01228         device_driver.PHY_MAC = (uint8_t *)mac_addr;
01229         device_driver.driver_description = (char*)"ATMEL_MAC";
01230         //Create setup Used Radio chips
01231         if(radio_type == ATMEL_AT86RF212)
01232         {
01233             device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE;
01234         }
01235         else
01236         {
01237             device_driver.link_type = PHY_LINK_15_4_2_4GHZ_TYPE;
01238         }
01239         device_driver.phy_channel_pages = phy_channel_pages;
01240         /*Maximum size of payload is 127*/
01241         device_driver.phy_MTU = 127;
01242         /*No header in PHY*/
01243         device_driver.phy_header_length = 0;
01244         /*No tail in PHY*/
01245         device_driver.phy_tail_length = 0;
01246         /*Set address write function*/
01247         device_driver.address_write = &rf_address_write;
01248         /*Set RF extension function*/
01249         device_driver.extension = &rf_extension;
01250         /*Set RF state control function*/
01251         device_driver.state_control = &rf_interface_state_control;
01252         /*Set transmit function*/
01253         device_driver.tx = &rf_start_cca;
01254         /*NULLIFY rx and tx_done callbacks*/
01255         device_driver.phy_rx_cb = NULL;
01256         device_driver.phy_tx_done_cb = NULL;
01257         /*Register device driver*/
01258         rf_radio_driver_id = arm_net_phy_register(&device_driver);
01259     } else {
01260         rf_if_disable_irq();
01261     }
01262     return rf_radio_driver_id;
01263 }
01264 
01265 /*
01266  * \brief Function unregisters the RF driver.
01267  *
01268  * \param none
01269  *
01270  * \return none
01271  */
01272 static void rf_device_unregister()
01273 {
01274     if (rf_radio_driver_id >= 0) {
01275         arm_net_phy_unregister(rf_radio_driver_id);
01276         rf_radio_driver_id = -1;
01277     }
01278 }
01279 
01280 
01281 /*
01282  * \brief Function is a call back for ACK wait timeout.
01283  *
01284  * \param none
01285  *
01286  * \return none
01287  */
01288 static void rf_ack_wait_timer_interrupt(void)
01289 {
01290     rf_if_lock();
01291     rf_give_up_on_ack();
01292     rf_if_unlock();
01293 }
01294 
01295 /*
01296  * \brief Function is a call back for calibration interval timer.
01297  *
01298  * \param none
01299  *
01300  * \return none
01301  */
01302 static void rf_calibration_timer_interrupt(void)
01303 {
01304     /*Calibrate RF*/
01305     rf_calibration_cb();
01306     /*Start new calibration timeout*/
01307     rf_calibration_timer_start(RF_CALIBRATION_INTERVAL);
01308 }
01309 
01310 /*
01311  * \brief Function is a call back for cca interval timer.
01312  *
01313  * \param none
01314  *
01315  * \return none
01316  */
01317 static void rf_cca_timer_interrupt(void)
01318 {
01319     rf_flags_set(RFF_CCA);
01320     /*Start CCA process*/
01321     rf_if_start_cca_process();
01322 }
01323 
01324 /*
01325  * \brief Function starts the ACK wait timeout.
01326  *
01327  * \param slots Given slots, resolution 50us
01328  *
01329  * \return none
01330  */
01331 static void rf_ack_wait_timer_start(uint16_t slots)
01332 {
01333     rf_if_ack_wait_timer_start(slots);
01334 }
01335 
01336 /*
01337  * \brief Function starts the calibration interval.
01338  *
01339  * \param slots Given slots, resolution 50us
01340  *
01341  * \return none
01342  */
01343 static void rf_calibration_timer_start(uint32_t slots)
01344 {
01345     rf_if_calibration_timer_start(slots);
01346 }
01347 
01348 /*
01349  * \brief Function starts the CCA backoff.
01350  *
01351  * \param slots Given slots, resolution 50us
01352  *
01353  * \return none
01354  */
01355 static void rf_cca_timer_start(uint32_t slots)
01356 {
01357     rf_if_cca_timer_start(slots);
01358 }
01359 
01360 /*
01361  * \brief Function stops the CCA backoff.
01362  *
01363  * \return none
01364  */
01365 static void rf_cca_timer_stop(void)
01366 {
01367     rf_if_cca_timer_stop();
01368 }
01369 
01370 /*
01371  * \brief Function stops the ACK wait timeout.
01372  *
01373  * \param none
01374  *
01375  * \return none
01376  */
01377 static void rf_ack_wait_timer_stop(void)
01378 {
01379     rf_if_ack_wait_timer_stop();
01380 }
01381 
01382 /*
01383  * \brief Function writes various RF settings in startup.
01384  *
01385  * \param none
01386  *
01387  * \return none
01388  */
01389 static void rf_write_settings(void)
01390 {
01391     rf_if_lock();
01392     rf_if_write_rf_settings();
01393     /*Set output power*/
01394     rf_if_write_set_tx_power_register(radio_tx_power);
01395     /*Initialise Antenna Diversity*/
01396     if(rf_use_antenna_diversity)
01397         rf_if_write_antenna_diversity_settings();
01398     rf_if_unlock();
01399 }
01400 
01401 /*
01402  * \brief Function writes 16-bit address in RF address filter.
01403  *
01404  * \param short_address Given short address
01405  *
01406  * \return none
01407  */
01408 static void rf_set_short_adr(uint8_t * short_address)
01409 {
01410     rf_if_lock();
01411     /*Wake up RF if sleeping*/
01412     if(rf_flags_check(RFF_ON) == 0)
01413     {
01414         rf_if_disable_slptr();
01415         rf_poll_trx_state_change(TRX_OFF);
01416     }
01417     /*Write address filter registers*/
01418     rf_if_write_short_addr_registers(short_address);
01419     /*RF back to sleep*/
01420     if(rf_flags_check(RFF_ON) == 0)
01421     {
01422         rf_if_enable_slptr();
01423     }
01424     rf_if_unlock();
01425 }
01426 
01427 /*
01428  * \brief Function writes PAN Id in RF PAN Id filter.
01429  *
01430  * \param pan_id Given PAN Id
01431  *
01432  * \return none
01433  */
01434 static void rf_set_pan_id(uint8_t *pan_id)
01435 {
01436     rf_if_lock();
01437     /*Wake up RF if sleeping*/
01438     if(rf_flags_check(RFF_ON) == 0)
01439     {
01440         rf_if_disable_slptr();
01441         rf_poll_trx_state_change(TRX_OFF);
01442     }
01443     /*Write address filter registers*/
01444     rf_if_write_pan_id_registers(pan_id);
01445     /*RF back to sleep*/
01446     if(rf_flags_check(RFF_ON) == 0)
01447     {
01448         rf_if_enable_slptr();
01449     }
01450     rf_if_unlock();
01451 }
01452 
01453 /*
01454  * \brief Function writes 64-bit address in RF address filter.
01455  *
01456  * \param address Given 64-bit address
01457  *
01458  * \return none
01459  */
01460 static void rf_set_address(uint8_t *address)
01461 {
01462     rf_if_lock();
01463     /*Wake up RF if sleeping*/
01464     if(rf_flags_check(RFF_ON) == 0)
01465     {
01466         rf_if_disable_slptr();
01467         rf_poll_trx_state_change(TRX_OFF);
01468     }
01469     /*Write address filter registers*/
01470     rf_if_write_ieee_addr_registers(address);
01471     /*RF back to sleep*/
01472     if(rf_flags_check(RFF_ON) == 0)
01473     {
01474         rf_if_enable_slptr();
01475     }
01476     rf_if_unlock();
01477 }
01478 
01479 /*
01480  * \brief Function sets the RF channel.
01481  *
01482  * \param ch New channel
01483  *
01484  * \return none
01485  */
01486 static void rf_channel_set(uint8_t ch)
01487 {
01488     rf_if_lock();
01489     rf_phy_channel = ch;
01490     if(ch < 0x1f)
01491         rf_if_set_channel_register(ch);
01492     rf_if_unlock();
01493 }
01494 
01495 
01496 /*
01497  * \brief Function initialises the radio driver and resets the radio.
01498  *
01499  * \param none
01500  *
01501  * \return none
01502  */
01503 static void rf_init(void)
01504 {
01505     rf_if_lock();
01506 
01507     /*Write RF settings*/
01508     rf_write_settings();
01509     /*Initialise PHY mode*/
01510     rf_init_phy_mode();
01511     /*Clear RF flags*/
01512     rf_flags_reset();
01513     /*Set RF in TRX OFF state*/
01514     rf_if_change_trx_state(TRX_OFF);
01515     /*Set RF in PLL_ON state*/
01516     rf_trx_states_t trx_status = rf_if_change_trx_state(PLL_ON);
01517     /*Start receiver*/
01518     rf_receive(trx_status);
01519     /*Read randomness, and add to seed*/
01520     randLIB_add_seed(rf_if_read_rnd());
01521     /*Start RF calibration timer*/
01522     rf_calibration_timer_start(RF_CALIBRATION_INTERVAL);
01523 
01524     rf_if_unlock();
01525 }
01526 
01527 /**
01528  * \brief Function gets called when MAC is setting radio off.
01529  *
01530  * \param none
01531  *
01532  * \return none
01533  */
01534 static void rf_off(void)
01535 {
01536     if(rf_flags_check(RFF_ON))
01537     {
01538         rf_if_lock();
01539         rf_cca_abort();
01540         uint16_t while_counter = 0;
01541         /*Wait while receiving*/
01542         while(rf_if_read_trx_state() == BUSY_RX_AACK)
01543         {
01544             while_counter++;
01545             if(while_counter == 0xffff)
01546                 break;
01547         }
01548         /*RF state change: RX_AACK_ON->PLL_ON->TRX_OFF->SLEEP*/
01549         if(rf_if_read_trx_state() == RX_AACK_ON)
01550         {
01551             rf_if_change_trx_state(PLL_ON);
01552         }
01553         rf_if_change_trx_state(TRX_OFF);
01554         rf_if_enable_slptr();
01555 
01556         /*Disable Antenna Diversity*/
01557         if(rf_use_antenna_diversity)
01558             rf_if_disable_ant_div();
01559         rf_if_unlock();
01560     }
01561 
01562     /*Clears all flags*/
01563     rf_flags_reset();
01564 }
01565 
01566 /*
01567  * \brief Function polls the RF state until it has changed to desired state.
01568  *
01569  * \param trx_state RF state
01570  *
01571  * \return none
01572  */
01573 static rf_trx_states_t rf_poll_trx_state_change(rf_trx_states_t trx_state)
01574 {
01575     uint16_t while_counter = 0;
01576 
01577     if(trx_state == FORCE_PLL_ON)
01578         trx_state = PLL_ON;
01579     else if(trx_state == FORCE_TRX_OFF)
01580         trx_state = TRX_OFF;
01581 
01582     rf_trx_states_t state_out;
01583     while((state_out = rf_if_read_trx_state()) != trx_state)
01584     {
01585         while_counter++;
01586         if(while_counter == 0x1ff)
01587             break;
01588     }
01589 
01590     return state_out;
01591 }
01592 
01593 /*
01594  * \brief Function polls the RF state until it is no longer transitioning.
01595  *
01596  * \param trx_state RF state
01597  *
01598  * \return none
01599  */
01600 static rf_trx_states_t rf_poll_for_state(void)
01601 {
01602     rf_trx_states_t state_out;
01603     while((state_out = rf_if_read_trx_state()) == STATE_TRANSITION_IN_PROGRESS)
01604     {
01605     }
01606 
01607     return state_out;
01608 }
01609 
01610 /*
01611  * \brief Function starts the CCA process before starting data transmission and copies the data to RF TX FIFO.
01612  *
01613  * \param data_ptr Pointer to TX data (excluding FCS)
01614  * \param data_length Length of the TX data (excluding FCS)
01615  * \param tx_handle Handle to transmission
01616  * \return 0 Success
01617  * \return -1 Busy
01618  */
01619 static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol )
01620 {
01621     (void)data_protocol;
01622     rf_if_lock();
01623     /*Check if transmitter is busy*/
01624     rf_trx_states_t trx_state = rf_if_read_trx_state();
01625     if(trx_state == BUSY_RX || trx_state == BUSY_RX_AACK || data_length > RF_MTU - 2)
01626     {
01627         rf_if_unlock();
01628         /*Return busy*/
01629         return -1;
01630     }
01631     else
01632     {
01633         rf_give_up_on_ack();
01634 
01635         /*Nanostack has a static TX buffer, which will remain valid until we*/
01636         /*generate a callback, so we just note the pointer for reading later.*/
01637         rf_tx_data = data_ptr;
01638         rf_tx_length = data_length;
01639         /*Start CCA timeout*/
01640         rf_cca_timer_start(RF_CCA_BASE_BACKOFF + randLIB_get_random_in_range(0, RF_CCA_RANDOM_BACKOFF));
01641         /*Store TX handle*/
01642         mac_tx_handle = tx_handle;
01643         rf_if_unlock();
01644     }
01645 
01646     /*Return success*/
01647     return 0;
01648 }
01649 
01650 /*
01651  * \brief Function aborts CCA process.
01652  *
01653  * \param none
01654  *
01655  * \return none
01656  */
01657 static void rf_cca_abort(void)
01658 {
01659     rf_cca_timer_stop();
01660     rf_flags_clear(RFF_CCA);
01661 }
01662 
01663 /*
01664  * \brief Function starts the transmission of the frame.
01665  *
01666  * \param none
01667  *
01668  * \return none
01669  */
01670 static bool rf_start_tx()
01671 {
01672     /* Attempt change to PLL_ON */
01673     rf_if_write_register(TRX_STATE, PLL_ON);
01674 
01675     // It appears that if radio is busy, rather than ignoring the state change,
01676     // the state change happens when it stops being busy - eg
01677     // after address match fail or finishing reception. If this happens, we do
01678     // not want to transmit - our channel clear check is stale (either someone is
01679     // still transmitting, or it's a long time since we checked). So wait for the
01680     // PLL_ON change and then go to receive mode without trying to transmit.
01681     rf_trx_states_t state = rf_poll_for_state();
01682     int poll_count = 0;
01683     while (state != PLL_ON) {
01684         /* Change didn't work (yet) - must be busy - assume it will eventually change */
01685         state = rf_poll_for_state();
01686         poll_count++;
01687     }
01688 
01689     rf_flags_clear(RFF_RX);
01690     // Check whether we saw any delay in the PLL_ON transition.
01691     if (poll_count > 0) {
01692         tr_warning("PLL_ON delayed, retry count: %d", poll_count);
01693         // let's get back to the receiving state.
01694         rf_receive(state);
01695         return false;
01696     }
01697 
01698     rf_flags_set(RFF_TX);
01699     /*RF state change: SLP_TR pulse triggers PLL_ON->BUSY_TX*/
01700     rf_if_enable_slptr();
01701     /*Chip permits us to write frame buffer while it is transmitting*/
01702     /*As long as first byte of data is in within 176us of TX start, we're good */
01703     rf_if_write_frame_buffer(rf_tx_data, rf_tx_length);
01704     rf_if_disable_slptr();
01705     return true;
01706 }
01707 
01708 /*
01709  * \brief Function sets the RF in RX state.
01710  *
01711  * \param none
01712  *
01713  * \return none
01714  */
01715 static void rf_receive(rf_trx_states_t trx_status)
01716 {
01717     uint16_t while_counter = 0;
01718     if(rf_flags_check(RFF_ON) == 0)
01719     {
01720         rf_on();
01721         rf_channel_set(rf_phy_channel);
01722         trx_status = TRX_OFF;
01723     }
01724     /*If not yet in RX state set it*/
01725     if(rf_flags_check(RFF_RX) == 0)
01726     {
01727         /*Wait while receiving data. Just making sure, usually this shouldn't happen. */
01728         while(trx_status == BUSY_RX || trx_status == BUSY_RX_AACK || trx_status == STATE_TRANSITION_IN_PROGRESS)
01729         {
01730             while_counter++;
01731             if(while_counter == 0xffff)
01732             {
01733                 break;
01734             }
01735             trx_status = rf_if_read_trx_state();
01736         }
01737 
01738         if((rf_mode == RF_MODE_SNIFFER) || (rf_mode == RF_MODE_ED))
01739         {
01740             if (trx_status != RX_ON) {
01741                 trx_status = rf_if_change_trx_state(RX_ON);
01742             }
01743         }
01744         else
01745         {
01746             /*ACK is always received in promiscuous mode to bypass address filters*/
01747             if(rf_rx_mode)
01748             {
01749                 rf_rx_mode = 0;
01750                 rf_if_enable_promiscuous_mode();
01751             }
01752             else
01753             {
01754                 rf_if_disable_promiscuous_mode();
01755             }
01756             if (trx_status != RX_AACK_ON) {
01757                 trx_status = rf_if_change_trx_state(RX_AACK_ON);
01758             }
01759         }
01760         /*If calibration timer was unable to calibrate the RF, run calibration now*/
01761         if(!rf_tuned)
01762         {
01763             /*Start calibration. This can be done in states TRX_OFF, PLL_ON or in any receive state*/
01764             rf_if_calibration();
01765             /*RF is tuned now*/
01766             rf_tuned = 1;
01767         }
01768 
01769         rf_flags_set(RFF_RX);
01770     }
01771 }
01772 
01773 /*
01774  * \brief Function calibrates the radio.
01775  *
01776  * \param none
01777  *
01778  * \return none
01779  */
01780 static void rf_calibration_cb(void)
01781 {
01782     /*clear tuned flag to start tuning in rf_receive*/
01783     rf_tuned = 0;
01784     /*If RF is in default receive state, start calibration*/
01785     if(rf_if_read_trx_state() == RX_AACK_ON)
01786     {
01787         rf_if_lock();
01788         /*Set RF in PLL_ON state*/
01789         rf_if_change_trx_state(PLL_ON);
01790         /*Set RF in TRX_OFF state to start PLL tuning*/
01791         rf_if_change_trx_state(TRX_OFF);
01792         /*Set RF in RX_ON state to calibrate*/
01793         rf_trx_states_t trx_status = rf_if_change_trx_state(RX_ON);
01794         /*Calibrate FTN*/
01795         rf_if_calibration();
01796         /*RF is tuned now*/
01797         rf_tuned = 1;
01798         /*Back to default receive state*/
01799         rf_flags_clear(RFF_RX);
01800         rf_receive(trx_status);
01801         rf_if_unlock();
01802     }
01803 }
01804 
01805 /*
01806  * \brief Function sets RF_ON flag when radio is powered.
01807  *
01808  * \param none
01809  *
01810  * \return none
01811  */
01812 static void rf_on(void)
01813 {
01814     /*Set RFF_ON flag*/
01815     if(rf_flags_check(RFF_ON) == 0)
01816     {
01817         rf_if_lock();
01818         rf_flags_set(RFF_ON);
01819         /*Enable Antenna diversity*/
01820         if(rf_use_antenna_diversity)
01821             /*Set ANT_EXT_SW_EN to enable controlling of antenna diversity*/
01822             rf_if_enable_ant_div();
01823 
01824         /*Wake up from sleep state*/
01825         rf_if_disable_slptr();
01826         rf_poll_trx_state_change(TRX_OFF);
01827         rf_if_unlock();
01828     }
01829 }
01830 
01831 /*
01832  * \brief Abandon waiting for an ack frame
01833 
01834  * \return none
01835  */
01836 static void rf_give_up_on_ack(void)
01837 {
01838     if (expected_ack_sequence == -1) {
01839         return;
01840     }
01841 
01842     rf_if_disable_promiscuous_mode();
01843     rf_if_ack_wait_timer_stop();
01844     expected_ack_sequence = -1;
01845 
01846     if(device_driver.phy_tx_done_cb){
01847         device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_FAIL, 0, 0);
01848     }
01849 }
01850 
01851 /*
01852  * \brief Function handles the received ACK frame.
01853  *
01854  * \param seq_number Sequence number of received ACK
01855  * \param data_pending Pending bit state in received ACK
01856  *
01857  * \return none
01858  */
01859 static void rf_handle_ack(uint8_t seq_number, uint8_t data_pending)
01860 {
01861     phy_link_tx_status_e phy_status;
01862     /*Received ACK sequence must be equal with transmitted packet sequence*/
01863     if(expected_ack_sequence == seq_number)
01864     {
01865         rf_if_disable_promiscuous_mode();
01866         rf_if_ack_wait_timer_stop();
01867         expected_ack_sequence = -1;
01868 
01869         /*When data pending bit in ACK frame is set, inform NET library*/
01870         if(data_pending)
01871             phy_status = PHY_LINK_TX_DONE_PENDING;
01872         else
01873             phy_status = PHY_LINK_TX_DONE;
01874         /*Call PHY TX Done API*/
01875         if(device_driver.phy_tx_done_cb){
01876             device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle,phy_status, 0, 0);
01877         }
01878     } else {
01879         rf_give_up_on_ack();
01880     }
01881 }
01882 
01883 /*
01884  * \brief Function is a call back for RX end interrupt.
01885  *
01886  * \param none
01887  *
01888  * \return none
01889  */
01890 static void rf_handle_rx_end(rf_trx_states_t trx_status)
01891 {
01892     /*Frame received interrupt*/
01893     if(!rf_flags_check(RFF_RX)) {
01894         return;
01895     }
01896 
01897     static uint8_t rf_buffer[RF_MTU];
01898     uint8_t rf_lqi, rf_ed;
01899     int8_t rf_rssi;
01900     bool crc_good;
01901 
01902     /*Read received packet*/
01903     uint8_t len = rf_if_read_packet(rf_buffer, &rf_lqi, &rf_ed, &crc_good);
01904 
01905     if (len < 5 || !crc_good) {
01906         rf_give_up_on_ack();
01907         return;
01908     }
01909 
01910     /* Convert raw ED to dBm value (chip-dependent) */
01911     rf_rssi = rf_if_scale_rssi(rf_ed);
01912 
01913     /* Create a virtual LQI using received RSSI, forgetting actual HW LQI */
01914     /* (should be done through PHY_EXTENSION_CONVERT_SIGNAL_INFO) */
01915     rf_lqi = rf_scale_lqi(rf_rssi);
01916 
01917     /*Handle received ACK*/
01918     if((rf_buffer[0] & 0x07) == 0x02 && rf_mode != RF_MODE_SNIFFER)
01919     {
01920         /*Check if data is pending*/
01921         bool pending = (rf_buffer[0] & 0x10);
01922 
01923         /*Send sequence number in ACK handler*/
01924         rf_handle_ack(rf_buffer[2], pending);
01925     } else {
01926         rf_give_up_on_ack();
01927         if( device_driver.phy_rx_cb ){
01928             device_driver.phy_rx_cb(rf_buffer, len - 2, rf_lqi, rf_rssi, rf_radio_driver_id);
01929         }
01930     }
01931 }
01932 
01933 /*
01934  * \brief Function is called when MAC is shutting down the radio.
01935  *
01936  * \param none
01937  *
01938  * \return none
01939  */
01940 static void rf_shutdown(void)
01941 {
01942     /*Call RF OFF*/
01943     rf_off();
01944 }
01945 
01946 /*
01947  * \brief Function is a call back for TX end interrupt.
01948  *
01949  * \param none
01950  *
01951  * \return none
01952  */
01953 static void rf_handle_tx_end(rf_trx_states_t trx_status)
01954 {
01955     rf_rx_mode = 0;
01956     /*If ACK is needed for this transmission*/
01957     if((rf_tx_data[0] & 0x20) && rf_flags_check(RFF_TX))
01958     {
01959         expected_ack_sequence = rf_tx_data[2];
01960         rf_ack_wait_timer_start(rf_ack_wait_duration);
01961         rf_rx_mode = 1;
01962     }
01963     rf_flags_clear(RFF_TX);
01964     /*Start receiver*/
01965     rf_receive(trx_status);
01966 
01967     /*Call PHY TX Done API*/
01968     if(device_driver.phy_tx_done_cb){
01969         device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_SUCCESS, 0, 0);
01970     }
01971 }
01972 
01973 /*
01974  * \brief Function is a call back for CCA ED done interrupt.
01975  *
01976  * \param none
01977  *
01978  * \return none
01979  */
01980 static void rf_handle_cca_ed_done(uint8_t full_trx_status)
01981 {
01982     if (!rf_flags_check(RFF_CCA)) {
01983         return;
01984     }
01985     rf_flags_clear(RFF_CCA);
01986 
01987     bool success = false;
01988 
01989     /*Check the result of CCA process*/
01990     if((full_trx_status & CCA_STATUS) && rf_if_trx_status_from_full(full_trx_status) == RX_AACK_ON)
01991     {
01992         success = rf_start_tx();
01993     }
01994 
01995     if (!success)
01996     {
01997         /*Send CCA fail notification*/
01998         if(device_driver.phy_tx_done_cb){
01999             device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 0, 0);
02000         }
02001     }
02002 }
02003 
02004 /*
02005  * \brief Function returns the TX power variable.
02006  *
02007  * \param none
02008  *
02009  * \return radio_tx_power TX power variable
02010  */
02011 MBED_UNUSED static uint8_t rf_tx_power_get(void)
02012 {
02013   return radio_tx_power;
02014 }
02015 
02016 /*
02017  * \brief Function enables the usage of Antenna diversity.
02018  *
02019  * \param none
02020  *
02021  * \return 0 Success
02022  */
02023 MBED_UNUSED static int8_t rf_enable_antenna_diversity(void)
02024 {
02025     int8_t ret_val = 0;
02026     rf_use_antenna_diversity = 1;
02027     return ret_val;
02028 }
02029 
02030 /*
02031  * \brief Function gives the control of RF states to MAC.
02032  *
02033  * \param new_state RF state
02034  * \param rf_channel RF channel
02035  *
02036  * \return 0 Success
02037  */
02038 static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel)
02039 {
02040     int8_t ret_val = 0;
02041     switch (new_state)
02042     {
02043         /*Reset PHY driver and set to idle*/
02044         case PHY_INTERFACE_RESET:
02045             break;
02046         /*Disable PHY Interface driver*/
02047         case PHY_INTERFACE_DOWN:
02048             rf_shutdown();
02049             break;
02050         /*Enable PHY Interface driver*/
02051         case PHY_INTERFACE_UP:
02052             rf_if_lock();
02053             rf_mode = RF_MODE_NORMAL;
02054             rf_channel_set(rf_channel);
02055             rf_receive();
02056             rf_if_enable_irq();
02057             rf_if_unlock();
02058             break;
02059         /*Enable wireless interface ED scan mode*/
02060         case PHY_INTERFACE_RX_ENERGY_STATE:
02061             rf_mode = RF_MODE_ED;
02062             rf_channel_set(rf_channel);
02063             rf_receive();
02064             rf_if_disable_irq();
02065             // Read status to clear pending flags.
02066             rf_if_read_register(IRQ_STATUS);
02067             // ED can be initiated by writing arbitrary value to PHY_ED_LEVEL
02068             rf_if_write_register(PHY_ED_LEVEL, 0xff);
02069             break;
02070         case PHY_INTERFACE_SNIFFER_STATE:             /**< Enable Sniffer state */
02071             rf_mode = RF_MODE_SNIFFER;
02072             rf_channel_set(rf_channel);
02073             rf_flags_clear(RFF_RX);
02074             rf_receive();
02075             rf_if_enable_irq();
02076             break;
02077     }
02078     return ret_val;
02079 }
02080 
02081 /*
02082  * \brief Function controls the ACK pending, channel setting and energy detection.
02083  *
02084  * \param extension_type Type of control
02085  * \param data_ptr Data from NET library
02086  *
02087  * \return 0 Success
02088  */
02089 static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_ptr)
02090 {
02091     switch (extension_type)
02092     {
02093         /*Control MAC pending bit for Indirect data transmission*/
02094         case PHY_EXTENSION_CTRL_PENDING_BIT:
02095             if(*data_ptr)
02096             {
02097                 rf_if_ack_pending_ctrl(1);
02098             }
02099             else
02100             {
02101                 rf_if_ack_pending_ctrl(0);
02102             }
02103             break;
02104         /*Return frame pending status*/
02105         case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS:
02106             *data_ptr = rf_if_last_acked_pending();
02107             break;
02108         /*Set channel*/
02109         case PHY_EXTENSION_SET_CHANNEL:
02110             break;
02111         /*Read energy on the channel*/
02112         case PHY_EXTENSION_READ_CHANNEL_ENERGY:
02113             // End of the ED measurement is indicated by CCA_ED_DONE
02114             while (!(rf_if_read_register(IRQ_STATUS) & CCA_ED_DONE));
02115             // RF input power: RSSI base level + 1[db] * PHY_ED_LEVEL
02116             *data_ptr = rf_sensitivity + rf_if_read_register(PHY_ED_LEVEL);
02117             // Read status to clear pending flags.
02118             rf_if_read_register(IRQ_STATUS);
02119             // Next ED measurement is started, next PHY_EXTENSION_READ_CHANNEL_ENERGY call will return the result.
02120             rf_if_write_register(PHY_ED_LEVEL, 0xff);
02121             break;
02122         /*Read status of the link*/
02123         case PHY_EXTENSION_READ_LINK_STATUS:
02124             break;
02125         default:
02126             break;
02127     }
02128     return 0;
02129 }
02130 
02131 /*
02132  * \brief Function sets the addresses to RF address filters.
02133  *
02134  * \param address_type Type of address
02135  * \param address_ptr Pointer to given address
02136  *
02137  * \return 0 Success
02138  */
02139 static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address_ptr)
02140 {
02141     int8_t ret_val = 0;
02142     switch (address_type)
02143     {
02144         /*Set 48-bit address*/
02145         case PHY_MAC_48BIT:
02146             break;
02147             /*Set 64-bit address*/
02148         case PHY_MAC_64BIT:
02149             rf_set_address(address_ptr);
02150             break;
02151         /*Set 16-bit address*/
02152         case PHY_MAC_16BIT:
02153             rf_set_short_adr(address_ptr);
02154             break;
02155         /*Set PAN Id*/
02156         case PHY_MAC_PANID:
02157             rf_set_pan_id(address_ptr);
02158             break;
02159     }
02160     return ret_val;
02161 }
02162 
02163 /*
02164  * \brief Function initialises the ACK wait time and returns the used PHY mode.
02165  *
02166  * \param none
02167  *
02168  * \return tmp Used PHY mode
02169  */
02170 static void rf_init_phy_mode(void)
02171 {
02172     uint8_t tmp = 0;
02173     uint8_t part = rf_if_read_part_num();
02174     /*Read used PHY Mode*/
02175     tmp = rf_if_read_register(TRX_CTRL_2);
02176     /*Set ACK wait time for used data rate*/
02177     if(part == PART_AT86RF212)
02178     {
02179         if((tmp & 0x1f) == 0x00)
02180         {
02181             rf_sensitivity = -110;
02182             rf_ack_wait_duration = 938;
02183             tmp = BPSK_20;
02184         }
02185         else if((tmp & 0x1f) == 0x04)
02186         {
02187             rf_sensitivity = -108;
02188             rf_ack_wait_duration = 469;
02189             tmp = BPSK_40;
02190         }
02191         else if((tmp & 0x1f) == 0x14)
02192         {
02193             rf_sensitivity = -108;
02194             rf_ack_wait_duration = 469;
02195             tmp = BPSK_40_ALT;
02196         }
02197         else if((tmp & 0x1f) == 0x08)
02198         {
02199             rf_sensitivity = -101;
02200             rf_ack_wait_duration = 50;
02201             tmp = OQPSK_SIN_RC_100;
02202         }
02203         else if((tmp & 0x1f) == 0x09)
02204         {
02205             rf_sensitivity = -99;
02206             rf_ack_wait_duration = 30;
02207             tmp = OQPSK_SIN_RC_200;
02208         }
02209         else if((tmp & 0x1f) == 0x18)
02210         {
02211             rf_sensitivity = -102;
02212             rf_ack_wait_duration = 50;
02213             tmp = OQPSK_RC_100;
02214         }
02215         else if((tmp & 0x1f) == 0x19)
02216         {
02217             rf_sensitivity = -100;
02218             rf_ack_wait_duration = 30;
02219             tmp = OQPSK_RC_200;
02220         }
02221         else if((tmp & 0x1f) == 0x0c)
02222         {
02223             rf_sensitivity = -100;
02224             rf_ack_wait_duration = 20;
02225             tmp = OQPSK_SIN_250;
02226         }
02227         else if((tmp & 0x1f) == 0x0d)
02228         {
02229             rf_sensitivity = -98;
02230             rf_ack_wait_duration = 25;
02231             tmp = OQPSK_SIN_500;
02232         }
02233         else if((tmp & 0x1f) == 0x0f)
02234         {
02235             rf_sensitivity = -98;
02236             rf_ack_wait_duration = 25;
02237             tmp = OQPSK_SIN_500_ALT;
02238         }
02239         else if((tmp & 0x1f) == 0x1c)
02240         {
02241             rf_sensitivity = -101;
02242             rf_ack_wait_duration = 20;
02243             tmp = OQPSK_RC_250;
02244         }
02245         else if((tmp & 0x1f) == 0x1d)
02246         {
02247             rf_sensitivity = -99;
02248             rf_ack_wait_duration = 25;
02249             tmp = OQPSK_RC_500;
02250         }
02251         else if((tmp & 0x1f) == 0x1f)
02252         {
02253             rf_sensitivity = -99;
02254             rf_ack_wait_duration = 25;
02255             tmp = OQPSK_RC_500_ALT;
02256         }
02257         else if((tmp & 0x3f) == 0x2A)
02258         {
02259             rf_sensitivity = -91;
02260             rf_ack_wait_duration = 25;
02261             tmp = OQPSK_SIN_RC_400_SCR_ON;
02262         }
02263         else if((tmp & 0x3f) == 0x0A)
02264         {
02265             rf_sensitivity = -91;
02266             rf_ack_wait_duration = 25;
02267             tmp = OQPSK_SIN_RC_400_SCR_OFF;
02268         }
02269         else if((tmp & 0x3f) == 0x3A)
02270         {
02271             rf_sensitivity = -97;
02272             rf_ack_wait_duration = 25;
02273             tmp = OQPSK_RC_400_SCR_ON;
02274         }
02275         else if((tmp & 0x3f) == 0x1A)
02276         {
02277             rf_sensitivity = -97;
02278             rf_ack_wait_duration = 25;
02279             tmp = OQPSK_RC_400_SCR_OFF;
02280         }
02281         else if((tmp & 0x3f) == 0x2E)
02282         {
02283             rf_sensitivity = -93;
02284             rf_ack_wait_duration = 13;
02285             tmp = OQPSK_SIN_1000_SCR_ON;
02286         }
02287         else if((tmp & 0x3f) == 0x0E)
02288         {
02289             rf_sensitivity = -93;
02290             rf_ack_wait_duration = 13;
02291             tmp = OQPSK_SIN_1000_SCR_OFF;
02292         }
02293         else if((tmp & 0x3f) == 0x3E)
02294         {
02295             rf_sensitivity = -95;
02296             rf_ack_wait_duration = 13;
02297             tmp = OQPSK_RC_1000_SCR_ON;
02298         }
02299         else if((tmp & 0x3f) == 0x1E)
02300         {
02301             rf_sensitivity = -95;
02302             rf_ack_wait_duration = 13;
02303             tmp = OQPSK_RC_1000_SCR_OFF;
02304         }
02305     }
02306     else
02307     {
02308         rf_sensitivity = -101;
02309         rf_ack_wait_duration = 20;
02310     }
02311     /*Board design might reduces the sensitivity*/
02312     //rf_sensitivity += RF_SENSITIVITY_CALIBRATION;
02313 }
02314 
02315 
02316 static uint8_t rf_scale_lqi(int8_t rssi)
02317 {
02318     uint8_t scaled_lqi;
02319 
02320     /*rssi < RF sensitivity*/
02321     if(rssi < rf_sensitivity)
02322         scaled_lqi=0;
02323     /*-91 dBm < rssi < -81 dBm (AT86RF233 XPro)*/
02324     /*-90 dBm < rssi < -80 dBm (AT86RF212B XPro)*/
02325     else if(rssi < (rf_sensitivity + 10))
02326         scaled_lqi=31;
02327     /*-81 dBm < rssi < -71 dBm (AT86RF233 XPro)*/
02328     /*-80 dBm < rssi < -70 dBm (AT86RF212B XPro)*/
02329     else if(rssi < (rf_sensitivity + 20))
02330         scaled_lqi=207;
02331     /*-71 dBm < rssi < -61 dBm (AT86RF233 XPro)*/
02332     /*-70 dBm < rssi < -60 dBm (AT86RF212B XPro)*/
02333     else if(rssi < (rf_sensitivity + 30))
02334         scaled_lqi=255;
02335     /*-61 dBm < rssi < -51 dBm (AT86RF233 XPro)*/
02336     /*-60 dBm < rssi < -50 dBm (AT86RF212B XPro)*/
02337     else if(rssi < (rf_sensitivity + 40))
02338         scaled_lqi=255;
02339     /*-51 dBm < rssi < -41 dBm (AT86RF233 XPro)*/
02340     /*-50 dBm < rssi < -40 dBm (AT86RF212B XPro)*/
02341     else if(rssi < (rf_sensitivity + 50))
02342         scaled_lqi=255;
02343     /*-41 dBm < rssi < -31 dBm (AT86RF233 XPro)*/
02344     /*-40 dBm < rssi < -30 dBm (AT86RF212B XPro)*/
02345     else if(rssi < (rf_sensitivity + 60))
02346         scaled_lqi=255;
02347     /*-31 dBm < rssi < -21 dBm (AT86RF233 XPro)*/
02348     /*-30 dBm < rssi < -20 dBm (AT86RF212B XPro)*/
02349     else if(rssi < (rf_sensitivity + 70))
02350         scaled_lqi=255;
02351     /*rssi > RF saturation*/
02352     else if(rssi > (rf_sensitivity + 80))
02353         scaled_lqi=111;
02354     /*-21 dBm < rssi < -11 dBm (AT86RF233 XPro)*/
02355     /*-20 dBm < rssi < -10 dBm (AT86RF212B XPro)*/
02356     else
02357         scaled_lqi=255;
02358 
02359     return scaled_lqi;
02360 }
02361 
02362 NanostackRfPhyAtmel::NanostackRfPhyAtmel(PinName spi_mosi, PinName spi_miso,
02363         PinName spi_sclk, PinName spi_cs,  PinName spi_rst, PinName spi_slp, PinName spi_irq,
02364         PinName i2c_sda, PinName i2c_scl)
02365     : _mac(i2c_sda, i2c_scl), _mac_addr(), _rf(NULL), _mac_set(false),
02366       _spi_mosi(spi_mosi), _spi_miso(spi_miso), _spi_sclk(spi_sclk),
02367       _spi_cs(spi_cs), _spi_rst(spi_rst), _spi_slp(spi_slp), _spi_irq(spi_irq)
02368 {
02369     _rf = new RFBits(_spi_mosi, _spi_miso, _spi_sclk, _spi_cs, _spi_rst, _spi_slp, _spi_irq);
02370 }
02371 
02372 NanostackRfPhyAtmel::~NanostackRfPhyAtmel()
02373 {
02374     delete _rf;
02375 }
02376 
02377 int8_t NanostackRfPhyAtmel::rf_register()
02378 {
02379     if (NULL == _rf) {
02380         return -1;
02381     }
02382 
02383     rf_if_lock();
02384 
02385     if (rf != NULL) {
02386         rf_if_unlock();
02387         error("Multiple registrations of NanostackRfPhyAtmel not supported");
02388         return -1;
02389     }
02390 
02391     // Read the mac address if it hasn't been set by a user
02392     rf = _rf;
02393     if (!_mac_set) {
02394         int ret = _mac.read_eui64((void*)_mac_addr);
02395         if (ret < 0) {
02396             rf = NULL;
02397             rf_if_unlock();
02398             return -1;
02399         }
02400     }
02401 
02402     int8_t radio_id = rf_device_register(_mac_addr);
02403     if (radio_id < 0) {
02404         rf = NULL;
02405     }
02406 
02407     rf_if_unlock();
02408     return radio_id;
02409 }
02410 
02411 void NanostackRfPhyAtmel::rf_unregister()
02412 {
02413     rf_if_lock();
02414 
02415     if (NULL == rf) {
02416         rf_if_unlock();
02417         return;
02418     }
02419 
02420     rf_device_unregister();
02421     rf = NULL;
02422 
02423     rf_if_unlock();
02424 }
02425 
02426 void NanostackRfPhyAtmel::get_mac_address(uint8_t *mac)
02427 {
02428     rf_if_lock();
02429 
02430     if (NULL == rf) {
02431         error("NanostackRfPhyAtmel Must be registered to read mac address");
02432         rf_if_unlock();
02433         return;
02434     }
02435     memcpy((void*)mac, (void*)_mac_addr, sizeof(_mac_addr));
02436 
02437     rf_if_unlock();
02438 }
02439 
02440 void NanostackRfPhyAtmel::set_mac_address(uint8_t *mac)
02441 {
02442     rf_if_lock();
02443 
02444     if (NULL != rf) {
02445         error("NanostackRfPhyAtmel cannot change mac address when running");
02446         rf_if_unlock();
02447         return;
02448     }
02449     memcpy((void*)_mac_addr, (void*)mac, sizeof(_mac_addr));
02450     _mac_set = true;
02451 
02452     rf_if_unlock();
02453 }
02454 
02455 #endif // MBED_CONF_NANOSTACK_CONFIGURATION