hi all:
The following are on the DM355 DEEP SLEEP code, how power is not, I do
not know how to deal with,
I would like to thank!
/* * linux/arch/arm/mach-davinci/sleep.S * * Assembly sleep routines for
DaVinci * * Copyright 2007 Dirk Behme <[EMAIL PROTECTED]> * * Based on
arch/arm/mach-omap2/sleep.S from: * * (C) Copyright 2004 * Texas Instruments,
<www.ti.com> * Richard Woodruff <[EMAIL PROTECTED]> * * (C) Copyright 2006
Nokia Corporation * Fixed idle loop sleep * Igor Stoppa <[EMAIL PROTECTED]> * *
This program is free software; you can redistribute it and/or * modify it under
the terms of the GNU General Public License as * published by the Free Software
Foundation; either version 2 of * the License, or (at your option) any later
version. * * This program is distributed in the hope that it will be useful, *
but WITHOUT ANY WARRANTY; without even the implied warranty of *
MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the * GNU General
Public License for more details. * * You should have received a copy of the GNU
General Public License * along with this program; if not, write to the Free
Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA
02111-1307 USA */
#include <linux/linkage.h>#include <asm/assembler.h>#include
<asm/arch/io.h>#include <asm/arch/hardware.h>
.text/* * davinci_cpu_suspend() - Forces DaVinci into sleep state by
switching * SDRAM into self refresh and then enter WFI.
*/ENTRY(davinci_cpu_suspend) stmfd sp!, {r4 - r12, lr}
/* tci_loop: mrc p15, 0, r15, c7, c10, 3 @ test clean
and invalidate DCache bne tci_loop mov r0, #0x0
@ clear for mrc call mcr p15, 0, r0, c7, c10, 4 @ drain write
buffer, @ hope SDR/DDR finished nop
nop */ bl Enter_SDRAM_Selfrefresh bl
Video_Dac_Down //bl PLL2_PLLDIV1_DOWN //bl
PSC_DOWN //bl PLL2_PLLCTL_DOWN //bl
PLL1_PLLCTL_DOWN //bl usb_phy_down //bl ddr_phy_down
bl deepsleep //bl ddr_phy_up //bl usb_phy_up
//bl PLL2_PLLCTL_UP //bl PLL1_PLLCTL_UP //bl
PSC_UP //bl PLL2_PLLDIV1_UP bl Video_Dac_Up
bl Exit_SDRAM_Selfrefresh ldmfd sp!, {r4 - r12, pc}
@ restore regs and return
SDRCR_ADDR: .word DDR2_CTRL_VIRT+0x0C SDRCR_LPMODEN_MASK: .word
0x80000000SDRCR_MCLKSTOPEN_MASK: .word 0x40000000SDRCR_SR_PD_MASK: .word
0x00800000 Enter_SDRAM_Selfrefresh: /* Switch SDRAM to
selfrefresh */ ldr r0, SDRCR_ADDR ldr r2, [r0] ldr
r1, SDRCR_SR_PD_MASK bic r2, r2, r1 ldr r1,
SDRCR_MCLKSTOPEN_MASK orr r2, r2, r1 ldr r1, SDRCR_LPMODEN_MASK
orr r2, r2, r1 str r2, [r0] /* ToDo: Wait T_CKE+1
cycles */ mov r1, #0x1000loop1: subs r1, r1, #0x1
bne loop1 mov pc, lr Exit_SDRAM_Selfrefresh: /* Exit
SDRAM selfrefresh */ ldr r0, SDRCR_ADDR ldr r2, [r0] ldr
r1, SDRCR_SR_PD_MASK orr r2, r2, r1 ldr r1, SDRCR_LPMODEN_MASK
bic r2, r2, r1 str r2, [r0] /* ToDo: Wait
T_SXNR+1 and/or T_SCRD+1 cylces */ mov r1, #0x1000loop2:
subs r1, r1, #0x1 bne loop2 mov pc, lr
SYS_MODULE_BASE =
IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE)SYS_MODULE_BASE_ADR: .word
SYS_MODULE_BASE
@@@ Video DACSYS_VPSS_CLK_CTRL_OFFSET = 0x44SYS_VPSS_CLK_CTRL_DACCLKEN =
0x10SYS_VPSS_CLK_CTRL_VENCLKEN = 0x8
SYS_VDAC_CONFIG_OFFSET = 0x2cSYS_VDAC_CONFIG_PWD_BGZ =
0x400SYS_VDAC_CONFIG_PWD_VBUFZ = 0x80
SYS_VTP_CONFIG_OFFSET=0x70SYS_VTP_CTRL_PWDSAVE =0x100SYS_VTP_CTRL_PWDRND
=0x40Video_Dac_Down: ldr r1, SYS_MODULE_BASE_ADR /* Video DAC clock,
VPBE/Video Encoder clock */ ldr r0, [r1, #SYS_VPSS_CLK_CTRL_OFFSET] bic
r0, r0, #SYS_VPSS_CLK_CTRL_DACCLKEN | SYS_VPSS_CLK_CTRL_VENCLKEN str r0,
[r1, #SYS_VPSS_CLK_CTRL_OFFSET] /* Video DAC config */ ldr r0, [r1,
#SYS_VDAC_CONFIG_OFFSET] bic r0, r0, #SYS_VDAC_CONFIG_PWD_BGZ |
SYS_VDAC_CONFIG_PWD_VBUFZ str r0, [r1, #SYS_VDAC_CONFIG_OFFSET] /* VTP
config */ ldr r0, [r1, #SYS_VTP_CONFIG_OFFSET] orr r0, r0,
#SYS_VTP_CTRL_PWDSAVE | SYS_VTP_CTRL_PWDRND str r0, [r1,
#SYS_VTP_CONFIG_OFFSET] mov pc, lr
Video_Dac_Up: ldr r1, SYS_MODULE_BASE_ADR /* Video DAC clock,
VPBE/Video Encoder clock */ ldr r0, [r1, #SYS_VPSS_CLK_CTRL_OFFSET] orr
r0, r0, #SYS_VPSS_CLK_CTRL_DACCLKEN | SYS_VPSS_CLK_CTRL_VENCLKEN str r0,
[r1, #SYS_VPSS_CLK_CTRL_OFFSET] /* Video DAC config */ ldr r0, [r1,
#SYS_VDAC_CONFIG_OFFSET] orr r0, r0, #SYS_VDAC_CONFIG_PWD_BGZ |
SYS_VDAC_CONFIG_PWD_VBUFZ str r0, [r1, #SYS_VDAC_CONFIG_OFFSET] /* VTP
config */ ldr r0, [r1, #SYS_VTP_CONFIG_OFFSET] bic r0, r0,
#SYS_VTP_CTRL_PWDSAVE | SYS_VTP_CTRL_PWDRND str r0, [r1,
#SYS_VTP_CONFIG_OFFSET] mov pc, lr@@@DDR PHYDDR_PHY_ADD :.word
DDR2_CTRL_VIRT+0xE4DDR_PHY_DLLPWRDN=0x50ddr_phy_down: ldr r1, DDR_PHY_ADD
ldr r0, [r1] orr r0, r0, #DDR_PHY_DLLPWRDN str r0, [r1] mov
pc, lr
ddr_phy_up: ldr r1, DDR_PHY_ADD ldr r0, [r1] bic r0, r0,
#DDR_PHY_DLLPWRDN str r0, [r1] mov pc, lr
@@@USB_PHY_CTRLSYS_USB_PHY_CONFIG_OFFSET=0x34SYS_USB_PHY_CTRL_PHYPDWN=0x1SYS_USB_PHY_CTRL_OTGPDWN=0x2SYS_USB_PHY_CTRL_VPSS_OSCPDWN=0x4
usb_phy_down: /* USB config */ ldr r1, SYS_MODULE_BASE_ADR
ldr r0, [r1, #SYS_USB_PHY_CONFIG_OFFSET] orr r0, r0,
#SYS_USB_PHY_CTRL_PHYPDWN |
SYS_USB_PHY_CTRL_OTGPDWN|SYS_USB_PHY_CTRL_VPSS_OSCPDWN str r0, [r1,
#SYS_USB_PHY_CONFIG_OFFSET] mov pc, lr
usb_phy_up: /* USB config */ ldr r1, SYS_MODULE_BASE_ADR ldr
r0, [r1, #SYS_USB_PHY_CONFIG_OFFSET] bic r0, r0,
#SYS_USB_PHY_CTRL_PHYPDWN |
SYS_USB_PHY_CTRL_OTGPDWN|SYS_USB_PHY_CTRL_VPSS_OSCPDWN str r0, [r1,
#SYS_USB_PHY_CONFIG_OFFSET]
mov pc, lr
@@@PLL1_PLLCTLPLL1_BASE = IO_ADDRESS(0x01C40800)PLL1_PLLCTL_ADD:.word
PLL1_BASEPLL1_PLLCTL_OFFSET=0x100PLL1_PLLCTL_AND=0x1PLL1_PLLCTL_OR =0x1A
PLL1_PLLCTL_DOWN: /* PLL1_PLLCTL config */ ldr r1,
PLL1_PLLCTL_ADD ldr r0, [r1, #PLL1_PLLCTL_OFFSET] bic r0,
r0, #PLL1_PLLCTL_AND str r0, [r1, #PLL1_PLLCTL_OFFSET]
orr r0, r0, #PLL1_PLLCTL_OR str r0, [r1, #PLL1_PLLCTL_OFFSET]
mov pc, lr
PLL1_PLLCTL_UP: /* PLL1_PLLCTL config */ ldr r1,
PLL1_PLLCTL_ADD ldr r0, [r1, #PLL1_PLLCTL_OFFSET] bic r0,
r0, #PLL1_PLLCTL_OR str r0, [r1, #PLL1_PLLCTL_OFFSET]
orr r0, r0, #PLL1_PLLCTL_AND str r0, [r1, #PLL1_PLLCTL_OFFSET]
mov pc, lr
@@@PLL2_PLLCTLPLL2_BASE = IO_ADDRESS(0x01C40C00)PLL2_PLLCTL_ADD: .word
PLL2_BASEPLL2_PLLCTL_OFFSET=0x100PLL2_PLLCTL_AND=0x1PLL2_PLLCTL_OR =0x1A
PLL2_PLLDIV1_OFFSET=0x118PLL2_PLLDIV1_CLEAR=0x8000PLL2_PLLDIV1_SET =0x8000
PLL2_PLLDIV1_DOWN: /* PLL2_PLLDIV1 config */ ldr r1,
PLL2_PLLCTL_ADD ldr r0, [r1, #PLL2_PLLDIV1_OFFSET] bic
r0, r0, #PLL2_PLLDIV1_CLEAR str r0, [r1, #PLL2_PLLDIV1_OFFSET]
mov pc, lr
PLL2_PLLDIV1_UP: /* PLL2_PLLDIV1 config */ ldr r1,
PLL2_PLLCTL_ADD ldr r0, [r1, #PLL2_PLLDIV1_OFFSET] orr
r0, r0, #PLL2_PLLDIV1_SET str r0, [r1, #PLL2_PLLDIV1_OFFSET]
mov pc, lr
PLL2_PLLCTL_DOWN: /* PLL2_PLLCTL config */ ldr r1,
PLL2_PLLCTL_ADD ldr r0, [r1, #PLL2_PLLCTL_OFFSET] bic r0,
r0, #PLL2_PLLCTL_AND str r0, [r1, #PLL2_PLLCTL_OFFSET]
orr r0, r0, #PLL2_PLLCTL_OR str r0, [r1, #PLL2_PLLCTL_OFFSET]
mov pc, lr
PLL2_PLLCTL_UP: /* PLL2_PLLCTL config */ ldr r1,
PLL2_PLLCTL_ADD ldr r0, [r1, #PLL2_PLLCTL_OFFSET] bic r0,
r0, #PLL2_PLLCTL_OR str r0, [r1, #PLL2_PLLCTL_OFFSET]
orr r0, r0, #PLL2_PLLCTL_AND str r0, [r1, #PLL2_PLLCTL_OFFSET]
mov pc, lr@@@PSCPSC_BASE =IO_ADDRESS(0x01C41000)PSC_ADD :.word
[EMAIL PROTECTED]
=0x2PSC_PTCMD_OFFSET=0x120PSC_PTCMD_AND=0x00;PSC_PTCMD_OR=0x1PSC_DOWN:
/* PSC config */ ldr r1, PSC_ADD ldr r0, [r1,
#PSC_MDCTL_OFFSET] bic r0, r0, #PSC_MDCTL_DDR_AND orr r0,
r0, #PSC_MDCTL_DDR_OR str r0, [r1, #PSC_MDCTL_OFFSET]
ldr r0, [r1, #PSC_PTCMD_OFFSET] bic r0, r0,
#PSC_PTCMD_AND orr r0, r0, #PSC_PTCMD_OR str r0, [r1,
#PSC_PTCMD_OFFSET]
mov pc, lr
PSC_UP: /* PSC config */ ldr r1, PSC_ADD ldr r0,
[r1, #PSC_MDCTL_OFFSET] bic r0, r0, #PSC_MDCTL_DDR_OR orr
r0, r0, #PSC_MDCTL_DDR_AND str r0, [r1, #PSC_MDCTL_OFFSET]
mov pc, lr
@@@ DeepSleepSYS_DEEPSLEEP_OFFSET = 0x48SYS_DEEPSLEEP_ENABLE_MASK =
0x80000000SYS_DEEPSLEEP_COMPLETE_MASK = 0x40000000deepsleep: ldr r2,
SYS_MODULE_BASE_ADR ldr r0, [r2, #SYS_DEEPSLEEP_OFFSET] orr r0,
r0, #SYS_DEEPSLEEP_ENABLE_MASK bic r0, r0, #SYS_DEEPSLEEP_COMPLETE_MASK
str r0, [r2, #SYS_DEEPSLEEP_OFFSET] mov r1, #0sleep_complete:
add r1, r1, #1 ldr r0, [r2, #SYS_DEEPSLEEP_OFFSET] @ load the deep
sleep reg tst r0, #SYS_DEEPSLEEP_COMPLETE_MASK @ test if the complete
bit is set beq sleep_complete @ if it's not 1,
keep waitingbreak_sleep: bic r0, r0,
#SYS_DEEPSLEEP_ENABLE_MASK|SYS_DEEPSLEEP_COMPLETE_MASK @ clear the enable bit
str r0, [r2, #SYS_DEEPSLEEP_OFFSET] mov pc, lr
ENTRY(davinci_cpu_suspend_sz) .word . - davinci_cpu_suspend
_________________________________________________________________
超炫人气榜给您所有偶像的最新资讯和排名,快来支持自己的偶像!
http://cnweb.search.live.com/xrank/results.aspx?q=%e5%91%a8%e6%9d%b0%e4%bc%a6&FORM=MSNH
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source