OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [cris/] [boot/] [rescue/] [kimagerescue.S] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * 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

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.