阅读:2991回复:3
关于PowerButton驱动的一个很奇怪的问题
我用的是s3c2410+WinCE420, 在调试PowerButton驱动的时候遇到了一点问题, 想请教一下大家.
我的PowerButton连接的是EINT2. 首先在驱动中相应的函数初始化中断口线, 在OAL层相关的函数中注册这个中断, 并在fw.s中的CPUPowerOff函数修改相应的代码(进入power-off之前的那段), 即将GPF2设置为EINT2用来唤醒, 并通过INTMSK禁止所有中断. 这是准备工作. 当按下相应按键后(首先系统进入Power-Off状态), 通过跟踪调试信息, 发现程序正常运行, 其流程是: 进入EINT2的ISR, 返回中断号==>PowerButton的IST被中断事件唤醒==>IST执行PowerOffSystem()==>调用OAL层OEMPowerOff()==>OEMPowerOff()调用fw.s中的CPUPowerOff. 我可以确定以上这段程序运行是正常的. 之后问题就来了: 我测到12M晶振并没有停振. 而且PWREN引脚也一直为高, 说明CPU并没有进入Power-Off. 此时再按下PowerButton, 系统也没有被相应的EINT2唤醒, 毫无反应. 我仔细查看了一下CPUPowerOff的汇编代码, 在进入Power-Off之前有一段: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WinCE 3.00 assembler has some problem about ALIGN instruction. ; Sometimes it is not working in cache mode. So I modify to jump to ROM area. ; If the rom is EBOOT, the target address is 0x92001004. ; Else if the rom is NAND, the target address is 0x92000004. ldr r8, =0xEA000000 add r8, r8, #0x3f0 add r8, r8, #0xe ; make value to 0xEA0003FE ldr r6, =0x92000000 ; make address to 0x9200 1004 or 0x9200 0004 ldr r7, [r6] ; Check ROM Address data, if 0xEA0003FE, it is EBOOT cmp r7, r8 bne %f50 add r6, r6, #0x1000 ; Because eboot startup code is located at 0x1000. 50 add r6, r6, #0x4 ; mov pc, r6 ; jump to Power off code in ROM 这段代码使得PC指针跳转到0x9200 1004 or 0x9200 0004这两个的地址中的一个, 我查看了一下位于C:\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\ARM下的map.a, 发现有这么一句: DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0 我的板子只有NAND Flash, NBOOT是通过拷贝前4K内容到SRAM中执行的, 所以我推测程序将跳转到SRAM的空间执行, 但是SRAM里面并没有设置CLKCON(进入Power-off)的代码呀! 也许我的这个理解有问题, 理论上程序应该执行到什么地方去呢? 于是我将上面的这段代码注掉, 直接执行了它下面的代码: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 . 重新编译, 按下按键后, 程序也按照前面的流程走了, 我测了一下晶振, 没有振荡信号!! 再测PWREN引脚, 低电平! 说明已经进入到Power-Off状态了. 但我再按下按键, 按理说系统应该恢复的, 但是奇怪的现象又发生了, 晶振已重新起振, PWREN也变高, 说明EINT2已经将系统唤醒并复位, 但系统没有反应, 确切的说应该是程序没有正常执行, 只有串口在不停的向外发送脉冲, DNW的光标在动, 但显示一片空白. 这是怎么一回事情呢? 不得不说一下另一个疑问, 此时系统复位后, 程序将从什么地方开始执行呢? 是fw.s中的StartUp吗? 按理说复位的时候PC不是要跳转到0x00000000的吗, 系统是怎么做的呢?(可能和虚拟地址映射有点关系吧, 搞不太清楚啊~~~!) 多谢了~~~!!! |
|
沙发#
发布于:2007-02-25 12:52
版主帮我看看这个问题好吗?
其他的朋友给我提提意见吧~~~ |
|
板凳#
发布于:2007-02-25 20:12
三星的芯片我没有用过,所以在细节上没法帮你.
系统SUSPEND时,应该在OEMPowerOff函数中保存相关的寄存器值, 将系统中断全部禁掉,只留将会用其唤醒系统的那个中断线. 将CPU置于SUSPEND状态(各个CPU对这个状态的叫法可能不大一样,就是让SDRAM进入自刷新的状态). CPU即停运行. 当一个中断产生时,比如我们留的一个GPIO中断,CPU即被唤醒,开始执行中断处理程序,得到一个中断号, 之后应该就开始了正常的系统调度,即从它进入SUSPEND状态时停止的位置开始执行指令,所以让它能从 OEMPowerOff函数返回. 还有几个与此相关的函数,我不知道是不是有关系,你可以查查. OEMGetWakeupSource, OEMSetWakeupSource等. |
|
|
地板#
发布于:2007-10-19 17:29
楼主碰到的问题和我是一样的.不知楼主解决了吗?
|
|