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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: kimagerescue.S,v 1.5 2001/10/03 17:15:15 bjornw Exp $
  2.  * 
  3.  * Rescue code to be prepended on a kimage and copied to the
  4.  * rescue serial port.
  5.  * This is called from the rescue code, it will copy received data to
  6.  * 4004000 and after a timeout jump to it.
  7.  */
  8. #include <linux/config.h>
  9. #define ASSEMBLER_MACROS_ONLY
  10. #include <asm/sv_addr_ag.h>
  11. #define CODE_START 0x40004000
  12. #define CODE_LENGTH 784
  13. #define TIMEOUT_VALUE 1000
  14. #ifdef CONFIG_ETRAX_RESCUE_SER0
  15. #define SERXOFF R_SERIAL0_XOFF
  16. #define SERBAUD R_SERIAL0_BAUD
  17. #define SERRECC R_SERIAL0_REC_CTRL
  18. #define SERRDAT R_SERIAL0_REC_DATA
  19. #define SERSTAT R_SERIAL0_STATUS
  20. #endif
  21. #ifdef CONFIG_ETRAX_RESCUE_SER1
  22. #define SERXOFF R_SERIAL1_XOFF
  23. #define SERBAUD R_SERIAL1_BAUD
  24. #define SERRECC R_SERIAL1_REC_CTRL
  25. #define SERRDAT R_SERIAL1_REC_DATA
  26. #define SERSTAT R_SERIAL1_STATUS
  27. #endif
  28. #ifdef CONFIG_ETRAX_RESCUE_SER2
  29. #define SERXOFF R_SERIAL2_XOFF
  30. #define SERBAUD R_SERIAL2_BAUD
  31. #define SERRECC R_SERIAL2_REC_CTRL
  32. #define SERRDAT R_SERIAL2_REC_DATA
  33. #define SERSTAT R_SERIAL2_STATUS
  34. #endif
  35. #ifdef CONFIG_ETRAX_RESCUE_SER3
  36. #define SERXOFF R_SERIAL3_XOFF
  37. #define SERBAUD R_SERIAL3_BAUD
  38. #define SERRECC R_SERIAL3_REC_CTRL
  39. #define SERRDAT R_SERIAL3_REC_DATA
  40. #define SERSTAT R_SERIAL3_STATUS
  41. #endif
  42. .text
  43. ;; This is the entry point of the rescue code
  44. ;; 0x80000000 if loaded in flash (as it should be)
  45. ;; since etrax actually starts at address 2 when booting from flash, we
  46. ;; put a nop (2 bytes) here first so we dont accidentally skip the di
  47. nop
  48. di
  49. #ifndef CONFIG_SVINTO_SIM
  50. ;; setup port PA and PB default initial directions and data
  51. ;; (so we can flash LEDs, and so that DTR and others are set)
  52. move.b CONFIG_ETRAX_DEF_R_PORT_PA_DIR, $r0
  53. move.b $r0, [R_PORT_PA_DIR]
  54. move.b CONFIG_ETRAX_DEF_R_PORT_PA_DATA, $r0
  55. move.b $r0, [R_PORT_PA_DATA]
  56. move.b CONFIG_ETRAX_DEF_R_PORT_PB_DIR, $r0
  57. move.b $r0, [R_PORT_PB_DIR]
  58. move.b CONFIG_ETRAX_DEF_R_PORT_PB_DATA, $r0
  59. move.b $r0, [R_PORT_PB_DATA]
  60. ;; We need to setup the bus registers before we start using the DRAM
  61. #include "../../lib/dram_init.S"
  62. #endif
  63. ;; Setup the stack to a suitably high address.
  64. ;; We assume 8 MB is the minimum DRAM in an eLinux
  65. ;; product and put the sp at the top for now.
  66. move.d 0x40800000, $sp
  67. ;; setup the serial port at 115200 baud
  68. moveq 0, $r0
  69. move.d $r0, [SERXOFF] 
  70. move.b 0x99, $r0
  71. move.b $r0, [SERBAUD] ; 115.2kbaud for both transmit and receive
  72. move.b 0x40, $r0 ; rec enable
  73. move.b $r0, [SERRECC] 
  74. moveq 0, $r1 ; "timer" to clock out a LED red flash
  75. move.d CODE_START, $r3 ; destination counter
  76. move.d CODE_LENGTH, $r4 ; length
  77. move.d TIMEOUT_VALUE, $r5 ; "timeout" until jump
  78. wait_ser:
  79. addq 1, $r1
  80. subq 1, $r5 ; decrease timeout
  81. beq jump_start ; timed out
  82. nop
  83. #ifndef CONFIG_ETRAX_NO_LEDS
  84. #ifdef CONFIG_ETRAX_PA_LEDS
  85. move.b CONFIG_ETRAX_DEF_R_PORT_PA_DATA, $r2
  86. #endif
  87. #ifdef CONFIG_ETRAX_PB_LEDS
  88. move.b CONFIG_ETRAX_DEF_R_PORT_PB_DATA, $r2
  89. #endif
  90. move.d (1 << CONFIG_ETRAX_LED1R) | (1 << CONFIG_ETRAX_LED2R), $r0
  91. btstq 16, $r1
  92. bpl 1f
  93. nop
  94. or.d $r0, $r2 ; set bit
  95. ba 2f
  96. nop
  97. 1: not $r0 ; clear bit
  98. and.d $r0, $r2
  99. 2:
  100. #ifdef CONFIG_ETRAX_PA_LEDS
  101. move.b $r2, [R_PORT_PA_DATA]
  102. #endif
  103. #ifdef CONFIG_ETRAX_PB_LEDS
  104. move.b $r2, [R_PORT_PB_DATA]
  105. #endif
  106. #endif
  107. ;; check if we got something on the serial port
  108. move.b [SERSTAT], $r0
  109. btstq 0, $r0 ; data_avail
  110. bpl wait_ser
  111. nop
  112. ;; got something - copy the byte and loop
  113. move.b [SERRDAT], $r0
  114. move.b $r0, [$r3+]
  115. move.d TIMEOUT_VALUE, $r5 ; reset "timeout"
  116. subq 1, $r4 ; decrease length
  117. bne wait_ser
  118. nop
  119. jump_start:
  120. ;; jump into downloaded code
  121. jump CODE_START