8217|22

57

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE 5.0 2440 唤醒时死机问题 [复制链接]

我用 S3C2440 Samsung 官方的 Windows CE 5.0 BSP,休眠后,按下唤醒按钮,程序跳到 Stepldr 中继续执行,执行到 WAKEUP_POWER_OFF 子程序,进行对休眠的唤醒,详细代码如下:
WAKEUP_POWER_OFF
    ; Release SCLKn after wake-up from the POWER_OFF mode.     
    ldr                r1, =MISCCR
    ldr                r0, [r1]
    bic                r0, r0, #(7<<17) ; SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H.
    str                r0, [r1]

    ; Set up the memory control registers.
    ;
    add     r0, pc, #SMRDATA - (. + 8)
    ldr                r1, =BWSCON             ; BWSCON Address.
    add                r2, r0, #52             ; End address of SMRDATA.
3      
    ldr                r3, [r0], #4   
    str                r3, [r1], #4   
    cmp                r2, r0               
    bne                %B3
   
        mov     r0, #0x2000
4
        subs    r0, r0, #1
        bne     %B4

;------------------------------------------------------------------------------
;   Recover Process : Starting Point
;
;   1. Checksum Calculation saved Data
        ldr     r5, =SLEEPDATA_BASE_PHYSICAL    ; pointer to physical address of reserved Sleep mode info data structure
        mov     r3, r5                          ; pointer for checksum calculation
        ldr     r2, =0x0
        ldr     r0, =(SLEEPDATA_SIZE-1)             ; get size of data structure to do checksum on
50       
        ldr     r1, [r3], #4                    ; pointer to SLEEPDATA
        and     r1, r1, #0x1
        mov     r1, r1, ROR #31
        add     r2, r2, r1
        subs    r0, r0, #1                      ; dec the count
        bne     %b50                            ; loop till done   

        ldr     r0,=GSTATUS3
        ldr     r3, [r0]                        ; get the Sleep data checksum from the Power Manager Scratch pad register
        cmp     r2, r3                          ; compare to what we saved before going to sleep
        bne     BringUpWinCE                    ; bad news - do a cold boot
   
;   2. MMU Enable
        ldr     r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
        ldr     r9,  [r5, #SleepState_MMUTTB]    ; load the MMU TTB info
        ldr     r8,  [r5, #SleepState_MMUCTL]    ; load the MMU control info
        ldr     r7,  [r5, #SleepState_WakeAddr ] ; load the LR address
        nop         
        nop
        nop
        nop
        nop
       
; if software reset
        mov     r1, #0
        teq     r1, r7
        bne     %f60
        b              BringUpWinCE       
       
; wakeup routine
60        mcr     p15, 0, r10, c3, c0, 0          ; setup access to domain 0   
        mcr     p15, 0, r9,  c2, c0, 0          ; PT address
        mcr     p15, 0, r0,  c8, c7, 0          ; flush I+D TLBs
        mcr     p15, 0, r8,  c1, c0, 0          ; restore MMU control
                
;   3. Jump to Kernel Image's fw.s (Awake_address)
        mov     pc, r7                          ;  jump to new VA (back up Power management stack)
        nop

BringUpWinCE
   
        ; bad news, data lose, bring up wince again
        mov         r0, #2
        ldr                r1, =GSTATUS2
        str                r0, [r1]

当程序执行到
; wakeup routine
60        mcr     p15, 0, r10, c3, c0, 0          ; setup access to domain 0  
这句后,系统就死机了,然后 Windows CE 也不能被正确唤醒,有谁碰到过这种情况,谁知到怎么解决,是什么原因导致死机的。
       
此帖出自WindowsCE论坛

最新回复

粘贴出来的代码多,也方便后人借鉴呵!  详情 回复 发表于 2009-7-20 11:18
点赞 关注
 

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我也想弄我的WINCE60下的挂起唤醒啊!可是一直没有时间!以后再说了!
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
今天好累,不想看代码了。以后再跟贴。
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
不要啊,我还很期待你的回答呢
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
顺便在贴下 休眠的函数过程
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
        str     r2, [r0, #oGSTATUS3]                ; Store in Power Manager Scratch pad register

;       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, #(3<<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       .

;;;        LTORG

; This point is called from EBOOT's startup code(MMU is enabled)
;       in this routine, left information(REGs, INTMSK, INTSUBMSK ...)

Awake_address

;       1. Recover CPU Registers       
        ldr     r3, =SLEEPDATA_BASE_VIRTUAL                ; Sleep mode information data structure
        add     r2, r3, #SleepState_FIQ_SPSR
        mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit                ; Enter FIQ mode, no interrupts - also FIQ
        msr     cpsr, r1
        ldr     r0,  [r2], #4
        msr     spsr, r0
        ldr     r8,  [r2], #4
        ldr     r9,  [r2], #4
        ldr     r10, [r2], #4
        ldr     r11, [r2], #4
        ldr     r12, [r2], #4
        ldr     sp,  [r2], #4
        ldr     lr,  [r2], #4

        mov     r1, #Mode_ABT:OR:I_Bit                        ; Enter ABT mode, no interrupts
        msr     cpsr, r1
        ldr     r0, [r2], #4
        msr     spsr, r0
        ldr     sp, [r2], #4
        ldr     lr, [r2], #4

        mov     r1, #Mode_IRQ:OR:I_Bit                        ; Enter IRQ mode, no interrupts
        msr     cpsr, r1
        ldr     r0, [r2], #4
        msr     spsr, r0
        ldr     sp, [r2], #4
        ldr     lr, [r2], #4

        mov     r1, #Mode_UND:OR:I_Bit                        ; Enter UND mode, no interrupts
        msr     cpsr, r1
        ldr     r0, [r2], #4
        msr     spsr, r0
        ldr     sp, [r2], #4
        ldr     lr, [r2], #4

        mov     r1, #Mode_SYS:OR:I_Bit                        ; Enter SYS mode, no interrupts
        msr     cpsr, r1
        ldr     sp, [r2], #4
        ldr     lr, [r2]

        mov     r1, #Mode_SVC:OR:I_Bit                                        ; Enter SVC mode, no interrupts - FIQ is available
        msr     cpsr, r1
        ldr     r0, [r3, #SleepState_SVC_SPSR]
        msr     spsr, r0

;       2. Recover Last mode's REG's, & go back to caller of OALCPUPowerOff()

        ldr     sp, [r3, #SleepState_SVC_SP]
        ldr     lr, [sp], #4
        ldmia   sp!, {r4-r12}
        mov     pc, lr                          ; and now back to our sponsors
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
经过测试,内存中保存的数据是正确的,也就是说
;  2. MMU Enable
ldr    r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
ldr    r9,  [r5, #SleepState_MMUTTB]    ; load the MMU TTB info
ldr    r8,  [r5, #SleepState_MMUCTL]    ; load the MMU control info
ldr    r7,  [r5, #SleepState_WakeAddr ] ; load the LR address
装载的数据是正确的,但是不明白为什么,一执行到后面
; wakeup routine
60 mcr    p15, 0, r10, c3, c0, 0          ; setup access to domain 0   
这句代码时,程序就不能往下执行了(我在代码里面加了个LED,这行代码前灯能亮, 代码后灯就不亮了)。
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

7
 
mark
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
问题也解决,原因是
SLEEPDATA_BASE_VIRTUAL          EQU        0xAC028000                ; keep in sync w/ config.bib
SLEEPDATA_BASE_PHYSICAL         EQU        0x30028000
实际上 我 0x30000000 映射的 CACHE 的 虚拟地址对应的是 0xA0000000, 把 0xAC028000 修改成 0xA0028000 就不会死掉了,虽然系统还没有起来,不过也快了
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
你贴这么一大堆代码上来,估计也没有几个人会帮你仔细去研究的
所以提问也是有很大的技巧的,就象你这个问题,现在你自己解决了,别人看了你的代码能想得到是你把地址搞错了吗?
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

10
 
虚拟地址的问题?MARK一下
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
学习了,谢谢!!!
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵,我直接关机不用唤醒。不过这方面一样,跟电路有关其实只能参考不能照搬。
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 8 楼 hzdysymbol 的回复:
你贴这么一大堆代码上来,估计也没有几个人会帮你仔细去研究的
所以提问也是有很大的技巧的,就象你这个问题,现在你自己解决了,别人看了你的代码能想得到是你把地址搞错了吗?

我想到了 嘿嘿
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 constantine 的回复:
呵呵,我直接关机不用唤醒。不过这方面一样,跟电路有关其实只能参考不能照搬。

实际上可以理解为软件跟电路无关。
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
gz
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
呵呵,粘贴出来的代码也太多了一点
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

17
 


事情的起因是源于下面这样的一则广告贴(目前幸运还没有被删除,可以链接成功):
[/url]

事情的发展是在这个贴:

我在移动平台专区被封权限是为什么?这个要找谁?
[url=http://topic.eeworld.net/u/20081118/08/cf7d0af3-35cc-4fb7-9dc2-4567041b89e5.html?seed=1367941736 ]


事情的最新进展是这样的:

[抗议]对硬件/嵌入开发的某些版主武断,简单,粗暴的执法方式表示严重的抗议!  
[/url]

当小贩被野蛮城管打死后之eeworld版
[url=http://topic.eeworld.net/u/20081120/09/8af968cb-af00-4ddb-8604-dab1fb5421be.html?seed=613093649]


我重申一下,我一直不是在为我发广告贴辩护,我是在为处理此事的过程中受到的不合理对待即wxf0204 武断,简单,粗暴加野蛮的方式执法的行为,就我看跟城官差不多,对残踏我作为eeworld网友尊严,无视我作为eeworld网友存在的言行进行回击,悍卫我作为eeworld网友所具有的最基本的权利,而且之前连一个申诉的地方都没有,也没有找到班主封ID,删除留言的规定!

别人城管也不会第一次去执法看到有小贩就直接打死,也会先劝导,就第一次收了别人小贩的东西也会开个条说一下情况,开个清单,收了什么,什么时候来取,要受到何种处罚,你们这帮斑猪不通人性,看到小贩直接毙了,之前之后,不声不响,不闻不问,不通人性,比城管还城管...................
而且还不知反省,以暴抑暴,导致事件恶性循环!

大家注意抗议的主题,不是对删除贴子,封ID有异议,对此贴前已经说的很清楚,现在的问题是抗议某些斑猪或者大部分斑猪在处理此事时粗暴的方式,野蛮的态度,狭隘的思想,如果在封ID之前给予警告,封ID之后对被封ID用户说明情况如确认被封的具体原因,封的时间以及当前所犯事件的严重程度等,事情何以至此,现在某些斑主为撑面子,继续执迷不悟!

再者跟城管没得比,别人城管之前还有警告,收了东西之后还要开个单子,通知什么时候去取回,有什么处罚,你们的粗野方式就是直接毙了,一了百了,跟原始人一样,难不成eeworld都是这样,真没人性化,我看别的论坛都是有流程,有说明,有警告,有通知!而且应该还有申诉的渠道,不能一手遮天,一毙完事!


知会一下,举手之劳,别的论坛都这么做......你们不这么做就是不通人性.........你自己想下,你这样野蛮,我为何要惧怕你的淫威,你以为你是谁,做错事直接闷棍打死,真正怎么死的都不知,...........不给没有前科的人以任何机会,手段之残忍,心恨之至极...........令人发指........让人不服,还不让辩解.....................




此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

18
 
Mark
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

19
 
mark
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

20
 
2440做休眠/唤醒,硬件电路上有什么特别需要注意的地方,
我这里可以休眠,但就是唤不醒,好像连bootloader都无法进入。
此帖出自WindowsCE论坛
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    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
    快速回复 返回顶部 返回列表