/** * @brief Initializes the transceiver main interrupt * * This function sets the microcontroller specific registers * responsible for handling the transceiver interrupts * * @param trx_irq_cb Callback function for the given transceiver * interrupt */ void pal_trx_irq_init(FUNC_PTR trx_irq_cb) { /* * The AIC is configured and updated with the mode for generating * interrupt for IRQ0, which is connected to the transceiver interrupt * line. Also the interrupt handler is installed for the same. */ AIC_CONFIGURE(AT91C_ID_IRQ0, AT91C_AIC_SRCTYPE_POSITIVE_EDGE, trx_isr); /* * Set the handler function. * The handler is set before enabling the interrupt to prepare for * spurious interrupts, that can pop up the moment they are enabled. */ irq_hdl_trx = (irq_handler_t)trx_irq_cb; /* The input capture interrupt of timer is disabled. */ DISABLE_TRX_IRQ(); /* * The interrupt bit corresponding to the trx interrupt is cleared. */ CLEAR_TRX_IRQ(); }
/** * @brief Initializes the transceiver interrupts * * This function sets the microcontroller specific registers * responsible for handling the transceiver interrupts * * @param trx_irq_cb Callback function for the given transceiver * interrupt */ void pal_trx_irq_init(FUNC_PTR trx_irq_cb) { /* * Set the handler function. * The handler is set before enabling the interrupt to prepare for * spurious interrupts, that can pop up the moment they are enabled. */ irq_hdl_trx = (irq_handler_t)trx_irq_cb; /* Configure the pin and interrupt */ pal_pio_configure(&pin_radio_irq, PIO_LISTSIZE(pin_radio_irq)); pal_pio_configure_interrupt(&pin_radio_irq, (void ( *)(const pin_t *))trx_isr); /* Configure the NVIC interrupt */ NVIC_EnableIRQ(PIOB_IRQn); /* * The interrupt bit corresponding to the trx interrupt is cleared. */ CLEAR_TRX_IRQ(); }
static void generate_rand_seed(void) { uint16_t seed = 0; uint8_t cur_random_val = 0; set_trx_state(CMD_RX_ON); /* * We need to disable TRX IRQs while generating random values in RX_ON, * we do not want to receive frames at this point of time at all. */ ENTER_TRX_REGION(); /* * The 16-bit random value is generated from various 2-bit random values. */ for (uint8_t i = 0; i < 8; i++) { /* Now we can safely read the 2-bit random number. */ cur_random_val = pal_trx_bit_read(SR_RND_VALUE); seed = seed << 2; seed |= cur_random_val; } set_trx_state(CMD_FORCE_TRX_OFF); /* * Now we need to clear potential pending TRX IRQs and * enable the TRX IRQs again. */ pal_trx_reg_read(RG_IRQ_STATUS); CLEAR_TRX_IRQ(); LEAVE_TRX_REGION(); /* Set the seed for the random number generator. */ srand(seed); }