4016|5

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440休眠问题请教 [复制链接]

系统进入休眠函数
void OEMPowerOff()
{
    static UINT32 saveArea[51];
    S3C2440A_INTR_REG *pIntr = (S3C2440A_INTR_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_INTR, FALSE);
    S3C2440A_IOPORT_REG *pIOPort = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
    S3C2440A_LCD_REG *pLCD = (S3C2440A_LCD_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_LCD, FALSE);
    RETAILMSG(1, (TEXT(":::E:\WINCE500\PLATFORM\SMDK2440A\Src\Common\Power\off.c\r\n")));
    // First do platform specific actions
    BSPPowerOff();
    // Then save system registers
    saveArea[0]  = INPORT32(&pIOPort->GPACON);
    saveArea[1]  = INPORT32(&pIOPort->GPADAT);
    saveArea[2]  = INPORT32(&pIOPort->GPBCON);
    saveArea[3]  = INPORT32(&pIOPort->GPBDAT);
    saveArea[4]  = INPORT32(&pIOPort->GPBUP);
    saveArea[5]  = INPORT32(&pIOPort->GPCCON);
    saveArea[6]  = INPORT32(&pIOPort->GPCDAT);
    saveArea[7]  = INPORT32(&pIOPort->GPCUP);
    saveArea[8]  = INPORT32(&pIOPort->GPDCON);
    saveArea[9]  = INPORT32(&pIOPort->GPDDAT);
    saveArea[10] = INPORT32(&pIOPort->GPDUP);
    saveArea[11] = INPORT32(&pIOPort->GPECON);
    saveArea[12] = INPORT32(&pIOPort->GPEDAT);
    saveArea[13] = INPORT32(&pIOPort->GPEUP);
    saveArea[14] = INPORT32(&pIOPort->GPFCON);
    saveArea[15] = INPORT32(&pIOPort->GPFDAT);
    saveArea[16] = INPORT32(&pIOPort->GPFUP);
    saveArea[17] = INPORT32(&pIOPort->GPGCON);
    saveArea[18] = INPORT32(&pIOPort->GPGDAT);
    saveArea[19] = INPORT32(&pIOPort->GPGUP);
    saveArea[20] = INPORT32(&pIOPort->GPHCON);
    saveArea[21] = INPORT32(&pIOPort->GPHDAT);
    saveArea[22] = INPORT32(&pIOPort->GPHUP);

    saveArea[23] = INPORT32(&pIOPort->MISCCR);
    saveArea[24] = INPORT32(&pIOPort->DCLKCON);
    saveArea[25] = INPORT32(&pIOPort->EXTINT0);
    saveArea[26] = INPORT32(&pIOPort->EXTINT1);
    saveArea[27] = INPORT32(&pIOPort->EXTINT2);
    saveArea[28] = INPORT32(&pIOPort->EINTFLT0);
    saveArea[29] = INPORT32(&pIOPort->EINTFLT1);
    saveArea[30] = INPORT32(&pIOPort->EINTFLT2);
    saveArea[31] = INPORT32(&pIOPort->EINTFLT3);
    saveArea[32] = INPORT32(&pIOPort->EINTMASK);

    saveArea[33] = INPORT32(&pIntr->INTMOD);
    saveArea[34] = INPORT32(&pIntr->INTMSK);
    saveArea[35] = INPORT32(&pIntr->INTSUBMSK);

    saveArea[36] = INPORT32(&pLCD->TCONSEL);
    saveArea[37] = INPORT32(&pLCD->LCDINTMSK);
    saveArea[38] = INPORT32(&pLCD->TPAL);
    saveArea[39] = INPORT32(&pLCD->DITHMODE);
    saveArea[40] = INPORT32(&pLCD->BLUELUT);
    saveArea[41] = INPORT32(&pLCD->GREENLUT);
    saveArea[42] = INPORT32(&pLCD->REDLUT);
    saveArea[43] = INPORT32(&pLCD->LCDSADDR3);
    saveArea[44] = INPORT32(&pLCD->LCDSADDR2);
    saveArea[45] = INPORT32(&pLCD->LCDSADDR1);
    saveArea[46] = INPORT32(&pLCD->LCDCON5);
    saveArea[47] = INPORT32(&pLCD->LCDCON4);
    saveArea[48] = INPORT32(&pLCD->LCDCON3);
    saveArea[49] = INPORT32(&pLCD->LCDCON2);
    saveArea[50] = INPORT32(&pLCD->LCDCON1);

    pLCD->LCDCON1   = 0;
    pLCD->LCDCON2   = 0;
    pLCD->LCDCON3   = 0;
    pLCD->LCDCON4   = 0;
    pLCD->LCDCON5   = 0;
    pLCD->LCDSADDR1 = 0;
    pLCD->LCDSADDR2 = 0;
    pLCD->LCDSADDR3 = 0;
    pLCD->TCONSEL    = 0;
    pLCD->TPAL      = 0;

        ConfigStopGPIO();

    // Switch off power for KITL device
      OALKitlPowerOff(); // made_by_gmh
       
  ///////////////////////////GMH
  //pIOPort->GPGCON &= 0xfcff;
// pIOPort->GPGCON |= 0x0300;
// pIOPort->GPGDAT &=0xef;
// RETAILMSG(1, (TEXT("::: pwr_en=0@josh915\r\n")));
   /////////////////////////////////GMH_END
   
    // Go to power off mode
    OALCPUPowerOff();

之后进入oal的starup.s中
        LEAF_ENTRY OALCPUPowerOff

;       1. Push SVC state onto our stack
        stmdb   sp!, {r4-r12}                  
        stmdb   sp!, {lr}

;       2. Save MMU & CPU Register to RAM
    ldr     r3, =SLEEPDATA_BASE_VIRTUAL     ; base of Sleep mode storage

        ldr     r2, =Awake_address              ; store Virtual return address
        str     r2, [r3], #4

        mrc     p15, 0, r2, c1, c0, 0           ; load r2 with MMU Control
        ldr     r0, =MMU_CTL_MASK               ; mask off the undefined bits
        bic     r2, r2, r0
        str     r2, [r3], #4                    ; store MMU Control data

        mrc     p15, 0, r2, c2, c0, 0           ; load r2 with TTB address.
        ldr     r0, =MMU_TTB_MASK               ; mask off the undefined bits
        bic     r2, r2, r0
        str     r2, [r3], #4                    ; store TTB address

        mrc     p15, 0, r2, c3, c0, 0           ; load r2 with domain access control.
        str     r2, [r3], #4                    ; store domain access control

        str     sp, [r3], #4                    ; store SVC stack pointer

        mrs     r2, spsr
        str     r2, [r3], #4                    ; store SVC status register

        mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; Enter FIQ mode, no interrupts
        msr     cpsr, r1
        mrs     r2, spsr
        stmia   r3!, {r2, r8-r12, sp, lr}       ; store the FIQ mode registers

        mov     r1, #Mode_ABT:OR:I_Bit:OR:F_Bit ; Enter ABT mode, no interrupts
        msr     cpsr, r1
        mrs                r0, spsr
        stmia   r3!, {r0, sp, lr}               ; store the ABT mode Registers

        mov     r1, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; Enter IRQ mode, no interrupts
        msr     cpsr, r1
        mrs     r0, spsr
        stmia   r3!, {r0, sp, lr}               ; store the IRQ Mode Registers

        mov     r1, #Mode_UND:OR:I_Bit:OR:F_Bit ; Enter UND mode, no interrupts
        msr     cpsr, r1
        mrs     r0, spsr
        stmia   r3!, {r0, sp, lr}               ; store the UND mode Registers

        mov     r1, #Mode_SYS:OR:I_Bit:OR:F_Bit ; Enter SYS mode, no interrupts
        msr     cpsr, r1
        stmia   r3!, {sp, lr}                   ; store the SYS mode Registers

        mov     r1, #Mode_SVC:OR:I_Bit:OR:F_Bit ; Back to SVC mode, no interrupts
        msr     cpsr, r1

;       3. do Checksum on the Sleepdata
        ldr     r3, =SLEEPDATA_BASE_VIRTUAL        ; get pointer to SLEEPDATA
        ldr     r2, =0x0
        ldr     r0, =(SLEEPDATA_SIZE-1)                ; get size of data structure (in words)
30
        ldr     r1, [r3], #4
        and     r1, r1, #0x1
        mov     r1, r1, ROR #31
        add     r2, r2, r1
        subs    r0, r0, #1
        bne     %b30

        ldr     r0, =vGPIOBASE
        ;;;add                r2, r2, #1                                ; test checksum of the Sleep data error
        str     r2, [r0, #oGSTATUS3]                ; Store in Power Manager Scratch pad register

        ldr     r0, =vGPIOBASE
        ldr     r1, =0x550a
        str     r1, [r0, #oGPFCON]
       
        ldr                r1, =0x30
        str                r1, [r0, #oGPFDAT]       

;       4. Interrupt Disable
    ldr     r0, =vINTBASE
    mvn     r2, #0
        str     r2, [r0, #oINTMSK]
        str     r2, [r0, #oSRCPND]
        str     r2, [r0, #oINTPND]

;;       5. Cache Flush
        bl                OALClearUTLB
        bl                OALFlushICache
        ldr     r0, = (DCACHE_LINES_PER_SET - 1)   
        ldr     r1, = (DCACHE_NUM_SETS - 1)   
        ldr     r2, = DCACHE_SET_INDEX_BIT   
        ldr     r3, = DCACHE_LINE_SIZE     
        bl                OALFlushDCache

;       6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
        ldr     r0, =vGPIOBASE

        ldr     r1, =0x550a
        str     r1, [r0, #oGPFCON]

;        ldr     r1, =0x55550100
;        str     r1, [r0, #oGPGCON]

;       7. Go to Power-Off Mode
        ldr         r0, =vMISCCR                        ; hit the TLB
        ldr                r0, [r0]
        ldr         r0, =vCLKCON
        ldr                r0, [r0]

        ldr     r0, =vREFRESH               
        ldr     r1, [r0]                ; r1=rREFRESH       
        orr     r1, r1, #(1 << 22)

        ldr         r2, =vMISCCR
        ldr                r3, [r2]
        orr                r3, r3, #(7<<17)        ; Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up
        bic                r3, r3, #(7<<20)
        orr                r3, r3, #(6<<20)

        ldr     r4, =vCLKCON
        ldr     r5, =0x1ffff8            ; Power Off Mode

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
;
;;;        ldr                r6, =0x92000000                ; make address to 0x9200 0020
;;;        add                r6, r6, #0x20                ;
;;;        mov     pc, r6                                ; jump to Power off code in ROM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        b       SelfRefreshAndPowerOff

        ALIGN   32                      ; for I-Cache Line(32Byte, 8 Word)

SelfRefreshAndPowerOff                ; run with Instruction Cache's code
        str     r1, [r0]                ; Enable SDRAM self-refresh
        str                r3, [r2]                ; MISCCR Setting
        str     r5, [r4]                ; Power Off !!
        b       .

这个汇编代码实现真正的休眠设置,系统能一步步执行下来,执行到最后,系统电流下降了100多ma,sclk0等时钟信号也变0了,但是lcd控制信号pwren由3.3降到2.3v左右,lcd没有被关闭,出现了白屏,也就是系统没有真正进入休眠中。可能有人会说,直接用io把pwren设置为0,可是系统已经设置过了,在   
BSPPowerOff();函数中:
    /* LCD Controller Disable               */
    CLRPORT32(&pIOPort->GPGDAT, 1 << 4);
已经设置过,即使强制把lcd背光关了,电流也只能再少100多ma,还有200多ma的电流,我猜想内核其实没有真正休眠下来,假如真的休眠了,lcd也会真正被关闭
对比了很多网上的bsp,基本上也差不多,没多大区别,,不知道原因出在哪里
映射地址情况如下

SLEEPDATA_BASE_VIRTUAL          EQU        0xA0028000                ; keep in sync w/ config.bib
SLEEPDATA_BASE_PHYSICAL         EQU        0x30028000

config.bib:MEMORY
    NK                                80200000  02200000  RAMIMAGE
;    RAM                                82400000  05c00000  RAM
    RAM                                82400000  01c00000  RAM

最新回复

在BSPPowerOff();函数里 有CLRPORT32(&pIOPort->GPGDAT, 1 GPGDAT = 0;         pIOPort->GPGCON = 0x00000000;         //pIOPort->GPGCON = 0x00000300;//gmh         pIOPort->GPGUP        = 0x0; 红色的设置好像上面CLRPORT32这句的作用给屏蔽了,因为这时io脚没被设置成pwren功能了,而是设为输入了。lcd背光在BSPPowerOff被关闭的瞬间又被下面ConfigStopGPIO的函数给点亮了,出现的现象为:很快的黑一下,然后白屏。 后来我把pIOPort->GPGCON = 0x00000000改成pIOPort->GPGCON = 0x00000300;也就是把pwren的功能不变,这样lcd背光倒能被关闭。但我这样的设置好像是只把lcd背光给关了,我测了下clk,vs,vh,三个时钟信号都为高电平。  详情 回复 发表于 2010-5-27 15:27
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
强制关闭背光,是不是这时候,还有数据刷新到屏幕上??造成休眠不足。。不成功!
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
但是lcd控制信号pwren由3.3降到2.3v左右,lcd没有被关闭,出现了白屏,



这个是不是跟你的LCD控制相关,你可以看下你是否有这个现象:系统正常上电,屏会先亮下“白屏”,然后再进入EBOOT。。。。。。,如果有这个现象,出现你休眠的时候背光没有完全关掉就很正常的。

说明你的LCD背光控制哪里的硬件电路需要改进。需要控制脚接分压电阻




 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 peasant_lee 的回复:
强制关闭背光,是不是这时候,还有数据刷新到屏幕上??造成休眠不足。。不成功!


LCD的背光和是否有数据刷新是没关系的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主说的LCD_EN这个脚有2.3v的电压,感觉是没有配置对,你把这个脚设置为输出,内部上拉电阻给屏蔽了试试。

而还有的200ma的功耗,基本可以认定楼主的系统没有进入休眠,或是其他外围模块在工作。
可以尝试把外围模块都断电了,如果电流还这么大,那肯定是没休眠了。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
在BSPPowerOff();函数里
有CLRPORT32(&pIOPort->GPGDAT, 1 << 4);即把pwren置为0,这时lcd灭了,
但在随后的函数ConfigStopGPIO();里
有       pIOPort->GPGDAT = 0;
        pIOPort->GPGCON = 0x00000000;
        //pIOPort->GPGCON = 0x00000300;//gmh
        pIOPort->GPGUP        = 0x0;
红色的设置好像上面CLRPORT32这句的作用给屏蔽了,因为这时io脚没被设置成pwren功能了,而是设为输入了。lcd背光在BSPPowerOff被关闭的瞬间又被下面ConfigStopGPIO的函数给点亮了,出现的现象为:很快的黑一下,然后白屏。 后来我把pIOPort->GPGCON = 0x00000000改成pIOPort->GPGCON = 0x00000300;也就是把pwren的功能不变,这样lcd背光倒能被关闭。但我这样的设置好像是只把lcd背光给关了,我测了下clk,vs,vh,三个时钟信号都为高电平。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表