static void ezradio_int_callback() { //DPRINT("ezradio ISR"); ezradio_cmd_reply_t ezradioReply; ezradio_cmd_reply_t radioReplyLocal; ezradio_get_int_status(0x0, 0x0, 0x0, &ezradioReply); //ezradio_frr_a_read(3, &ezradioReply); //DPRINT(" - INT_PEND %s", byte_to_binary(ezradioReply.FRR_A_READ.FRR_A_VALUE)); DPRINT(" - INT_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.INT_PEND)); // DPRINT(" - INT_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.INT_STATUS)); // DPRINT(" - PH_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.PH_PEND)); //DPRINT(" - PH_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.PH_STATUS)); //DPRINT(" - PH_STATUS %s", byte_to_binary(ezradioReply.FRR_A_READ.FRR_B_VALUE)); // DPRINT(" - MODEM_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.MODEM_PEND)); // DPRINT(" - MODEM_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.MODEM_STATUS)); // DPRINT(" - CHIP_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.CHIP_PEND)); // DPRINT(" - CHIP_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.CHIP_STATUS)); //if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_PH_INT_PEND_BIT) if (ezradioReply.GET_INT_STATUS.INT_PEND & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_PH_INT_PEND_BIT) { //DPRINT("PH ISR"); switch(current_state) { case HW_RADIO_STATE_RX: if ((ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_PACKET_RX_BIT) || (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_RX_FIFO_ALMOST_FULL_BIT)) { //DPRINT("PACKET_RX IRQ"); if(rx_packet_callback != NULL) { /* Check how many bytes we received. */ ezradio_fifo_info(0, &radioReplyLocal); DPRINT("RX ISR packetLength: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); if (rx_fifo_data_lenght == 0) { DPRINT("RX FIFO: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); uint8_t buffer[4]; ezradio_read_rx_fifo(4, buffer); if (current_rx_cfg.channel_id.channel_header.ch_coding == PHY_CODING_FEC_PN9) { uint8_t fec_buffer[4]; memcpy(fec_buffer, buffer, 4); fec_decode_packet(fec_buffer, 4, 4); expected_data_length = fec_calculated_decoded_length(fec_buffer[0]+1); DPRINT("RX Packet Length: %d / %d", fec_buffer[0], expected_data_length); } else { expected_data_length = buffer[0] + 1; } rx_packet = alloc_packet_callback(expected_data_length); memcpy(rx_packet->data, buffer, 4); rx_fifo_data_lenght += 4; radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT-=4; } if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_PACKET_RX_BIT) { /* Read out the RX FIFO content. */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); //ezradio_read_rx_fifo(radioReplyLocal2.PACKET_INFO.LENGTH, packet->data); ezradio_handle_end_of_packet(); return; } if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_RX_FIFO_ALMOST_FULL_BIT) { while (radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT > 0) { DPRINT("RX FIFO: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); /* Read out the FIFO Count bytes of RX FIFO */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); rx_fifo_data_lenght += radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT; //DPRINT("%d of %d bytes collected", rx_fifo_data_lenght, rx_packet->data[0]+1); ezradio_fifo_info(0, &radioReplyLocal); if (rx_fifo_data_lenght >= expected_data_length) { ezradio_handle_end_of_packet(); return; } } ezradio_int_callback(); return; } } } else if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT) //} else if ( ezradioReply.FRR_A_READ.FRR_B_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT) { DPRINT("- PACKET_RX CRC_ERROR IRQ"); /* Check how many bytes we received. */ ezradio_fifo_info(0, &radioReplyLocal); DPRINT("RX ISR packetLength: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); //ezradio_cmd_reply_t radioReplyLocal2; //ezradio_get_packet_info(0, 0, 0, &radioReplyLocal2); if (rx_fifo_data_lenght == 0) { rx_packet = alloc_packet_callback(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); } /* Read out the RX FIFO content. */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); rx_packet->rx_meta.crc_status = HW_CRC_INVALID; rx_packet->length = rx_packet->data[0] + 1; DPRINT_DATA(rx_packet->data, rx_packet->length); DEBUG_RX_END(); if(rx_packet_callback != NULL) rx_packet_callback(rx_packet); else release_packet_callback(rx_packet); if(current_state == HW_RADIO_STATE_RX) { start_rx(¤t_rx_cfg); } } else { DPRINT((" - OTHER RX IRQ")); } break; case HW_RADIO_STATE_TX: if (ezradioReply.GET_INT_STATUS.PH_PEND & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) //if (ezradioReply.FRR_A_READ.FRR_C_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) { DPRINT("PACKET_SENT IRQ"); DEBUG_TX_END(); if(tx_packet_callback != 0) { current_packet->tx_meta.timestamp = timer_get_counter_value(); DPRINT_DATA(current_packet->data, current_packet->length); tx_packet_callback(current_packet); } /* We can't switch back to Rx since the Rx callbacks are modified * during CCA, so we systematically go to idle */ switch_to_idle_mode(); // } else if (ezradioReply.FRR_A_READ.FRR_C_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_TX_FIFO_ALMOST_EMPTY_PEND_BIT) // { // DPRINT(" - TX FIFO Almost empty IRQ "); // // ezradio_fifo_info(0, &radioReplyLocal); // DPRINT("TX FIFO Space: %d", radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE); // // //Fill fifo // #ifdef HAL_RADIO_USE_HW_CRC // int16_t new_length = current_packet->length-1 - tx_fifo_data_length; // #else // int16_t new_length = current_packet->length+1 - tx_fifo_data_length; // #endif // if (new_length > radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE) new_length = radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE; // // while (new_length > 0) // { // ezradio_write_tx_fifo(new_length, &(current_packet->data[tx_fifo_data_length])); // tx_fifo_data_length += new_length; // DPRINT ("%d added -> %d", new_length, tx_fifo_data_length); // // #ifdef HAL_RADIO_USE_HW_CRC // new_length = current_packet->length-1 - tx_fifo_data_length; // #else // new_length = current_packet->length+1 - tx_fifo_data_length; // #endif // if (new_length > radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE) new_length = radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE; // } // // if (new_length == 0) // { // DPRINT("reprocess callback"); // ezradio_int_callback(); // return; // } // // DPRINT ("%d added -> %d", new_length, tx_fifo_data_length); } else { DPRINT(" - OTHER IRQ"); } break; default: //assert(false); DPRINT("State: %d", current_state); } } // if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_MODEM_INT_PEND_BIT) // { // DPRINT("MODEM ISR"); // } // if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_CHIP_INT_PEND_BIT) // { // DPRINT("CHIP ISR"); // // if (current_state != HW_RADIO_STATE_IDLE) // { // if (ezradioReply.GET_INT_STATUS.CHIP_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_CHIP_STATUS_STATE_CHANGE_BIT) // { // ezradio_request_device_state(&radioReplyLocal); // DPRINT(" - Current State %d", radioReplyLocal.REQUEST_DEVICE_STATE.CURR_STATE); // DPRINT(" - Current channel %d", radioReplyLocal.REQUEST_DEVICE_STATE.CURRENT_CHANNEL); // }else { // DPRINT(" - OTHER IRQ"); // } // } // } }
static void ezradio_int_callback() { //DPRINT("ezradio ISR"); ezradio_cmd_reply_t ezradioReply; ezradio_cmd_reply_t radioReplyLocal; ezradio_get_int_status(0x0, 0x0, 0x0, &ezradioReply); //ezradio_frr_a_read(3, &ezradioReply); //DPRINT(" - INT_PEND %s", byte_to_binary(ezradioReply.FRR_A_READ.FRR_A_VALUE)); // DPRINT(" - INT_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.INT_PEND)); // DPRINT(" - INT_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.INT_STATUS)); // DPRINT(" - PH_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.PH_PEND)); //DPRINT(" - PH_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.PH_STATUS)); //DPRINT(" - PH_STATUS %s", byte_to_binary(ezradioReply.FRR_A_READ.FRR_B_VALUE)); // DPRINT(" - MODEM_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.MODEM_PEND)); // DPRINT(" - MODEM_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.MODEM_STATUS)); // DPRINT(" - CHIP_PEND %s", byte_to_binary(ezradioReply.GET_INT_STATUS.CHIP_PEND)); // DPRINT(" - CHIP_STATUS %s", byte_to_binary(ezradioReply.GET_INT_STATUS.CHIP_STATUS)); //if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_PH_INT_PEND_BIT) if (ezradioReply.GET_INT_STATUS.INT_PEND & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_PH_INT_PEND_BIT) { //DPRINT("PH ISR"); switch(current_state) { case HW_RADIO_STATE_RX: if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_PACKET_RX_BIT) //if (ezradioReply.FRR_A_READ.FRR_B_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_PACKET_RX_BIT) { DPRINT("PACKET_RX IRQ"); if(rx_packet_callback != NULL) { /* Check how many bytes we received. */ ezradio_fifo_info(0, &radioReplyLocal); DPRINT("RX ISR packetLength: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); //ezradio_cmd_reply_t radioReplyLocal2; //ezradio_get_packet_info(0, 0, 0, &radioReplyLocal2); if (rx_fifo_data_lenght == 0) { rx_packet = alloc_packet_callback(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); } // hw_radio_packet_t* packet = alloc_packet_callback(radioReplyLocal2.PACKET_INFO.LENGTH); // packet->length = radioReplyLocal2.PACKET_INFO.LENGTH; /* Read out the RX FIFO content. */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); //ezradio_read_rx_fifo(radioReplyLocal2.PACKET_INFO.LENGTH, packet->data); ezradio_handle_end_of_packet(); } } else if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_RX_FIFO_ALMOST_FULL_BIT) //} else if (ezradioReply.FRR_A_READ.FRR_B_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_RX_FIFO_ALMOST_FULL_BIT) { //DPRINT("- RX FIFO almost full IRQ"); ezradio_fifo_info(0, &radioReplyLocal); if (rx_fifo_data_lenght == 0) { DPRINT("RX FIFO: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); uint8_t buffer[4]; ezradio_read_rx_fifo(4, buffer); uint8_t length = buffer[0]; if (current_rx_cfg.channel_id.channel_header.ch_coding == PHY_CODING_FEC_PN9) { uint8_t fec_buffer[4]; memcpy(fec_buffer, buffer, 4); fec_decode_packet(fec_buffer, 4, 4); length = fec_calculated_decoded_length(fec_buffer[0]+1); DPRINT("RX Packet Length: %d / %d", fec_buffer[0], length); } rx_packet = alloc_packet_callback(length+1); rx_packet->length = length; memcpy(rx_packet->data, buffer, 4); rx_fifo_data_lenght += 4; radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT-=4; } while (radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT > 0) { DPRINT("RX FIFO: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); /* Read out the FIFO Count bytes of RX FIFO */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); rx_fifo_data_lenght += radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT; //DPRINT("%d of %d bytes collected", rx_fifo_data_lenght, rx_packet->data[0]+1); ezradio_fifo_info(0, &radioReplyLocal); if (rx_fifo_data_lenght >= rx_packet->length + 1) { ezradio_handle_end_of_packet(); return; } } ezradio_int_callback(); return; } else if (ezradioReply.GET_INT_STATUS.PH_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT) //} else if ( ezradioReply.FRR_A_READ.FRR_B_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT) { DPRINT("- PACKET_RX CRC_ERROR IRQ"); /* Check how many bytes we received. */ ezradio_fifo_info(0, &radioReplyLocal); DPRINT("RX ISR packetLength: %d", radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); //ezradio_cmd_reply_t radioReplyLocal2; //ezradio_get_packet_info(0, 0, 0, &radioReplyLocal2); if (rx_fifo_data_lenght == 0) { rx_packet = alloc_packet_callback(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT); } /* Read out the RX FIFO content. */ ezradio_read_rx_fifo(radioReplyLocal.FIFO_INFO.RX_FIFO_COUNT, &(rx_packet->data[rx_fifo_data_lenght])); rx_packet->rx_meta.crc_status = HW_CRC_INVALID; rx_packet->length = rx_packet->data[0] + 1; DPRINT_PACKET(rx_packet, false); DEBUG_RX_END(); if(rx_packet_callback != NULL) rx_packet_callback(rx_packet); else release_packet_callback(rx_packet); if(current_state == HW_RADIO_STATE_RX) { start_rx(¤t_rx_cfg); } } else { DPRINT((" - OTHER RX IRQ")); } break; case HW_RADIO_STATE_TX: if (ezradioReply.GET_INT_STATUS.PH_PEND & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) //if (ezradioReply.FRR_A_READ.FRR_C_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) { DPRINT("PACKET_SENT IRQ"); DEBUG_TX_END(); if(!should_rx_after_tx_completed) switch_to_idle_mode(); current_packet->tx_meta.timestamp = timer_get_counter_value(); DPRINT_PACKET(current_packet, true); if(tx_packet_callback != 0) tx_packet_callback(current_packet); if(should_rx_after_tx_completed) { // RX requested while still in TX ... // TODO this could probably be further optimized by not going into IDLE // after RX by setting TXOFF_MODE to RX (if the cfg is the same at least) should_rx_after_tx_completed = false; start_rx(¤t_rx_cfg); } // } else if (ezradioReply.FRR_A_READ.FRR_C_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_PH_PEND_TX_FIFO_ALMOST_EMPTY_PEND_BIT) // { // DPRINT(" - TX FIFO Almost empty IRQ "); // // ezradio_fifo_info(0, &radioReplyLocal); // DPRINT("TX FIFO Space: %d", radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE); // // //Fill fifo // #ifdef HAL_RADIO_USE_HW_CRC // int16_t new_length = current_packet->length-1 - tx_fifo_data_length; // #else // int16_t new_length = current_packet->length+1 - tx_fifo_data_length; // #endif // if (new_length > radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE) new_length = radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE; // // while (new_length > 0) // { // ezradio_write_tx_fifo(new_length, &(current_packet->data[tx_fifo_data_length])); // tx_fifo_data_length += new_length; // DPRINT ("%d added -> %d", new_length, tx_fifo_data_length); // // #ifdef HAL_RADIO_USE_HW_CRC // new_length = current_packet->length-1 - tx_fifo_data_length; // #else // new_length = current_packet->length+1 - tx_fifo_data_length; // #endif // if (new_length > radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE) new_length = radioReplyLocal.FIFO_INFO.TX_FIFO_SPACE; // } // // if (new_length == 0) // { // DPRINT("reprocess callback"); // ezradio_int_callback(); // return; // } // // DPRINT ("%d added -> %d", new_length, tx_fifo_data_length); } else { DPRINT(" - OTHER IRQ"); } break; default: //assert(false); DPRINT("State: %d", current_state); } } // if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_MODEM_INT_PEND_BIT) // { // DPRINT("MODEM ISR"); // } // if (ezradioReply.FRR_A_READ.FRR_A_VALUE & EZRADIO_CMD_GET_INT_STATUS_REP_INT_PEND_CHIP_INT_PEND_BIT) // { // DPRINT("CHIP ISR"); // // if (current_state != HW_RADIO_STATE_IDLE) // { // if (ezradioReply.GET_INT_STATUS.CHIP_STATUS & EZRADIO_CMD_GET_INT_STATUS_REP_CHIP_STATUS_STATE_CHANGE_BIT) // { // ezradio_request_device_state(&radioReplyLocal); // DPRINT(" - Current State %d", radioReplyLocal.REQUEST_DEVICE_STATE.CURR_STATE); // DPRINT(" - Current channel %d", radioReplyLocal.REQUEST_DEVICE_STATE.CURRENT_CHANNEL); // }else { // DPRINT(" - OTHER IRQ"); // } // } // } }