linux内核对S3C2410睡眠模式的支持

时间:2013-03-18来源:网络

  七、实现方法

  具体的实现原理可以通过阅读上述相关文件获取。下面如何实现系统的睡眠及唤醒

  (1)内核修改过程

  根据硬件的实际情况,设置睡眠唤醒中断源。我的系统是让中断0-3作为唤醒源。所以让内核允许EINT0--3外部中断将其唤醒。内核版本是2.6.26.5。系统默认容许EINT0..EINT15和IRQ_RTC作为中断唤醒源。

  s3c_irqwake_intmask和s3c_irqwake_eintmask是屏蔽码。为了让EINT0--3外部中断可以作为唤醒源,

  需要修改:

  arch/arm/plat-s3c24xx/irq.c中

  unsigned long s3c_irqwake_intmask = 0xffffffffL;

  为:

  unsigned long s3c_irqwake_intmask = 0xfffffff0L;

  (2)修改U-boot

  系统睡眠在唤醒后会运行复位程序,当然就是U-boot了。为了让唤醒后的系统能够恢复正常工作状态,及进入到睡眠前运行的位置,需要修改U-boot

  将下面的代码加入到uboot的cpu/arm920t/start.s中,注意:要放在sdram初始化后,参考本文的第四标题“S3C2410掉电模式唤醒过程”

  /* Power Manage Check if this is a wake-up from sleep */

  ldr r1, =0x560000B4

  ldr r0, [r1]

  tst r0, #0x02

  beq notPowerOFF

  /****led test****

  ldr r0, =0x56000050

  ldr r1,=0x55555555

  str r1,[r0]

  ldr r0, =0x56000054

  ldr r1,=0x0

  str r1,[r0]

  */

  WakeupStart:

  //Clear sleep reset bit

  ldr r0, =0x560000B4

  mov r1, #0x2

  str r1, [r0]

  ldr r0, =0x56000080 //Release the SDRAM signal protections

  ldr r1, =0x00010330

  str r1, [r0]

  ldr r0, =0x48000024

  ldr r1, [r0]

  bic r1, r1, #0x400000

  str r1, [r0]

  mov r1, #0x1000

  1: subs r1, r1, #1 // wait until the SelfRefresh is released.

  bne 1b

  /*

  ldr r0, =0x56000050

  ldr r1,=0x55555555

  str r1,[r0]

  ldr r0, =0x56000054

  ldr r1,=0x5555

  str r1,[r0]

  */

  ldr r0, =0x560000B8 //read a return address go to s3c2410_cpu_resume

  ldr r1, [r0]

  mov pc, r1 //go to resume 恢复到睡眠前的位置

  nop

  nop

  1: b 1b

  notPowerOFF:

1 2 3

关键词: linux内核 S3C2410 睡眠模式

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版