/* * \brief Function initialises and registers the RF driver. * * \param none * * \return rf_radio_driver_id Driver ID given by NET library */ static int8_t rf_device_register(void) { // If we already exist, bail. if(radio_state != RADIO_UNINIT) { return -1; } SL_DEBUG_PRINT("rf_device_register: entry\n"); #if MBED_CONF_SL_RAIL_BAND == 2400 RADIO_PA_Init((RADIO_PAInit_t*)&paInit2p4); #elif (MBED_CONF_SL_RAIL_BAND == 915) || (MBED_CONF_SL_RAIL_BAND == 868) RADIO_PA_Init((RADIO_PAInit_t*)&paInitSubGhz); #endif // Set up PTI since it makes life so much easier #if defined(MBED_CONF_SL_RAIL_PTI) && (MBED_CONF_SL_RAIL_PTI == 1) RADIO_PTIInit_t ptiInit = { MBED_CONF_SL_RAIL_PTI_MODE, MBED_CONF_SL_RAIL_PTI_BAUDRATE, MBED_CONF_SL_RAIL_PTI_DOUT_LOCATION, MBED_CONF_SL_RAIL_PTI_DOUT_PORT, MBED_CONF_SL_RAIL_PTI_DOUT_PIN, MBED_CONF_SL_RAIL_PTI_DCLK_LOCATION, MBED_CONF_SL_RAIL_PTI_DCLK_PORT, MBED_CONF_SL_RAIL_PTI_DCLK_PIN, MBED_CONF_SL_RAIL_PTI_DFRAME_LOCATION, MBED_CONF_SL_RAIL_PTI_DFRAME_PORT, MBED_CONF_SL_RAIL_PTI_DFRAME_PIN }; RADIO_PTI_Init(&ptiInit); #endif // Set up RAIL RAIL_RfInit(&railInitParams); RAIL_ChannelConfig(&channels); #if (MBED_CONF_SL_RAIL_BAND == 2400) RAIL_RadioConfig((void*) ieee802154_config_base); channel = 11; #elif (MBED_CONF_SL_RAIL_BAND == 915) RAIL_RadioConfig((void*) ieee802154_config_915); channel = 1; #elif (MBED_CONF_SL_RAIL_BAND == 868) RAIL_RadioConfig((void*) ieee802154_config_863); channel = 0; #endif RAIL_IEEE802154_Init((RAIL_IEEE802154_Config_t*)&config); /* Get real MAC address */ /* MAC is stored MSB first */ memcpy(MAC_address, (const void*)&DEVINFO->UNIQUEH, 4); memcpy(&MAC_address[4], (const void*)&DEVINFO->UNIQUEL, 4); /*Set pointer to MAC address*/ device_driver.PHY_MAC = MAC_address; device_driver.driver_description = (char*)"EFR32_154"; /*Type of RF PHY*/ #if MBED_CONF_SL_RAIL_BAND == 2400 device_driver.link_type = PHY_LINK_15_4_2_4GHZ_TYPE; #elif (MBED_CONF_SL_RAIL_BAND == 915) || (MBED_CONF_SL_RAIL_BAND == 868) device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE; #endif device_driver.phy_channel_pages = phy_channel_pages; /*Maximum size of payload is 127*/ device_driver.phy_MTU = 127; /*1 byte header in PHY layer (length)*/ device_driver.phy_header_length = 1; /*No tail in PHY layer*/ device_driver.phy_tail_length = 0; /*Set address write function*/ device_driver.address_write = &rf_address_write; /*Set RF extension function*/ device_driver.extension = &rf_extension; /*Set RF state control function*/ device_driver.state_control = &rf_interface_state_control; /*Set transmit function*/ device_driver.tx = &rf_start_cca; /*Upper layer callbacks init to NULL, get populated by arm_net_phy_register*/ device_driver.phy_rx_cb = NULL; device_driver.phy_tx_done_cb = NULL; /*Virtual upper data callback init to NULL*/ device_driver.arm_net_virtual_rx_cb = NULL; device_driver.arm_net_virtual_tx_cb = NULL; /*Register device driver*/ rf_radio_driver_id = arm_net_phy_register(&device_driver); // If the radio hasn't called the ready callback by now, place it in the initing state if(radio_state == RADIO_UNINIT) { radio_state = RADIO_INITING; } #ifdef MBED_CONF_RTOS_PRESENT rx_queue_head = 0; rx_queue_tail = 0; rf_thread_id = osThreadCreate(osThread(rf_thread_loop), NULL); #endif return rf_radio_driver_id; }
/* * \brief Function initialises and registers the RF driver. * * \param none * * \return rf_radio_driver_id Driver ID given by NET library */ static int8_t rf_device_register(void) { // If we already exist, bail. if(radio_state != RADIO_UNINIT) { return -1; } #if MBED_CONF_SL_RAIL_BAND == 2400 RADIO_PA_Init((RADIO_PAInit_t*)&paInit2p4); #elif (MBED_CONF_SL_RAIL_BAND == 915) || (MBED_CONF_SL_RAIL_BAND == 868) RADIO_PA_Init((RADIO_PAInit_t*)&paInitSubGhz); #endif // Set up PTI since it makes life so much easier #if defined(DEVICE_SL_PTI) RADIO_PTIInit_t ptiInit = { RADIO_PTI_MODE_UART, 1600000, 6, // TODO: Configure PTI pinout using config system. // Not very urgent, since all boards use the same pins now. gpioPortB, 12, 6, gpioPortB, 11, 6, gpioPortB, 13, }; RADIO_PTI_Init(&ptiInit); #endif // Set up RAIL RAIL_RfInit(&railInitParams); RAIL_ChannelConfig(&channels); #if MBED_CONF_SL_RAIL_BAND == 2400 RAIL_RadioConfig((void*) ieee802154_config_base); channel = 11; #elif (MBED_CONF_SL_RAIL_BAND == 915) RAIL_RadioConfig((void*) ieee802154_config_915); channel = 1; #elif MBED_CONF_SL_RAIL_BAND == 868 RAIL_RadioConfig((void*) ieee802154_config_863); channel = 0; #endif RAIL_IEEE802154_Init((RAIL_IEEE802154_Config_t*)&config); /* Get real MAC address */ /* MAC is stored MSB first */ memcpy(MAC_address, (const void*)&DEVINFO->UNIQUEH, 4); memcpy(&MAC_address[4], (const void*)&DEVINFO->UNIQUEL, 4); /*Set pointer to MAC address*/ device_driver.PHY_MAC = MAC_address; device_driver.driver_description = (char*)"EFR32_154"; /*Type of RF PHY*/ #if MBED_CONF_SL_RAIL_BAND == 2400 device_driver.link_type = PHY_LINK_15_4_2_4GHZ_TYPE; #elif (MBED_CONF_SL_RAIL_BAND == 915) || (MBED_CONF_SL_RAIL_BAND == 868) device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE; #endif device_driver.phy_channel_pages = phy_channel_pages; /*Maximum size of payload is 127*/ device_driver.phy_MTU = 127; /*1 byte header in PHY layer (length)*/ device_driver.phy_header_length = 1; /*No tail in PHY layer*/ device_driver.phy_tail_length = 0; /*Set address write function*/ device_driver.address_write = &rf_address_write; /*Set RF extension function*/ device_driver.extension = &rf_extension; /*Set RF state control function*/ device_driver.state_control = &rf_interface_state_control; /*Set transmit function*/ device_driver.tx = &rf_start_cca; /*Upper layer callbacks init to NULL, get populated by arm_net_phy_register*/ device_driver.phy_rx_cb = NULL; device_driver.phy_tx_done_cb = NULL; /*Virtual upper data callback init to NULL*/ device_driver.arm_net_virtual_rx_cb = NULL; device_driver.arm_net_virtual_tx_cb = NULL; /*Register device driver*/ rf_radio_driver_id = arm_net_phy_register(&device_driver); // If the radio hasn't called the ready callback by now, place it in the initing state if(radio_state == RADIO_UNINIT) { radio_state = RADIO_INITING; } return rf_radio_driver_id; }