sleep.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * S3C2410 Assembler Sleep/WakeUp Management Routines
  3.  *
  4.  * Copyright (C) 2002 MIZI Research, Inc.
  5.  * 
  6.  * Author: Janghoon Lyu <nandy@mizi.com>
  7.  */
  8. #include <linux/linkage.h>
  9. #include <asm/assembler.h>
  10. #include <asm/hardware.h>
  11. .text
  12. /*
  13.  * s3c2410_cpu_suspend()
  14.  */
  15. ENTRY(s3c2410_cpu_suspend)
  16. stmfd sp!, {r4 - r12, lr} @ save registers on stack
  17. @ get coprocessor registers
  18. mrc p15, 0, r4, c3, c0, 0 @ domain ID
  19. mrc p15, 0, r5, c2, c0, 0 @ translation table base addr
  20. mrc p15, 0, r6, c13, c0, 0 @ PID
  21. mrc p15, 0, r7, c1, c0, 0 @ control reg
  22. @ store them plus current virtual stack ptr on stack
  23. mov r8, sp
  24. stmfd sp!, {r4 - r8}
  25. @ preserve phys address of stack
  26. mov r0, sp
  27. bl sleep_phys_sp
  28. ldr r1, =sleep_save_sp
  29. str r0, [r1]
  30. @ clean data cache and invalidate WB
  31. bl cpu_arm920_cache_clean_invalidate_all
  32. @ go flash memory
  33. mov r2, #0x34
  34. mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
  35. bic r1, r1, #0x0001 @ MMU off
  36. mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
  37. mov pc, r2
  38. nop
  39. nop 
  40. /*
  41.  * s3c2410_cpu_resume()
  42.  * entry point from bootloader into kernel during resume
  43.  *
  44.  */
  45. .data
  46. .align 5
  47. ENTRY(s3c2410_cpu_resume)
  48. mov r0, #I_BIT | F_BIT | MODE_SVC @ set SVC, irqs off
  49. msr cpsr_c, r0
  50. ldr r0, sleep_save_sp @ stack phys addr
  51. ldr r2, =resume_after_mmu @ its aboslute virtual address
  52. ldmfd r0!, {r4 - r7, sp} @ CP regs + virt stack ptr
  53. mov r1, #0
  54. mcr p15, 0, r1, c7, c7 @ invalidate I,D caches
  55. mcr p15, 0, r1, c7, c10, 4 @ drain write buffer
  56. mcr p15, 0, r1, c8, c7 @ invalidate I,D TLBs
  57. mcr p15, 0, r4, c3, c0, 0 @ domain ID
  58. mcr p15, 0, r5, c2, c0, 0 @ translation table base addr
  59. mcr p15, 0, r6, c13, c0, 0 @ PID
  60. mcr p15, 0, r7, c1, c0, 0 @ turn on MMU, caches, etc.
  61. nop
  62. mov pc, r2 @ jump to virtual addr
  63. nop
  64. nop
  65. nop
  66. sleep_save_sp:
  67. .word 0 @ preserve stack phys ptr here
  68. .text
  69. resume_after_mmu:
  70. ldmfd sp!, {r4 - r12, pc} @ return to caller