先说说环境,是WINCE 5.0, S3C2440A的cpu,64M 内存,NAND FLASH,用的不是STEPLOADER,是自己用ADS写的BOOTLOADR。
之前已经看过很多关于休眠的帖子,别人遇到的问题的解决方式也试过了。
CONFIG.BIB中有这个了
SLEEP 80028000 00002000 RESERVED
看之前一个帖子,有个同学是用的8C028000,但是很奇怪,这个C028000不是64M内存以内的啊?!
反正现在我可以把东西保存到这里的,然后把STEPLDR中的唤醒的汇编代码拷贝到我的ADS BOOTLOADER中,
设置的时钟等都是按照startup.s中的WINCE设置的一模一样了。
现在是能休眠了,那个POWEREN的管脚已经变低。然后我是EXINT0中断唤醒的,也已经唤醒了,能跳到
BOOTLOADR中,而且能监测到GSTATUS2的唤醒标志,而且基于SLEEPDATA_BASE_VIRTUAL这个地址的校验,就是保存
在GSTATUS3中的校验位也对了,已经又我的BOOTLOADER跳进了startup.s中的Awake_address函数,
这个我是通过点LED确认了。
问题是到了
; 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
在把LR放到PC前都是可以控制LED的,但是这句并没有使程序返回到OEMPowerOff()函数中,而是好像跑飞了。
我在 startup.s 中的OALCPUPowerOff函数里这个地方加了
好了,我不过这个MMU了,做一次人肉MMU。
直接在恢复MMU那句之前,把SleepState_WakeAddr 0x804070AC 转换为对应的的映射地址 0x304070A
然后让程序跑到这里,的确是回到Awake_address 函数了。
然后是一堆恢复各状态寄存器的指令,都正常,一直到了这里:
; 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
mcr p15, 0, r8, c1, c0, 0 ; restore MMU control
; 3. Jump to Kernel Image fw.s (Awake_address)
mov pc, r7 ; jump to new VA (back up Power management stack)