Пример #1
0
/**
 * @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;
}
Пример #2
0
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;
}
Пример #3
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() */