dalee_xd
驱动牛犊
驱动牛犊
  • 注册日期2005-12-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:2991回复:3

关于PowerButton驱动的一个很奇怪的问题

楼主#
更多 发布于:2007-02-25 00:03
  我用的是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的吗, 系统是怎么做的呢?(可能和虚拟地址映射有点关系吧, 搞不太清楚啊~~~!)
 
 
多谢了~~~!!!
dalee_xd
驱动牛犊
驱动牛犊
  • 注册日期2005-12-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-25 12:52
版主帮我看看这个问题好吗?
其他的朋友给我提提意见吧~~~
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-02-25 20:12
三星的芯片我没有用过,所以在细节上没法帮你.

系统SUSPEND时,应该在OEMPowerOff函数中保存相关的寄存器值,

将系统中断全部禁掉,只留将会用其唤醒系统的那个中断线.

将CPU置于SUSPEND状态(各个CPU对这个状态的叫法可能不大一样,就是让SDRAM进入自刷新的状态).

CPU即停运行.

当一个中断产生时,比如我们留的一个GPIO中断,CPU即被唤醒,开始执行中断处理程序,得到一个中断号,
之后应该就开始了正常的系统调度,即从它进入SUSPEND状态时停止的位置开始执行指令,所以让它能从
OEMPowerOff函数返回.

还有几个与此相关的函数,我不知道是不是有关系,你可以查查.
OEMGetWakeupSource, OEMSetWakeupSource等.
学海无涯
anchor720
驱动牛犊
驱动牛犊
  • 注册日期2007-07-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-19 17:29
楼主碰到的问题和我是一样的.不知楼主解决了吗?
游客

返回顶部