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