Esempio n. 1
0
/**************************************************************************************************
 * @fn          macRadioUpdateChannel
 *
 * @brief       Update the radio channel if a new channel has been requested.
 *
 * @param       none
 *
 * @return      none
 **************************************************************************************************
 */
MAC_INTERNAL_API void macRadioUpdateChannel(void)
{
  halIntState_t  s;

  MAC_ASSERT(!macTxActive); /* cannot change channel during a transmit */

  /* if the channel has changed, set the radio to the new channel */
  HAL_ENTER_CRITICAL_SECTION(s);
  if (reqChannel != macPhyChannel)
  {
    macPhyChannel = reqChannel;
    HAL_EXIT_CRITICAL_SECTION(s);

    /* changing the channel stops any receive in progress */
    macRxOff();
    MAC_RADIO_SET_CHANNEL(macPhyChannel);

    /* If the channel is updated in the middle of receiving a frame, we must
     * clean up the Rx logic.
     */
    macRxHaltCleanup();

    macRxOnRequest();
  }
  else
  {
    HAL_EXIT_CRITICAL_SECTION(s);
  }
}
Esempio n. 2
0
/**************************************************************************************************
 * @fn          znpTestRF
 *
 * @brief       This function initializes and checks the ZNP RF Test Mode NV items. It is designed
 *              to be invoked before/instead of MAC radio initialization.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 */
void znpTestRF(void)
{
  uint8 rfTestParms[4] = { 0, 0, 0, 0 };

  if ((SUCCESS != osal_nv_item_init(ZNP_NV_RF_TEST_PARMS, 4, rfTestParms))  ||
      (SUCCESS != osal_nv_read(ZNP_NV_RF_TEST_PARMS, 0, 4, rfTestParms)) ||
      (rfTestParms[0] == 0))
  {
    return;
  }

  // Settings from SmartRF Studio
  MDMCTRL0 = 0x85;
  RXCTRL = 0x3F;
  FSCTRL = 0x5A;
  FSCAL1 = 0x2B;
  AGCCTRL1 = 0x11;
  ADCTEST0 = 0x10;
  ADCTEST1 = 0x0E;
  ADCTEST2 = 0x03;

  FRMCTRL0 = 0x43;
  FRMCTRL1 = 0x00;

  MAC_RADIO_RXTX_OFF();
  MAC_RADIO_SET_CHANNEL(rfTestParms[1]);
  MAC_RADIO_SET_TX_POWER(rfTestParms[2]);
  TX_PWR_TONE_SET(rfTestParms[3]);

  switch (rfTestParms[0])
  {
  case 1:  // Rx promiscuous mode.
    MAC_RADIO_RX_ON();
    break;

  case 2:  // Un-modulated Tx.
    TX_PWR_MOD__SET(1);
    // no break;

  case 3:  // Modulated Tx.
    // Modulated is default register setting, so no special action.

    // Now turn on Tx power for either mod or un-modulated Tx test.
    MAC_RADIO_TX_ON();
    break;

  default:  // Not expected.
    break;
  }

  // Clear the RF test mode.
  (void)osal_memset(rfTestParms, 0, 4);
  (void)osal_nv_write(ZNP_NV_RF_TEST_PARMS, 0, 4, rfTestParms);

  while (1);  // Spin in RF test mode until a hard reset.
}
Esempio n. 3
0
/**************************************************************************************************
 * @fn          macRadioUpdateChannel
 *
 * @brief       Update the radio channel if a new channel has been requested.
 *
 * @param       none
 *
 * @return      none
 **************************************************************************************************
 */
void macRadioUpdateChannel(void)
{
  halIntState_t  s;

  MAC_ASSERT(!macTxActive); /* cannot change channel during a transmit */

  /* if the channel has changed, set the radio to the new channel */
  HAL_ENTER_CRITICAL_SECTION(s);
  if (reqChannel != macPhyChannel)
  {
    macPhyChannel = reqChannel;
    HAL_EXIT_CRITICAL_SECTION(s);

    /* changing the channel stops any receive in progress */
    macRxOff();
    MAC_RADIO_SET_CHANNEL(macPhyChannel);
    macRxOnRequest();
  }
  else
  {
    HAL_EXIT_CRITICAL_SECTION(s);
  }
}
static
#endif /* USE_ICALL */
void macBackoffTimerEventHandler(void)
{
  halIntState_t is;
  uint8 events;
  HAL_ENTER_CRITICAL_SECTION(is);
  events = macBackoffTimerEvents;
  macBackoffTimerEvents = 0;
  HAL_EXIT_CRITICAL_SECTION(is);

  if (events & MAC_BACKOFF_TIMER_EVENT_POWER_WAKEUP)
  {
    // Wakeup radio
    // Turning on radio domain before clock set up seems to cause
    // unexpected interrupt.
    // Hence interrupt shall be disabled here.
    MB_DisableInts();

    // Enable clocks for all radio internal modules.
    // Use Non-Buff access for safety and check for sanity
    HWREG(RFC_PWR_NONBUF_BASE + RFC_PWR_O_PWMCLKEN) = 0x7FF;

    /* Setup mailbox */
    macSetupMailbox();

#ifdef DEBUG_SW_TRACE
    /* re-enable RF trace output for FPGA */
    MB_SendCommand( BUILD_DIRECT_PARAM_EXT_CMD( CMD_ENABLE_DEBUG, 0x1D40 ) ); /* or 0x1940 for less trace */
    DBG_PRINT0(DBGSYS, "RF Trace Resumes...");
#endif /* DEBUG_SW_TRACE */

    /* Start off CM0. Patch it. */
    macSetupRfHal();

    /* Restore states */
    MAC_RADIO_SET_CHANNEL(macPhyChannel);
    MAC_RADIO_SET_PAN_COORDINATOR(macPanCoordinator);
    MAC_RADIO_SET_PAN_ID(pMacPib->panId);
    MAC_RADIO_SET_SHORT_ADDR(pMacPib->shortAddress);
    MAC_RADIO_SET_IEEE_ADDR(pMacPib->extendedAddress.addr.extAddr);

#if !defined( USE_FPGA )
#ifdef USE_ICALL
    // Switch back to HFOSC.
    while (!ICall_pwrIsStableXOSCHF());
    ICall_pwrSwitchXOSCHF();
#endif /* USE_ICALL */
#ifdef OSAL_PORT2TIRTOS
    // Switches back to HFOSC.
    while (!Power_isStableXOSC_HF());
    Power_switchXOSC_HF();
#endif /* OSAL_PORT2TIRTOS */
#endif /* !defined( USE_FPGA ) */

    /* Synchronize RAT timer */
    macSyncStartRAT(macRATValue);

    /* Turn on autoack */
    MAC_RADIO_TURN_ON_AUTO_ACK();

    /* Initialize SRCEXTPENDEN and SRCSHORTPENDEN to zeros */
    MAC_RADIO_SRC_MATCH_INIT_EXTPENDEN();
    MAC_RADIO_SRC_MATCH_INIT_SHORTPENDEN();

    /* Start 15.4 Radio */
    macSetupRadio();

    /* Restore timer comparators */
    MAC_RADIO_BACKOFF_SET_PERIOD(macBackoffTimerRollover);
    MAC_RADIO_BACKOFF_SET_COMPARE(backoffTimerTrigger);

#if 0 /* Following code should be disabled normally */
    /* Code for wakeup lead time calibration */
    {
      static uint32 macBackoffTimerMinMargin = 0xffffffffu;
      uint32 delta = macPrevPeriodRatCount +
        backoffTimerTrigger * MAC_BACKOFF_TO_RAT_RATIO - MAC_RAT_COUNT;
      if (delta < macBackoffTimerMinMargin)
      {
        macBackoffTimerMinMargin = delta;
      }
    }
#endif
  }

  /* Note that MAC_BACKOFF_TIMER_EVENT_POWER_TIMER_EXP handling must always
   * occur after handling of MAC_BACKOFF_TIMER_EVENT_POWER_WAKEUP event
   * because the device might be waking up upon the timer event itself
   * in which case, radio has to be turned on before updating the RAT timer.
   */
  if (events & MAC_BACKOFF_TIMER_EVENT_POWER_TIMER_EXP)
  {
    /* Update wakeup schedule, which most likely would vote not to enter
     * sleep state. */
    HAL_ENTER_CRITICAL_SECTION(is);
    MAC_BACKOFF_TIMER_UPDATE_WAKEUP();
    HAL_EXIT_CRITICAL_SECTION(is);
  }
}