kimagerescue.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
- /* $Id: kimagerescue.S,v 1.5 2001/10/03 17:15:15 bjornw Exp $
- *
- * Rescue code to be prepended on a kimage and copied to the
- * rescue serial port.
- * This is called from the rescue code, it will copy received data to
- * 4004000 and after a timeout jump to it.
- */
- #include <linux/config.h>
- #define ASSEMBLER_MACROS_ONLY
- #include <asm/sv_addr_ag.h>
- #define CODE_START 0x40004000
- #define CODE_LENGTH 784
- #define TIMEOUT_VALUE 1000
-
-
- #ifdef CONFIG_ETRAX_RESCUE_SER0
- #define SERXOFF R_SERIAL0_XOFF
- #define SERBAUD R_SERIAL0_BAUD
- #define SERRECC R_SERIAL0_REC_CTRL
- #define SERRDAT R_SERIAL0_REC_DATA
- #define SERSTAT R_SERIAL0_STATUS
- #endif
- #ifdef CONFIG_ETRAX_RESCUE_SER1
- #define SERXOFF R_SERIAL1_XOFF
- #define SERBAUD R_SERIAL1_BAUD
- #define SERRECC R_SERIAL1_REC_CTRL
- #define SERRDAT R_SERIAL1_REC_DATA
- #define SERSTAT R_SERIAL1_STATUS
- #endif
- #ifdef CONFIG_ETRAX_RESCUE_SER2
- #define SERXOFF R_SERIAL2_XOFF
- #define SERBAUD R_SERIAL2_BAUD
- #define SERRECC R_SERIAL2_REC_CTRL
- #define SERRDAT R_SERIAL2_REC_DATA
- #define SERSTAT R_SERIAL2_STATUS
- #endif
- #ifdef CONFIG_ETRAX_RESCUE_SER3
- #define SERXOFF R_SERIAL3_XOFF
- #define SERBAUD R_SERIAL3_BAUD
- #define SERRECC R_SERIAL3_REC_CTRL
- #define SERRDAT R_SERIAL3_REC_DATA
- #define SERSTAT R_SERIAL3_STATUS
- #endif
- .text
- ;; This is the entry point of the rescue code
- ;; 0x80000000 if loaded in flash (as it should be)
- ;; since etrax actually starts at address 2 when booting from flash, we
- ;; put a nop (2 bytes) here first so we dont accidentally skip the di
-
- nop
- di
- #ifndef CONFIG_SVINTO_SIM
- ;; setup port PA and PB default initial directions and data
- ;; (so we can flash LEDs, and so that DTR and others are set)
-
- move.b CONFIG_ETRAX_DEF_R_PORT_PA_DIR, $r0
- move.b $r0, [R_PORT_PA_DIR]
- move.b CONFIG_ETRAX_DEF_R_PORT_PA_DATA, $r0
- move.b $r0, [R_PORT_PA_DATA]
-
- move.b CONFIG_ETRAX_DEF_R_PORT_PB_DIR, $r0
- move.b $r0, [R_PORT_PB_DIR]
- move.b CONFIG_ETRAX_DEF_R_PORT_PB_DATA, $r0
- move.b $r0, [R_PORT_PB_DATA]
-
- ;; We need to setup the bus registers before we start using the DRAM
- #include "../../lib/dram_init.S"
-
- #endif
- ;; Setup the stack to a suitably high address.
- ;; We assume 8 MB is the minimum DRAM in an eLinux
- ;; product and put the sp at the top for now.
- move.d 0x40800000, $sp
-
- ;; setup the serial port at 115200 baud
-
- moveq 0, $r0
- move.d $r0, [SERXOFF]
- move.b 0x99, $r0
- move.b $r0, [SERBAUD] ; 115.2kbaud for both transmit and receive
- move.b 0x40, $r0 ; rec enable
- move.b $r0, [SERRECC]
- moveq 0, $r1 ; "timer" to clock out a LED red flash
- move.d CODE_START, $r3 ; destination counter
- move.d CODE_LENGTH, $r4 ; length
- move.d TIMEOUT_VALUE, $r5 ; "timeout" until jump
- wait_ser:
- addq 1, $r1
- subq 1, $r5 ; decrease timeout
- beq jump_start ; timed out
- nop
- #ifndef CONFIG_ETRAX_NO_LEDS
- #ifdef CONFIG_ETRAX_PA_LEDS
- move.b CONFIG_ETRAX_DEF_R_PORT_PA_DATA, $r2
- #endif
- #ifdef CONFIG_ETRAX_PB_LEDS
- move.b CONFIG_ETRAX_DEF_R_PORT_PB_DATA, $r2
- #endif
- move.d (1 << CONFIG_ETRAX_LED1R) | (1 << CONFIG_ETRAX_LED2R), $r0
- btstq 16, $r1
- bpl 1f
- nop
- or.d $r0, $r2 ; set bit
- ba 2f
- nop
- 1: not $r0 ; clear bit
- and.d $r0, $r2
- 2:
- #ifdef CONFIG_ETRAX_PA_LEDS
- move.b $r2, [R_PORT_PA_DATA]
- #endif
- #ifdef CONFIG_ETRAX_PB_LEDS
- move.b $r2, [R_PORT_PB_DATA]
- #endif
- #endif
-
- ;; check if we got something on the serial port
-
- move.b [SERSTAT], $r0
- btstq 0, $r0 ; data_avail
- bpl wait_ser
- nop
- ;; got something - copy the byte and loop
- move.b [SERRDAT], $r0
- move.b $r0, [$r3+]
- move.d TIMEOUT_VALUE, $r5 ; reset "timeout"
- subq 1, $r4 ; decrease length
- bne wait_ser
- nop
- jump_start:
- ;; jump into downloaded code
- jump CODE_START