Ejemplo n.º 1
0
void sensorsInit(void)
{
	//Turn off TMP007
    configure_tmp_007(0);

	//Power down Gyro
	IOCPinTypeGpioOutput(BOARD_IOID_MPU_POWER);
	GPIOPinClear(BOARD_MPU_POWER);

	//Power down Mic
	IOCPinTypeGpioOutput(BOARD_IOID_MIC_POWER);
	GPIOPinClear(1 << BOARD_IOID_MIC_POWER);

	//Turn off external flash
	ext_flash_init(); //includes power down instruction

	//Turn off OPT3001
	configure_opt_3001(0);

	configure_bmp_280(0);

	//Power off Serial domain (Powered on in sensor configurations!)
	PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL);
	while((PRCMPowerDomainStatus(PRCM_DOMAIN_SERIAL) != PRCM_DOMAIN_POWER_OFF));

	//Shut down I2C
	board_i2c_shutdown();
}
Ejemplo n.º 2
0
/**
 * Function documented in platform/uart.h
 */
otError otPlatUartDisable(void)
{
    UARTDisable(UART0_BASE);
    UARTIntUnregister(UART0_BASE);
    UARTIntDisable(UART0_BASE, UART_INT_RX | UART_INT_RT);
    IOCPortConfigureSet(IOID_2, IOC_PORT_GPIO, IOC_STD_INPUT);
    IOCPortConfigureSet(IOID_3, IOC_PORT_GPIO, IOC_STD_INPUT);

    PRCMPeripheralRunDisable(PRCM_PERIPH_UART0);
    PRCMPeripheralSleepDisable(PRCM_PERIPH_UART0);
    PRCMPeripheralDeepSleepDisable(PRCM_PERIPH_UART0);
    PRCMLoadSet();
    /**
     * \warn this assumes that there are no other devices being used in the
     * serial power domain
     */
    PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL);
    return OT_ERROR_NONE;
}
Ejemplo n.º 3
0
/*
 *  ======== Power_sleep ========
 */
Power_Status Power_sleep(Power_SleepState sleepState, UArg arg0, UArg arg1)
{
    Power_Status status = Power_SOK;
    UInt xosc_hf_active = FALSE;
    Power_Event postEventLate;
    UInt32 poweredDomains = 0;
    Bool exitNow = FALSE;
    Power_Event preEvent;
    Power_Event postEvent;
    UInt32 constraints;
    Bool retainCache = FALSE;
    UInt32 modeVIMS;
    UInt taskKey;
    UInt swiKey;
    UInt hwiKey;

    /* first validate the sleep code */
    if ( sleepState != Power_STANDBY) {
        status = Power_EFAIL;
    }

    if (status == Power_SOK) {

        /* make sure Power is not still busy with a previous transition */
        hwiKey = Hwi_disable();

        if (Power_module->state == Power_ACTIVE) {

            /* set transition state to entering sleep */
            Power_module->state = Power_ENTERING_SLEEP;
        }
        else {
            exitNow = TRUE;
        }

        Hwi_restore(hwiKey);

        if (exitNow == TRUE) {
            status = Power_EBUSY;
        }

        else {

            /* setup sleep vars */
            if (sleepState == Power_STANDBY) {
                preEvent = Power_ENTERING_STANDBY;
                postEvent = Power_AWAKE_STANDBY;
                postEventLate = Power_AWAKE_STANDBY_LATE;
            }

            /* disable Task scheduling; allow Swis and Hwis for notifications */
            taskKey = Task_disable();

            /* signal all clients registered for pre-sleep notification */
            status = Power_notify(preEvent);

            /* check for any error */
            if (status != Power_SOK) {
                Power_module->state = Power_ACTIVE;
                Task_restore(taskKey);          /* re-enable scheduler */
                return (status);
            }

            /* now disable Swi scheduling */
            swiKey = Swi_disable();

            /* freeze the IOs on the boundary between MCU and AON */
            AONIOCFreezeEnable();

            /* if XOSC_HF is active, force it off */
            if(OSCClockSourceGet(OSC_SRC_CLK_HF) == OSC_XOSC_HF) {
                xosc_hf_active = TRUE;
                ti_sysbios_family_arm_cc26xx_Power_XOSC_HF(DISABLE);
            }

            /* allow AUX to power down */
            AONWUCAuxWakeupEvent(AONWUC_AUX_ALLOW_SLEEP);

            /* make sure writes take effect */
            SysCtrlAonSync();

            /* invoke specific sequences to activate sleep states... */

            if (sleepState == Power_STANDBY) {

                /* query and save domain states before powering them off */
                if (Power_getDependencyCount(DOMAIN_RFCORE)) {
                    poweredDomains |= PRCM_DOMAIN_RFCORE;
                }
                if (Power_getDependencyCount(DOMAIN_SERIAL)){
                    poweredDomains |= PRCM_DOMAIN_SERIAL;
                }
                if (Power_getDependencyCount(DOMAIN_PERIPH)) {
                    poweredDomains |= PRCM_DOMAIN_PERIPH;
                }

                /* gate running deep sleep clocks for Crypto and DMA */
                if (Power_getDependencyCount(PERIPH_CRYPTO)) {
                    PRCMPeripheralDeepSleepDisable(
                        ti_sysbios_family_arm_cc26xx_Power_db[
                            PERIPH_CRYPTO].driverlibID);
                }
                if (Power_getDependencyCount(PERIPH_UDMA)) {
                    PRCMPeripheralDeepSleepDisable(
                        ti_sysbios_family_arm_cc26xx_Power_db[
                            PERIPH_UDMA].driverlibID);
                }
                /* make sure clock settings take effect */
                PRCMLoadSet();

                /* request power off of domains in the MCU voltage domain */
                PRCMPowerDomainOff(poweredDomains | PRCM_DOMAIN_CPU);

                /* request uLDO during standby */
                PRCMMcuUldoConfigure(true);

                /* query constraints to determine if cache should be retained */
                constraints = Power_getConstraintInfo();
                if ((constraints & Power_SB_VIMS_CACHE_RETAIN) != 0) {
                    retainCache = TRUE;
                }

                /* if don't want retention in standby, disable it now ... */
                if (retainCache == FALSE) {
                    modeVIMS = VIMSModeGet(VIMS_BASE);
                    /* wait if invalidate in progress... */
                    while (modeVIMS == VIMS_MODE_CHANGING) {
                        modeVIMS = VIMSModeGet(VIMS_BASE);
                    }
                    PRCMCacheRetentionDisable();
                    VIMSModeSet(VIMS_BASE, VIMS_MODE_OFF);
                }

                /* setup recharge parameters */
                SysCtrlSetRechargeBeforePowerDown(XoscInHighPowerMode);

                /* make sure all writes have taken effect */
                SysCtrlAonSync();

                /* invoke deep sleep to go to STANDBY */
                PRCMDeepSleep();

                /* if didn't retain cache in standby, re-enable retention now */
                if (retainCache == FALSE) {
                    VIMSModeSet(VIMS_BASE, modeVIMS);
                    PRCMCacheRetentionEnable();
                }

                /* force power on of AUX to keep it on when system is not
                 * sleeping; this also counts as a write to the AON interface
                 * ensuring that a following sync of the AON interface will
                 * force an update of all registers
                 */
                AONWUCAuxWakeupEvent(AONWUC_AUX_WAKEUP);
                while(!(AONWUCPowerStatusGet() & AONWUC_AUX_POWER_ON)) {};

                /* if XOSC_HF was forced off above, initiate switch back */
                if (xosc_hf_active == TRUE) {
                    ti_sysbios_family_arm_cc26xx_Power_XOSC_HF(ENABLE);
                }

                /* restore power domain states in effect before standby */
                PRCMPowerDomainOn(poweredDomains);
                while (PRCMPowerDomainStatus(poweredDomains) !=
                    PRCM_DOMAIN_POWER_ON){};

                /* restore deep sleep clocks of Crypto and DMA */
                if (Power_getDependencyCount(PERIPH_CRYPTO)) {
                    PRCMPeripheralDeepSleepEnable(
                        ti_sysbios_family_arm_cc26xx_Power_db[
                            PERIPH_CRYPTO].driverlibID);
                }
                if (Power_getDependencyCount(PERIPH_UDMA)) {
                    PRCMPeripheralDeepSleepEnable(
                        ti_sysbios_family_arm_cc26xx_Power_db[
                            PERIPH_UDMA].driverlibID);
                }
                /* make sure clock settings take effect */
                PRCMLoadSet();
            }

            /* release request for uLDO */
            PRCMMcuUldoConfigure(false);

            /* set transition state to EXITING_SLEEP */
            Power_module->state = Power_EXITING_SLEEP;

            /*
             * signal clients registered for early post-sleep notification;
             * this should be used to initialize any timing critical or IO
             * dependent hardware
             */
            status = Power_notify(postEvent);

            /* disable IO freeze and ensure RTC shadow value is updated */
            AONIOCFreezeDisable();
            SysCtrlAonSync();

            /* re-enable interrupts */
            CPUcpsie();

            /* signal all clients registered for late post-sleep notification */
            status = Power_notify(postEventLate);

            /* now clear the transition state before re-enabling scheduler */
            Power_module->state = Power_ACTIVE;

            /* re-enable Swi scheduling */
            Swi_restore(swiKey);

            /* adjust recharge parameters */
            SysCtrlAdjustRechargeAfterPowerDown();

            /* re-enable Task scheduling */
            Task_restore(taskKey);

            /* check for any notification error */
            if (status != Power_SOK) {
                return (status);
            }
        }
    }

    return (status);
}
Ejemplo n.º 4
0
/*
 *  ======== Power_shutdown ========
 */
Power_Status Power_shutdown(UArg arg)
{
    Power_Status status = Power_EFAIL;
    Bool exitNow = FALSE;
    UInt32 constraints;
    UInt hwiKey;

    /* make sure shutdown request doesn't violate a constraint */
    constraints = Power_getConstraintInfo();
    if ((constraints & (Power_SD_DISALLOW)) != 0) {
        status = Power_ECHANGE_NOT_ALLOWED;
    }

    if (status == Power_EFAIL) {

        /* make sure Power is not still busy with a previous transition */
        hwiKey = Hwi_disable();

        if (Power_module->state == Power_ACTIVE) {
            /* set new transition state to entering shutdown */
            Power_module->state = Power_SHUTDOWN;
        }
        else {
            exitNow = TRUE;
        }

        Hwi_restore(hwiKey);

        if (exitNow == TRUE) {
            status = Power_EBUSY;
        }

        else {

            /* disable interrupts as start the shutdown sequence */
            Hwi_disable();

            /* signal all clients registered for pre-shutdown notification */
            status = Power_notify(Power_ENTERING_SHUTDOWN);

            /* check for any error */
            if (status != Power_SOK) {
                Power_module->state = Power_ACTIVE;
                CPUcpsie();
                return (status);
            }

            /* proceed with shutdown sequence ... */

            /* switch to RCOSC_HF and RCOSC_LF */
            OSCInterfaceEnable();
            if(OSCClockSourceGet(OSC_SRC_CLK_HF) != OSC_RCOSC_HF) {
                OSCClockSourceSet(OSC_SRC_CLK_HF | OSC_SRC_CLK_MF,
                    OSC_RCOSC_HF);
                while(!OSCHfSourceReady());
                OSCHfSourceSwitch();
            }
            OSCClockSourceSet(OSC_SRC_CLK_LF,OSC_RCOSC_LF);
            while(OSCClockSourceGet(OSC_SRC_CLK_LF) != OSC_RCOSC_LF);
            OSCInterfaceDisable();

            /* make sure DMA and CRYTO clocks are off in deep-sleep */
            PRCMPeripheralDeepSleepDisable(PRCM_PERIPH_CRYPTO);
            PRCMPeripheralDeepSleepDisable(PRCM_PERIPH_UDMA);
            PRCMLoadSet();
            while(!PRCMLoadGet()){};

            /* power OFF AUX and disconnect from bus */
            AUXWUCPowerCtrl(AUX_WUC_POWER_OFF);

            /* remove AUX force ON */
            HWREG(AON_WUC_BASE + AON_WUC_O_AUXCTL) &=
                ~AON_WUC_AUXCTL_AUX_FORCE_ON;

            /*
             * reset AON event source IDs to avoid pending events powering
             * on MCU/AUX
             */
            HWREG(AON_EVENT_BASE + AON_EVENT_O_MCUWUSEL) = 0x3F3F3F3F;
            HWREG(AON_EVENT_BASE + AON_EVENT_O_AUXWUSEL) = 0x003F3F3F;

            /* sync AON */
            HWREG(AON_RTC_BASE + AON_RTC_O_SYNC);

            /*
             * enable shutdown - this latches the IOs, so configuration of
             * IOCFGx registers must be done prior to this
             */
            AONWUCShutDownEnable();

            /* sync AON */
            HWREG(AON_RTC_BASE + AON_RTC_O_SYNC);

            /* wait until AUX powered off */
            while (AONWUCPowerStatusGet() & AONWUC_AUX_POWER_ON);

            /* request to power off MCU when go to deep sleep */
            PRCMMcuPowerOff();

            /* turn off power domains inside MCU VD (BUS, FL_BUS, RFC, CPU) */
            PRCMPowerDomainOff(PRCM_DOMAIN_RFCORE | PRCM_DOMAIN_SERIAL |
                PRCM_DOMAIN_PERIPH | PRCM_DOMAIN_CPU | PRCM_DOMAIN_VIMS);

            /* deep sleep to activate shutdown */
            PRCMDeepSleep();
        }
    }

    Power_module->state = Power_ACTIVE;

    /* if get here failed to shutdown, return failure code */
    return (Power_EFAIL);
}
Ejemplo n.º 5
0
/*
 *  ======== Power_releaseDependency ========
 *  Release a previously declared dependency.
 */
Void Power_releaseDependency(Power_Resource resourceID)
{
    UInt8 parent;
    UInt8 count;
    UInt32 id;
    UInt key;

    /* disable interrupts */
    key = Hwi_disable();

    /* read and decrement the reference count */
    count = ti_sysbios_family_arm_cc26xx_Power_refCount[resourceID];

    Assert_isTrue(count != 0, Power_A_tooManyCallsReleaseDependency);

    ti_sysbios_family_arm_cc26xx_Power_refCount[resourceID] = count - 1;

    /* if this was the last dependency being released.., */
    if (count == 1) {

        /* deactivate this resource ... */
        id = ti_sysbios_family_arm_cc26xx_Power_db[resourceID].driverlibID;

        /* is resource a peripheral?... */
        if (ti_sysbios_family_arm_cc26xx_Power_db[resourceID].flags
            & PERIPH) {
            PRCMPeripheralRunDisable(id);
            PRCMPeripheralSleepDisable(id);
            PRCMPeripheralDeepSleepDisable(id);
            PRCMLoadSet();
            while(!PRCMLoadGet()){};
        }

        /* else, does resource require a special handler?... */
        else if (ti_sysbios_family_arm_cc26xx_Power_db[resourceID].flags
            & SPECIAL) {

            /* call the special handler */
            ti_sysbios_family_arm_cc26xx_Power_resourceHandlers[id](DISABLE);
        }

        /* else resource is a power domain */
        else {
            PRCMPowerDomainOff(id);
            while (PRCMPowerDomainStatus(id) != PRCM_DOMAIN_POWER_OFF) {};
        }

        /* propagate release up the dependency tree ... */

        /* check for a first parent */
        parent = ti_sysbios_family_arm_cc26xx_Power_db[resourceID].flags
          & PARENTMASK;

        /* if 1st parent, make recursive call to release that dependency */
        if (parent != NOPARENT) {
            Power_releaseDependency(parent);
        }

        /* check for a second parent */
        parent = ti_sysbios_family_arm_cc26xx_Power_db[resourceID].flags2
          & PARENTMASK;

        /* if 2nd parent, make recursive call to release that dependency */
        if (parent != NOPARENT) {
            Power_releaseDependency(parent);
        }
    }

    /* re-enable interrupts */
    Hwi_restore(key);
}
Ejemplo n.º 6
0
//*****************************************************************************
//
// Force the system in to low power modes.
//
//*****************************************************************************
void
PowerCtrlStateSet(uint32_t ui32Powerstate)
{
    //
    // Check the arguments.
    //
    ASSERT((ui32Powerstate == PWRCTRL_STANDBY) ||
           (ui32Powerstate == PWRCTRL_POWER_DOWN) ||
           (ui32Powerstate == PWRCTRL_SHUTDOWN));

    //
    // Configure the desired power state.
    //
    if(ui32Powerstate == PWRCTRL_STANDBY)
    {
        //
        //
        // Turn of all power domains in the MCU voltage domain. This is
        // necessary to conserve power before switching to the uLDO.
        //
        PRCMPowerDomainOff(PRCM_DOMAIN_RFCORE | PRCM_DOMAIN_SERIAL |
                           PRCM_DOMAIN_PERIPH | PRCM_DOMAIN_CPU |
                           PRCM_DOMAIN_VIMS);

        //
        // Make sure to request power off of the JTAG domain.
        //
        AONWUCJtagPowerOff();

        //
        // Configuration of clock source for MCU and AUX in standby mode.
        //
        AONWUCMcuPowerDownConfig(AONWUC_CLOCK_SRC_LF);
        AONWUCAuxPowerDownConfig(AONWUC_CLOCK_SRC_LF);

        //
        // Configure the recharge controller and request the uLDO as power
        // source.
        //
        AONWUCRechargeCtrlConfigSet(true, 34, 2500, 5000);

        //
        // Enable AUX power down
        // This will tell the system that no HF source is needed and will
        // allow the system to use the low-leakage/effect power supply.
        // NB. This does not allow co-existence of an independent
        // Sensor Controller.
        //
        AUXWUCPowerCtrl(AUX_WUC_POWER_DOWN);
        while(AONWUCPowerStatusGet() & AONWUC_AUX_POWER_ON);

        //
        // Request the uLDO for standby power consumption.
        //
        PowerCtrlSourceSet(PWRCTRL_PWRSRC_ULDO);

        //
        // Sync the AON interface to ensure all writes have gone through
        //
        HWREG(AON_RTC_BASE + AON_RTC_O_SYNC);

        //
        // Enable transition to standby.
        //
        PRCMDeepSleep();
    }
    else if(ui32Powerstate == PWRCTRL_POWER_DOWN)
    {
        //
        // Latch the current IO configuration before going to sleep to ensure
        // the IOs retain their value even after boot and reset of the
        // configuration.
        //
        AONIOCFreezeEnable();

        //
        // Make sure retention on MCU SRAM is on - on pr. default.
        //
        AONWUCMcuSRamConfig(MCU_RAM0_RETENTION | MCU_RAM1_RETENTION |
                            MCU_RAM2_RETENTION | MCU_RAM3_RETENTION);

        //
        // Allow power off on all domains in the MCU voltage domain.
        // This is necessary to conserve power before switching to the uLDO.
        //
        PRCMPowerDomainOff(PRCM_DOMAIN_RFCORE | PRCM_DOMAIN_SERIAL |
                           PRCM_DOMAIN_PERIPH | PRCM_DOMAIN_CPU |
                           PRCM_DOMAIN_VIMS);

        //
        // Turn off the MCU voltage domain. This will not take effect until System CPU
        // is in deep sleep.
        //
        PRCMMcuPowerOff();

        //
        // Set the wake up mode  - default value coming out of reset
        //
        AONWUCMcuWakeUpConfig(MCU_IMM_WAKE_UP);

        //
        // VIRTUAL POWER OFF DISABLE is the default value coming out of reset
        //
        AONWUCMcuPowerOffConfig(MCU_VIRT_PWOFF_DISABLE);

        //
        // Configure the recharge controller and request the uLDO as power
        // source.
        // Recommended maximum numbers for lowest power consumption
        // AdaptRate = 96
        // MaxPeriod = 21440
        // InitPeriod = 14816
        //
        AONWUCRechargeCtrlConfigSet(true, 75, 5000, 7500);

        //
        // Enable AUX power down with LF clock source
        // Turn off JTAG domain and enable powerdown - values are default.
        //
        AONWUCAuxPowerDownConfig(AONWUC_CLOCK_SRC_LF);
        AUXWUCPowerCtrl(AUX_WUC_POWER_DOWN);
        AONWUCDomainPowerDownEnable();
        while(AONWUCPowerStatusGet() & AONWUC_AUX_POWER_ON);

        //
        // Sync the AON interface to ensure all writes have gone through
        //
        HWREG(AON_RTC_BASE + AON_RTC_O_SYNC);

        //
        // Enable transition to power down.
        //
        PRCMDeepSleep();
    }
    else
    {
        //
        // Latch the current IO configuration before going to sleep to ensure
        // the IOs retain their value even after boot and reset of the
        // configuration.
        //
        AONIOCFreezeEnable();

        //
        // Turn of all power domains in the MCU voltage domain.
        //
        PRCMPowerDomainOff(PRCM_DOMAIN_RFCORE | PRCM_DOMAIN_SERIAL |
                           PRCM_DOMAIN_PERIPH | PRCM_DOMAIN_CPU |
                           PRCM_DOMAIN_VIMS);

        //
        // Turn off the MCU voltage domain. This will not take effect until System CPU
        // is in deep sleep.
        //
        PRCMMcuPowerOff();

        //
        // Set the wake up mode of MCU to immediate
        //
        AONWUCMcuWakeUpConfig(MCU_IMM_WAKE_UP);
        AONWUCMcuPowerOffConfig(MCU_VIRT_PWOFF_DISABLE);

        //
        // Turn off the AUX domain and wait for power to be off.
        //
        // Is this required for shutdown mode? or will AUX automatically
        // power off.
        AUXWUCPowerCtrl(AUX_WUC_POWER_OFF);
        while(AONWUCPowerStatusGet() & AONWUC_AUX_POWER_ON)
        { }

        //
        // Latch the IOs in the padring before going to sleep to retain their
        // value even after boot and reset of the configuration.
        //
        PowerCtrlIOFreezeEnable();

        //
        // Enable shutdown and make sure the AON interface is in sync on the
        // 32kHz clock.
        //
        AONWUCShutDownEnable();

        //
        // Sync the AON interface to ensure all writes have gone through
        //
        HWREG(AON_RTC_BASE + AON_RTC_O_SYNC);

        //
        // Enable transition to shutdown.
        //
        PRCMDeepSleep();
    }
}