my customized lib

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