/*================================================================================================= * @fn txComplete * * @brief Transmit has completed. Perform needed maintenance and return status of * the transmit via callback function. * * @param status - status of the transmit that just went out * * @return none *================================================================================================= */ static void txComplete(uint8 status) { /* reset the retransmit flag */ txRetransmitFlag = 0; /* update tx state; turn off receiver if nothing is keeping it on */ macTxActive = MAC_TX_ACTIVE_NO_ACTIVITY; /* If no ACK is pending go to sleep sooner than wait for high level mac * to clear MAC_RX_POLL bit and then go to sleep */ if (status != MAC_ACK_PENDING) { macRxEnableFlags &= ~MAC_RX_POLL; } /* turn off receive if allowed */ macRxOffRequest(); /* update transmit power in case there was a change */ macRadioUpdateTxPower(); /* * Channel cannot change during transmit so update it here. (Channel *can* change during * a receive. The update function resets receive logic and any partially received * frame is purged.) */ macRadioUpdateChannel(); /* return status of transmit via callback function */ macTxCompleteCallback(status); }
/*================================================================================================= * @fn txComplete * * @brief Transmit has completed. Perform needed maintenance and return status of * the transmit via callback function. * * @param status - status of the transmit that just went out * * @return none *================================================================================================= */ static void txComplete(uint8 status) { /* * Unless receive is active, update power here. Power is *always* updated at end of receive. */ if (!macRxActive) { macRadioUpdateTxPower(); } /* * Channel cannot change during transmit so update it here. (Channel *can* change during * a receive. The update function resets receive logic and any partially received * frame is purged.) */ macRadioUpdateChannel(); /* reset the retransmit flag */ txRetransmitFlag = FALSE; /* update tx state; turn off receiver if nothing is keeping it on */ macTxActive = FALSE; /* turn off receive if allowed */ macRxOffRequest(); /* return status of transmit via callback function */ macTxCompleteCallback(status); }
/*================================================================================================= * @fn rxPostRxUpdates * * @brief Updates that need to be performed once receive is complete. * * It is not fatal to execute this function if somehow receive is active. Under * certain timing/interrupt conditions a new receive may have started before this * function executes. This should happen very rarely (if it happens at all) and * would cause no problems. * * @param none * * @return none *================================================================================================= */ static void rxPostRxUpdates(void) { /* turn off receiver if permitted */ macRxOffRequest(); /* update the transmit power, update may have been blocked by transmit of outgoing ACK */ macRadioUpdateTxPower(); /* initiate and transmit that was queued during receive */ macTxStartQueuedFrame(); }
MAC_INTERNAL_API void macRadioSetTxPower(uint8 txPower) { halIntState_t s; /* same as above but with no lookup table, use raw register value */ HAL_ENTER_CRITICAL_SECTION(s); reqTxPower = txPower; HAL_EXIT_CRITICAL_SECTION(s); /* update the radio power setting */ macRadioUpdateTxPower(); }
MAC_INTERNAL_API uint8 macRadioSetTxPower(uint8 txPower) { halIntState_t s; #if defined MAC_RUNTIME_CC2591 || defined MAC_RUNTIME_CC2590 || \ defined MAC_RUNTIME_CC2592 const uint8 CODE *pTable = macRadioDefsTxPwrTables[macRadioDefsRefTableId >> 4]; #elif defined HAL_PA_LNA || defined HAL_PA_LNA_CC2590 || \ defined HAL_PA_LNA_CC2592 const uint8 CODE *pTable = macRadioDefsTxPwrTables[0]; #else const uint8 CODE *pTable = macRadioDefsTxPwrBare; #endif /* if the selected dBm is out of range, use the closest available */ if ((int8)txPower > (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]) { /* greater than base value -- out of table range */ txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]; } else if ((int8)txPower < (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]) { /* smaller than the lowest power level -- out of table range */ txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]; } /* * Set the global variable reqTxPower. This variable is referenced * by the function macRadioUpdateTxPower() to write the radio register. * * A lookup table is used to translate the power level to the register * value. */ HAL_ENTER_CRITICAL_SECTION(s); /* When calculating index to the power register value table, * either txPower (of uint8 type) has to be explicitly type-casted to int8 * or the subtraction expression has to be type-casted to uint8 to work * with the integral promotions. * The latter is more code size efficient and hence the latter is used. */ { uint8 index = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY] - txPower + MAC_RADIO_DEFS_TBL_TXPWR_ENTRIES; reqTxPower = pTable[index]; } HAL_EXIT_CRITICAL_SECTION(s); /* update the radio power setting */ macRadioUpdateTxPower(); return txPower; }
MAC_INTERNAL_API uint8 macRadioSetTxPower(uint8 txPower) { halIntState_t s; const uint8 CODE *pTable; /* abstracted power table selection */ MAC_RADIO_SELECT_PTABLE(pTable); /* if the selected dBm is out of range, use the closest available */ if ((int8)txPower > (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]) { /* greater than base value -- out of table range */ txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]; } else if ((int8)txPower < (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]) { /* smaller than the lowest power level -- out of table range */ txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]; } /* * Set the global variable reqTxPower. This variable is referenced * by the function macRadioUpdateTxPower() to write the radio register. * * A lookup table is used to translate the power level to the register * value. */ HAL_ENTER_CRITICAL_SECTION(s); /* When calculating index to the power register value table, * either txPower (of uint8 type) has to be explicitly type-casted to int8 * or the subtraction expression has to be type-casted to uint8 to work * with the integral promotions. * The latter is more code size efficient and hence the latter is used. */ { uint8 index = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY] - txPower + MAC_RADIO_DEFS_TBL_TXPWR_ENTRIES; reqTxPower = pTable[index]; /* abstracted boost mode selection */ MAC_RADIO_SELECT_BOOST_MODE(reqTxPower); } HAL_EXIT_CRITICAL_SECTION(s); /* update the radio power setting */ macRadioUpdateTxPower(); return txPower; }
MAC_INTERNAL_API uint8 macRadioSetTxPower(uint8 txPower) { halIntState_t s; /* same as above but with no lookup table, use raw register value */ HAL_ENTER_CRITICAL_SECTION(s); reqTxPower = txPower; MAC_RADIO_SELECT_BOOST_MODE(reqTxPower); HAL_EXIT_CRITICAL_SECTION(s); /* update the radio power setting */ macRadioUpdateTxPower(); return txPower; }
/*================================================================================================= * @fn txComplete * * @brief Transmit has completed. Perform needed maintenance and return status of * the transmit via callback function. * * @param status - status of the transmit that just went out * * @return none *================================================================================================= */ static void txComplete(uint8 status) { /* reset the retransmit flag */ txRetransmitFlag = 0; /* update tx state; turn off receiver if nothing is keeping it on */ macTxActive = MAC_TX_ACTIVE_NO_ACTIVITY; if(pMacPib->rf4cepowerSavings) { /* mark receive as inactive */ macRxActive = MAC_RX_ACTIVE_NO_ACTIVITY; } /* In general, the MAC_RX_POLL is controlled by high level MAC. The flag is * cleared here when no ACK is pending to allow the RX to be turned off sooner * in order to save power. */ if (status != MAC_ACK_PENDING) { macRxEnableFlags &= ~MAC_RX_POLL; } /* turn off receive if allowed */ macRxOffRequest(); /* update transmit power in case there was a change */ macRadioUpdateTxPower(); /* * Channel cannot change during transmit so update it here. (Channel *can* change during * a receive. The update function resets receive logic and any partially received * frame is purged.) */ macRadioUpdateChannel(); /* return status of transmit via callback function */ macTxCompleteCallback(status); }
void macRadioSetTxPower(uint8 txPower) { halIntState_t s; /* if the selected dBm is out of range, use the closest available */ if (txPower > MAC_RADIO_TX_POWER_MAX_MINUS_DBM) { txPower = MAC_RADIO_TX_POWER_MAX_MINUS_DBM; } /* * Set the global variable reqTxPower. This variable is referenced * by the function macRadioUpdateTxPower() to write the radio register. * * A lookup table is used to translate the power level to the register * value. */ HAL_ENTER_CRITICAL_SECTION(s); reqTxPower = macRadioDefsTxPowerTable[txPower]; HAL_EXIT_CRITICAL_SECTION(s); /* update the radio power setting */ macRadioUpdateTxPower(); }
/*================================================================================================= * @fn txComplete * * @brief Transmit has completed. Perform needed maintenance and return status of * the transmit via callback function. * * @param status - status of the transmit that just went out * * @return none *================================================================================================= */ static void txComplete(uint8 status) { /* reset the retransmit flag */ txRetransmitFlag = 0; /* update tx state; turn off receiver if nothing is keeping it on */ macTxActive = MAC_TX_ACTIVE_NO_ACTIVITY; /* turn off receive if allowed */ macRxOffRequest(); /* update transmit power in case there was a change */ macRadioUpdateTxPower(); /* * Channel cannot change during transmit so update it here. (Channel *can* change during * a receive. The update function resets receive logic and any partially received * frame is purged.) */ macRadioUpdateChannel(); /* return status of transmit via callback function */ macTxCompleteCallback(status); }