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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [sw/] [sd_boot_loader/] [BootReset.S] - Rev 12

Compare with Previous | Blame | View Log

/*
 *
 * Create by Linux Device Driver VIM Plugin 
 *
 * Copyright (c) 2008 by:
 *      Xianfeng Zeng <xianfeng.zeng@gmail.com, Xianfeng.zeng@SierraAtlantic.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the BSD Licence, GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version
 *
 * ChangeLog:
 *      2009-10-02 09:35:09   xzeng
 *          Init.
 *
 */

#include "board.h"
#include "spr_defs.h"

#define KALLE 0x12345678

.macro  load32i reg const
        l.movhi \reg,hi(\const)
        l.ori   \reg,\reg,lo(\const)
.endm

.macro  exception_vector name org
        .org \org
        .p2align 8
        .global  __exception_\name
__exception_\name:
        
        l.j __exception_\name
        l.nop
.endm

.macro  BSR name
        l.j    \name
        l.nop
ret_\name:  
.endm


/** Other MACROS **/

#define LOAD_SYMBOL_2_GPR(gpr,symbol)   \
    l.movhi gpr,hi(symbol)              ;\
    l.ori   gpr,gpr,lo(symbol)

/*$$RESET START*/

#ifndef ENTRY
#  define ENTRY(symbol)                 \
          .global symbol                ;\
   symbol:      
#endif

/* 
 * emergency_print temporary stores 
 */
#define EMERGENCY_PRINT_STORE_GPR4      l.sw    0x20(r0),r4
#define EMERGENCY_PRINT_LOAD_GPR4       l.lwz   r4,0x20(r0)

#define EMERGENCY_PRINT_STORE_GPR5      l.sw    0x24(r0),r5
#define EMERGENCY_PRINT_LOAD_GPR5       l.lwz   r5,0x24(r0)
        
#define EMERGENCY_PRINT_STORE_GPR6      l.sw    0x28(r0),r6
#define EMERGENCY_PRINT_LOAD_GPR6       l.lwz   r6,0x28(r0)
        
#define EMERGENCY_PRINT_STORE_GPR7      l.sw    0x2c(r0),r7
#define EMERGENCY_PRINT_LOAD_GPR7       l.lwz   r7,0x2c(r0)

#define EMERGENCY_PRINT_STORE_GPR8      l.sw    0x30(r0),r8
#define EMERGENCY_PRINT_LOAD_GPR8       l.lwz   r8,0x30(r0)

#define EMERGENCY_PRINT_STORE_GPR9      l.sw    0x34(r0),r9
#define EMERGENCY_PRINT_LOAD_GPR9       l.lwz   r9,0x34(r0)

/******************************************************************************/
/*                                                                            */
/*                          R E S E T   S T A R T                             */
/*                                                                            */
/******************************************************************************/

.section .vectors, "ax"

.org 0x100 - 0x100              // Sector .vectors start at 0x100

        l.ori   r3,r0,0x1
        l.mtspr r0,r3,SPR_SR

_reset:

        l.jal   _early_uart_init
        l.nop

        /*
         * Set stack pointer (r1) to 0xf0003560
         * Clear all other registers
         */
        .equ sp,0xf0003560      ;
        l.movhi r0,0x0000       ; #r0 = 0
        l.ori r0,r0,0x0000      ; 
        l.movhi r1,hi(sp)       ; #r1 = sp
        l.ori r1,r1,lo(sp)      ;
        l.or r2,r0,r0           ; #clear r2
        l.or r3,r0,r0           ; #clear r3
        l.or r4,r0,r0           ; #clear r4
        l.or r5,r0,r0           ; #clear r5
        l.or r6,r0,r0           ; #clear r6
        l.or r7,r0,r0           ; #clear r7
        l.or r8,r0,r0           ; #clear r8
        l.or r9,r0,r0           ; #clear r9
        l.or r10,r0,r0          ; #clear r10
        l.or r11,r0,r0          ; #clear r11
        l.or r12,r0,r0          ; #clear r12
        l.or r13,r0,r0          ; #clear r13
        l.or r14,r0,r0          ; #clear r14
        l.or r15,r0,r0          ; #clear r15
        l.or r16,r0,r0          ; #clear r16
        l.or r17,r0,r0          ; #clear r17
        l.or r18,r0,r0          ; #clear r18
        l.or r19,r0,r0          ; #clear r19
        l.or r20,r0,r0          ; #clear r20
        l.or r21,r0,r0          ; #clear r21
        l.or r22,r0,r0          ; #clear r22
        l.or r23,r0,r0          ; #clear r23
        l.or r24,r0,r0          ; #clear r24
        l.or r25,r0,r0          ; #clear r25
        l.or r26,r0,r0          ; #clear r26
        l.or r27,r0,r0          ; #clear r27
        l.or r28,r0,r0          ; #clear r28
        l.or r29,r0,r0          ; #clear r29
        l.or r30,r0,r0          ; #clear r30
        l.or r31,r0,r0          ; #clear r31            


#if IC_ENABLE == 1      /* INSTRUCTION CACHE */
        BSR ic_enable
#endif

        
// Jump to start of program

        load32i r2, (_Start)
        l.jr    r2
        l.nop

        exception_vector        bus_error               0x200 - 0x100 // Sector .vectors start at 0x100 
        exception_vector        data_page_fault         0x300 - 0x100 // Sector .vectors start at 0x100
        exception_vector        instruction_page_fault  0x400 - 0x100 // Sector .vectors start at 0x100
        exception_vector        tick_timer              0x500 - 0x100 // Sector .vectors start at 0x100
        exception_vector        unaligned_access        0x600 - 0x100 // Sector .vectors start at 0x100
        exception_vector        illegal_instruction     0x700 - 0x100 // Sector .vectors start at 0x100


// Defines what will happen when an external interrupt occurs

.org 0x800 - 0x100

        .global  __external_IRQ

__external_IRQ:        
        l.addi r1,r1,-30*4                      //move SP 30*4 adresses lower

        l.sw 0x1c(r1),r9
        
        l.jal (save_state)
        l.nop
                                
        // we mess with r3, r4 and r9
        //
        l.mfspr r3,r0,SPR_ESR_BASE      // get SR before interrupt
        l.andi  r4,r3,SPR_SR_IEE        // check if it had SPR_SR_IEE bit enabled
        l.sfeqi r4,0
        l.bnf   JUMP                      // external irq enabled, all ok.
        l.nop

JUMP:     l.jal (_external_exeption)
        l.nop

        l.jal (restore_state)
        l.nop

        l.lwz r9 ,0x1c(r1)
        l.addi r1,r1,30*4                       //move SP 30*4 adresses lower
                
        //Return from exception
        l.rfe


// Save current state (all general purpose registers)

save_state:
    l.sw 0x0(r1),r2
    l.sw 0x4(r1),r3
    l.sw 0x8(r1),r4
    l.sw 0xc(r1),r5
    l.sw 0x10(r1),r6
    l.sw 0x14(r1),r7
    l.sw 0x18(r1),r8
    l.sw 0x20(r1),r10
    l.sw 0x24(r1),r11
    l.sw 0x28(r1),r12
    l.sw 0x2c(r1),r13
    l.sw 0x30(r1),r14
    l.sw 0x34(r1),r15
    l.sw 0x38(r1),r16
    l.sw 0x3c(r1),r17
    l.sw 0x40(r1),r18
    l.sw 0x44(r1),r19
    l.sw 0x48(r1),r20
    l.sw 0x4c(r1),r21
    l.sw 0x50(r1),r22
    l.sw 0x54(r1),r23
    l.sw 0x58(r1),r24
    l.sw 0x5c(r1),r25
    l.sw 0x60(r1),r26
    l.sw 0x64(r1),r27
    l.sw 0x68(r1),r28
    l.sw 0x6c(r1),r29
    l.sw 0x70(r1),r30
    l.jr r9
    l.nop

// Restore current state

restore_state:
    // disable interrupts (if needed)
    l.lwz r2,0x0(r1)
    l.lwz r3  ,0x4(r1)
    l.lwz r4  ,0x8(r1)
    l.lwz r5  ,0xc(r1)
    l.lwz r6 ,0x10(r1)
    l.lwz r7 ,0x14(r1)
    l.lwz r8 ,0x18(r1)
    l.lwz r10,0x20(r1)
    l.lwz r11,0x24(r1)
    l.lwz r12,0x28(r1)
    l.lwz r13,0x2c(r1)
    l.lwz r14,0x30(r1)
    l.lwz r15,0x34(r1)
    l.lwz r16,0x38(r1)
    l.lwz r17,0x3c(r1)
    l.lwz r18,0x40(r1)
    l.lwz r19,0x44(r1)
    l.lwz r20,0x48(r1)
    l.lwz r21,0x4c(r1)
    l.lwz r22,0x50(r1)
    l.lwz r23,0x54(r1)
    l.lwz r24,0x58(r1)
    l.lwz r25,0x5c(r1)
    l.lwz r26,0x60(r1)
    l.lwz r27,0x64(r1)
    l.lwz r28,0x68(r1)
    l.lwz r29,0x6c(r1)
    l.lwz r30,0x70(r1)
    l.jr r9
    l.nop



/***************************
 * Instruction cache enable 
 */
#if IC_ENABLE == 1      
ic_enable:

        /* Disable IC */
        l.mfspr r6,r0,SPR_SR
        l.addi  r5,r0,-1
        l.xori  r5,r5,SPR_SR_ICE
        l.and   r5,r6,r5
        l.mtspr r0,r5,SPR_SR

        /* Invalidate IC */
        l.addi  r6,r0,0
        l.addi  r5,r0,IC_SIZE
1:
        l.mtspr r0,r6,SPR_ICBIR
        l.sfne  r6,r5
        l.bf    1b
        l.addi  r6,r6,IC_LINE

        /* Enable IC */
        l.mfspr r6,r0,SPR_SR
        l.ori   r6,r6,SPR_SR_ICE
        l.mtspr r0,r6,SPR_SR
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.nop
        l.j  ret_ic_enable
        l.nop
#endif


ENTRY(_early_uart_init)
        l.movhi r3,hi(UART_BASE_ADD)

        l.addi  r4,r0,0x00c0    //0x2 FIFO Control
        l.sb    0x2(r3),r4        

        l.addi  r4,r0,0x0
        l.sb    0x1(r3),r4      //0x1 Interrupt Enable

        l.addi  r4,r0,0x0003
        l.sb    0x3(r3),r4      //0x3 Line Control Register

        l.lbz   r5,3(r3)        //Line Control Register
        l.ori   r4,r5,0x0080
        l.sb    0x3(r3),r4
        l.addi  r4,r0,((UART_DEVISOR>>8) & 0x000000ff)
        l.sb    UART_DLM(r3),r4
        l.addi  r4,r0,((UART_DEVISOR) & 0x000000ff)
        l.sb    UART_DLL(r3),r4
        l.sb    0x3(r3),r5
  
        l.jr    r9
        l.nop

ENTRY(_emergency_print)
        EMERGENCY_PRINT_STORE_GPR4
        EMERGENCY_PRINT_STORE_GPR5
        EMERGENCY_PRINT_STORE_GPR6
        EMERGENCY_PRINT_STORE_GPR7
2:      
        l.lbz   r7,0(r3)
        l.sfeq  r7,r0
        l.bf    9f
        l.nop

// putc:
        l.movhi r4,hi(UART_BASE_ADD)

        l.addi  r6,r0,0x20
1:      l.lbz   r5,5(r4)
        l.andi  r5,r5,0x20
        l.sfeq  r5,r6
        l.bnf   1b
        l.nop
      
        l.sb    0(r4),r7

        l.addi  r6,r0,0x60
1:      l.lbz   r5,5(r4)
        l.andi  r5,r5,0x60
        l.sfeq  r5,r6
        l.bnf   1b
        l.nop

        /* next character */
        l.j     2b
        l.addi  r3,r3,0x1

9:
        EMERGENCY_PRINT_LOAD_GPR7
        EMERGENCY_PRINT_LOAD_GPR6
        EMERGENCY_PRINT_LOAD_GPR5
        EMERGENCY_PRINT_LOAD_GPR4       
        l.jr    r9
        l.nop


/* Jump to 0x0000100 after the Image was copied to this section */

.global _jumpToRAM

        .section .text, "ax"
_jumpToRAM:
        l.movhi r2,hi(0x00000100)
        l.ori   r2,r2,lo(0x00000100)
        l.jr    r2
        l.addi  r2,r0,0

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.