Quantcast
Viewing all articles
Browse latest Browse all 17527

RTOS: can secure OMAP go to deepsleep mode?

Tool/software:TI-RTOS

Hi,

My projecy use OMAPL138. And it turn to deepsleep mode and wakeup ok. But when I replace normal OMAPL138 by secure OMAPL138, it cannot turn to deepsleep mode. The secure OMAP is unlocked and debug by jtag, but when turn to deepsleep, it stop at   " while (pscstatus);"

Here is my code

uint32_t savePinMux;
    uint32_t pscstatus;
    uint32_t count;

    // Unlock PLL configuration
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP0) &=
                                               ~SYSCFG_CFGCHIP0_PLL_MASTER_LOCK;
    /* Clear PLL lock bit */
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) &=
                                              ~SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK;

    // Config GP0[8] - DEEPSLEEP pin - pin number 9
    // Ensure DEEPSLEEP pin is pinmux to DEEPSLEEP function
    savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0));
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(0)) = PINMUX0_31_28_DEEPSLEEP & \
                                                                     savePinMux;

    // Clear self refresh/low power (SR_PD) bit to 0
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) &= ~DDR2_MDDR_SDRCR_SR_PD;

    // Set the low power mode enable
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) |= DDR2_MDDR_SDRCR_LPMODEN;

    // Shut off MCLK by set MCLKSTOPEN to 1
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) |= DDR2_MDDR_SDRCR_MCLKSTOPEN;

    // wait 150 CPU clock to allow MCLK to stop
    for(count = 0; count < MCLK_STOP_TIME_DELAY; count++)
    {
        asm(" nop");
    }

    // Disable VCLK of SDRAM (For self-refresh mode)
    // Turn off PSC for DDR2

    // Wait for any previously initiated transitions
    HWREG(SOC_PSC_1_REGS +  PSC_MDCTL(HW_PSC_DDR2_MDDR)) = (PSC_MDCTL_NEXT_DISABLE & PSC_MDCTL_NEXT);

    HWREG(SOC_PSC_1_REGS + PSC_PTCMD) = PSC_PTCMD_GO0;
    do
    {
        pscstatus = HWREG(SOC_PSC_1_REGS + PSC_PTSTAT) & PSC_PTSTAT_GOSTAT0;
    }
    while (pscstatus);


    // Recheck status
    pscstatus = PSC_MDCTL_NEXT_DISABLE & PSC_MDCTL_NEXT;
    while ((HWREG(SOC_PSC_1_REGS + PSC_MDSTAT(HW_PSC_DDR2_MDDR)) & PSC_MDSTAT_STATE) != pscstatus);

    /* PLLENSRC must be cleared before PLLEN bit have any effect */
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLENSRC;

    // PLLEN = 0 put pll in bypass mode in PLL0
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLEN;

    // Wait 4 cycle OSCIN
    for(count = 0; count < PLLEN_MUX_SWITCH; count++)
    {
        asm(" nop");
    }

    // PLLPWRDN = 1 in PLL0
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLPWRDN;

    /* PLLENSRC must be cleared before PLLEN has any effect*/
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLENSRC;

    // PLLEN = 0 put pll in bypass mode in PLL1
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLEN;

    // Wait 4 cycle OSCIN
    for(count = 0; count < PLLEN_MUX_SWITCH; count++)
    {
        asm(" nop");
    }

    // PLLPWRDN = 1 in PLL1
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLPWRDN;

    // Config delay in the SLEEPCOUNT bit (ex: 0x0F)
    HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_DEEPSLEEP) = \
                               ((HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_DEEPSLEEP) &
                                       ~SYSCFG1_DEEPSLEEP_SLEEPCOUNT) | 0x000F);

    // Set SLEEPENABLE bit in DEEPSLEEP to 1
    HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_DEEPSLEEP)|=SYSCFG1_DEEPSLEEP_SLEEPENABLE;

    // Polling bit SLEEPCOMPLETE
    while (0 == (SYSCFG1_DEEPSLEEP_SLEEPCOMPLETE & HWREG(SOC_SYSCFG_1_REGS +
                                                            SYSCFG1_DEEPSLEEP)))
    {
    }

    // Clear SLEEPENABLE bit in DEEPSLEEP to 0
    HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_DEEPSLEEP) &= \
                                                 ~SYSCFG1_DEEPSLEEP_SLEEPENABLE;

    // Clear PLLRST bit in PLLCTL to 0
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLRST;

    // Clear PLLPWRDN bit in PLLCTL
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLPWRDN;

    // Set PLLRST bit in PLLCTL to 1 - out of reset
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLRST;

    // Clear PLLRST bit in PLLCTL to 0
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLRST;

    // Clear PLLPWRDN bit in PLLCTL
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) &= ~PLLC_PLLCTL_PLLPWRDN;

    // Set PLLRST bit in PLLCTL to 1 - out of reset
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLRST;

    // Wait for PLL to lock
    for(count = 0; count < PLL_LOCK_TIME_CNT; count++)
    {
        asm(" nop");
    }

    // Set the PLLEN bit in PLLCTL to 1 - remove bypass mode
    HWREG(SOC_PLLC_0_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLEN;

    // Set the PLLEN bit in PLLCTL to 1 - remove bypass mode
    HWREG(SOC_PLLC_1_REGS + PLLC_PLLCTL) |= PLLC_PLLCTL_PLLEN;

    /* set PLL lock bit */
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP0) |=
                                     (0x01 << SYSCFG_CFGCHIP0_PLL_MASTER_LOCK_SHIFT )
                                      & SYSCFG_CFGCHIP0_PLL_MASTER_LOCK ;

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) &= CLK_PLL0_SYSCLK3;

    /* set PLL lock bit */
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) |=
    (0x1 << SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK_SHIFT)
        & SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK ;

    // Enable VCLK of SDRAM
    HWREG(SOC_PSC_1_REGS +  PSC_MDCTL(HW_PSC_DDR2_MDDR)) = (PSC_MDCTL_NEXT_ENABLE & PSC_MDCTL_NEXT);

    HWREG(SOC_PSC_1_REGS + PSC_PTCMD) = PSC_PTCMD_GO0;
    do
    {
        pscstatus = HWREG(SOC_PSC_1_REGS + PSC_PTSTAT) & PSC_PTSTAT_GOSTAT0;
    }
    while (pscstatus);

    // Recheck status
    pscstatus = PSC_MDCTL_NEXT_ENABLE & PSC_MDCTL_NEXT;
    while ((HWREG(SOC_PSC_1_REGS + PSC_MDSTAT(HW_PSC_DDR2_MDDR)) & PSC_MDSTAT_STATE) != pscstatus);

    // Set RESET_PHY bit in DDR PHY
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDR_DRPYCRC) |= \
                                                    DDR2_MDDR_DRPYRCR_RESET_PHY;
    while(DDR2_MDDR_DRPYRCR_RESET_PHY & \
                                HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDR_DRPYCRC));

    // Clear MCLKSTOPEN bit in SDRCR
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) &= \
                                                    ~DDR2_MDDR_SDRCR_MCLKSTOPEN;

    // Disable Self refresh rate
    // clear the low power mode
    HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) &= ~DDR2_MDDR_SDRCR_LPMODEN;

Thanks,

Nhan


Viewing all articles
Browse latest Browse all 17527

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>