/** * @brief Parses received frame and create the frame_info_t structure * * This function parses the received frame and creates the frame_info_t * structure to be sent to the MAC as a parameter of tal_rx_frame_cb(). * * @param trx_id Transceiver identifier */ static bool upload_frame(trx_id_t trx_id) { if (tal_rx_buffer[trx_id] == NULL) { Assert("no tal_rx_buffer available" == 0); return false; } rx_frm_info[trx_id] = (frame_info_t *)BMM_BUFFER_POINTER( tal_rx_buffer[trx_id]); /* Get Rx frame length */ uint16_t reg_offset = RF_BASE_ADDR_OFFSET * trx_id; uint16_t phy_frame_len; trx_read(reg_offset + RG_BBC0_RXFLL, (uint8_t *)&phy_frame_len, 2); rx_frm_info[trx_id]->len_no_crc = phy_frame_len - tal_pib[trx_id].FCSLen; /* Update payload pointer to store received frame. */ rx_frm_info[trx_id]->mpdu = (uint8_t *)rx_frm_info[trx_id] + LARGE_BUFFER_SIZE - phy_frame_len - ED_VAL_LEN - LQI_LEN; #ifdef ENABLE_TSTAMP /* Store the timestamp. */ rx_frm_info[trx_id]->time_stamp = fs_tstamp[trx_id]; #endif /* Upload received frame to buffer */ #ifdef UPLOAD_CRC uint16_t len = rx_frm_info[trx_id]->len_no_crc + tal_pib[trx_id].FCSLen; #else uint16_t len = rx_frm_info[trx_id]->len_no_crc; #endif uint16_t rx_frm_buf_offset = BB_RX_FRM_BUF_OFFSET * trx_id; trx_read(rx_frm_buf_offset + RG_BBC0_FBRXS, rx_frm_info[trx_id]->mpdu, len); return true; }
int trx_rx_one() { uint32_t length = 0; uint8_t *buffer; buffer = (uint8_t *)malloc(sizeof(uint8_t)*PKT_BUF_SIZE); memset(buffer, 0, sizeof(uint8_t)*PKT_BUF_SIZE); trx_read(buffer, &length); if(length <= 0){ free(buffer); return -1; } trx_rxq_push(buffer, length); return 0; }
/** * @brief Transceiver interrupt handler * * This function handles the transceiver interrupt. It reads all IRQs from the * transceivers and stores them to a variable. If a transceiver is currently * sleeping, then the IRQs are not handled. * The actual processing of the IRQs is triggered from tal_task(). */ void trx_irq_handler_cb(void) { #ifdef IRQ_DEBUGGING uint32_t now; pal_get_current_time(&now); #endif /* Get all IRQS values */ uint8_t irqs_array[4]; trx_read(RG_RF09_IRQS, irqs_array, 4); /* Handle BB IRQS */ for (uint8_t trx_id = 0; trx_id < NUM_TRX; trx_id++) { if (tal_state[trx_id] == TAL_SLEEP) { continue; } bb_irq_t irqs = (bb_irq_t)irqs_array[trx_id + 2]; if (irqs != BB_IRQ_NO_IRQ) { if (irqs & BB_IRQ_RXEM) { irqs &= (uint8_t)(~((uint32_t)BB_IRQ_RXEM)); /* * avoid * Pa091 */ } if (irqs & BB_IRQ_RXAM) { irqs &= (uint8_t)(~((uint32_t)BB_IRQ_RXAM)); /* * avoid * Pa091 */ } if (irqs & BB_IRQ_AGCR) { irqs &= (uint8_t)(~((uint32_t)BB_IRQ_AGCR)); /* * avoid * Pa091 */ #ifdef IRQ_DEBUGGING per[trx_id].agcr++; printf("AGCR %" PRIu32 "\n", now); #endif #if (defined RF215V1) && (!defined BASIC_MODE) /* Workaround for errata reference #4830 */ if ((irqs & BB_IRQ_RXFE) == 0) { uint16_t reg_offset = RF_BASE_ADDR_OFFSET * trx_id; trx_bit_write( reg_offset + SR_BBC0_AMCS_AACK, 0); trx_bit_write( reg_offset + SR_BBC0_AMCS_AACK, 1); } #endif } if (irqs & BB_IRQ_AGCH) { irqs &= (uint8_t)(~((uint32_t)BB_IRQ_AGCH)); /* * avoid * Pa091 */ #ifdef IRQ_DEBUGGING per[trx_id].agch++; printf("AGCH %" PRIu32 "\n", now); #endif } if (irqs & BB_IRQ_RXFS) { #ifdef ENABLE_TSTAMP pal_get_current_time(&fs_tstamp[trx_id]); #endif irqs &= (uint8_t)(~((uint32_t)BB_IRQ_RXFS)); /* * avoid * Pa091 */ #ifdef IRQ_DEBUGGING per[trx_id].rxfs++; printf("RXFS %" PRIu32 "\n", now); #endif } if (irqs & BB_IRQ_RXFE) { pal_get_current_time(&rxe_txe_tstamp[trx_id]); #ifdef IRQ_DEBUGGING per[trx_id].rxfe++; printf("RXFE %" PRIu32 "\n", now); #endif } if (irqs & BB_IRQ_TXFE) { /* used for IFS and for MEASURE_ON_AIR_DURATION **/ pal_get_current_time(&rxe_txe_tstamp[trx_id]); /* tal_rx_enable(trx_id, PHY_RX_ON);//abi */ } /* * Store remaining flags to global TAL variable and * handle them within tal_task() */ tal_bb_irqs[trx_id] |= irqs; } } /* Handle RF IRQS */ for (uint8_t trx_id = 0; trx_id < NUM_TRX; trx_id++) { if (tal_state[trx_id] == TAL_SLEEP) { continue; } rf_irq_t irqs = (rf_irq_t)irqs_array[trx_id]; if (irqs != RF_IRQ_NO_IRQ) { if (irqs & RF_IRQ_TRXRDY) { irqs &= (uint8_t)(~((uint32_t)RF_IRQ_TRXRDY)); /* * avoid * Pa091 */ } if (irqs & RF_IRQ_TRXERR) { } if (irqs & RF_IRQ_BATLOW) { } if (irqs & RF_IRQ_WAKEUP) { } if (irqs & RF_IRQ_IQIFSF) { } if (irqs & RF_IRQ_EDC) { } tal_rf_irqs[trx_id] |= irqs; } } } /* trx_irq_handler_cb() */