EmbDev.net

Forum: ARM programming with GCC/GNU tools Convert SAM7 to AT91RM9200


von Super M. (techbuddy)


Rate this post
useful
not useful
I am using AT91RM9200 and I u-boot to boot up the processor. I wanted to
write programs for my processor, So I took the example program from
C:\WinARM\examples\at91sam7s64_Hello\ and modified the linker script.
Regarding the start up file, I wanted to know if I really need to
initialise the peripherals again, I think the U-Boot has already done
that for me. What changes do I really need in the startup_SAM7S.s file.
Since both are ARM processor based, I assume that the start files should
not be changed. Still can anyone provide me a basic example startup file
( GNU ) for my board. This is what I did, can anyone tell me if the
changes are correct ? I am using RAM-RUN so I also removed the portion
of #ifdef ( ROM-RUN ). Also, my linker script has got only i change i.e
origin for my SDRAM

/*********************************************************************** 
/
/*
*/
/*  startup_SAM7S.S:  Startup file for Atmel AT91SAM7S device series
*/
/*
*/
/*********************************************************************** 
/
/*  ported to arm-elf-gcc / WinARM by Martin Thomas, KL, .de
*/
/*  <eversmith@heizung-thomas.de>
*/
/*  modifications Copyright Martin Thomas 2005
*/



// *** Startup Code (executed after Reset) ***

        .equ    Mode_USR,       0x10
        .equ    Mode_FIQ,       0x11
        .equ    Mode_IRQ,       0x12
        .equ    Mode_SVC,       0x13
        .equ    Mode_ABT,       0x17
        .equ    Mode_UND,       0x1B
        .equ    Mode_SYS,       0x1F

        .equ    I_Bit,          0x80    /* when I bit is set, IRQ is
disabled */
        .equ    F_Bit,          0x40    /* when F bit is set, FIQ is
disabled */


// Internal Memory Base Addresses
        .equ    FLASH_BASE,     0x10000000     // my change
        .equ    RAM_BASE,       0x20000000      // my change



        .equ    Top_Stack,      0x20040000    // my change
        .equ    UND_Stack_Size, 0x00000004
        .equ    SVC_Stack_Size, 0x00000100
        .equ    ABT_Stack_Size, 0x00000004
        .equ    FIQ_Stack_Size, 0x00000004
        .equ    IRQ_Stack_Size, 0x00000100
        .equ    USR_Stack_Size, 0x00000400







/*
 Exception Vectors
 - for ROM_RUN: placed in 0x00000000
 - for RAM_RUN: placed at 0x00200000 (on AT91SAM7S64)
 -> will be used during startup before remapping with target ROM_RUN
 -> will be used "always" in code without remapping or with target
RAM_RUN
 Mapped to Address relative address 0 of .text
 Absolute addressing mode must be used.
 Dummy Handlers are implemented as infinite loops which can be modified.
*/
      .text
      .arm
      .section .vectrom, "ax"

Vectors:        LDR     PC,Reset_Addr
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                            /* Reserved Vector */
//                LDR     PC,IRQ_Addr
                LDR     PC,[PC,#-0xF20]        /* Vector From AIC_IVR */
//                LDR     PC,FIQ_Addr
                LDR     PC,[PC,#-0xF20]        /* Vector From AIC_FVR */

Reset_Addr:     .word   Reset_Handler
Undef_Addr:     .word   Undef_Handler
SWI_Addr:       .word   SWI_Handler
PAbt_Addr:      .word   PAbt_Handler
DAbt_Addr:      .word   DAbt_Handler
                .word   0                      /* Reserved Address */
IRQ_Addr:       .word   IRQ_Handler
FIQ_Addr:       .word   FIQ_Handler

Undef_Handler:  B       Undef_Handler
SWI_Handler:    B       SWI_Handler
PAbt_Handler:   B       PAbt_Handler
DAbt_Handler:   B       DAbt_Handler
IRQ_Handler:    B       IRQ_Handler
FIQ_Handler:    B       FIQ_Handler


// Starupt Code must be linked first at Address at which it expects to
run.

    .text
    .arm
    .section .init, "ax"

    .global _startup
    .func   _startup
_startup:


// Reset Handler
                LDR     pc, =Reset_Handler
Reset_Handler:



// Setup Stack for each mode

                LDR     R0, =Top_Stack

//  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

//  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

//  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

//  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

//  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

//  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR
                MOV     SP, R0

// Setup a default Stack Limit (when compiled with "-mapcs-stack-check")
                SUB     SL, SP, #USR_Stack_Size


// Clear .bss section (Zero init)
                MOV     R0, #0
                LDR     R1, =__bss_start__
                LDR     R2, =__bss_end__
LoopZI:         CMP     R1, R2
                STRLO   R0, [R1], #4
                BLO     LoopZI


#if defined(VECTORS_IN_RAM) || defined(RAM_RUN)
/*
   *** Remap ***
   ROM_RUN: exception vectors for RAM have been already copied
     to 0x00200000 by the .data copy-loop
   RAM_RUN: exception vectors are already placed at 0x0020000 by
     linker settings
*/
        .equ    MC_BASE,0xFFFFFF00  /* MC Base Address */
        .equ    MC_RCR, 0x00        /* MC_RCR Offset */

        LDR     R0, =MC_BASE
        MOV     R1, #1
        STR     R1, [R0, #MC_RCR]   // Remap
#endif /* VECTORS_IN_RAM || RAM_RUN */



// Enter the C code
        mov   r0,#0            // no arguments (argc = 0)
        mov   r1,r0
        mov   r2,r0
        mov   fp,r0            // null frame pointer
        mov   r7,r0            // null frame pointer for thumb
        ldr   r10,=main
        adr   lr, __main_exit
        bx    r10              // enter main()

__main_exit:    B       __main_exit


        .size   _startup, . - _startup
        .endfunc

.end

von Nigel E. (nevans06)


Rate this post
useful
not useful
Hi,

I am trying to do the same thing, did you get this working?

Regards,
Nigel.

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.