Wednesday, April 25th 2018, 6:51am UTC+2

You are not logged in.

  • Login
  • Register

mtconnol

Beginner

Date of registration: Nov 14th 2007

Posts: 1

1

Wednesday, November 14th 2007, 7:06pm

AT91SAM9261 boot code for embOS + NOR Flash?

Hi Segger folks,

I'm trying to boot a custom board based on the Atmel AT91SAM9261. I have a 16-bit NOR flash on CS0 which appears to work (I can boot into a GPIO toggler application running directly out of Flash) but I'm not sure how to get booted into the embOS environment. I'm using the IAR development environment.

My attempts to boot from flash have yielded an unresponsive board. When I reattach to it with the J-Link, it appears to be stuck in a loop hitting the undefined instruction exception vector repeatedly.

Is there any sample code that shows booting from NOR flash, copying the application into internal SRAM, and remapping?

Thanks much.

Michael

Souhail

Super Moderator

Date of registration: Nov 15th 2007

Posts: 19

2

Thursday, November 15th 2007, 5:45pm

Atmel AT91SAM9261 NOR boot code

Hi mtconnol,

To do this, you need to do several steps:
  1. Modify the link file.
    Since we want to copy the application into internal SRAM, we must reserve some RAM for this.
    Therefore the DATA segments is after this area.

    C/C++ Source code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    
    //*************************************************************************
    // XLINK command file for AT91SAM9261 using an external NOR flash
    //
    // Usage:  xlink  -f lnkarm  <your_object_file(s)>
    //            	-s <program start label>  <C/C++ runtime library>
    //
    //*************************************************************************
    
    //*************************************************************************
    -carm
    
    //
    // These settings are used for link the application.
    //
    -DROMSTART=00000000
    -DROMEND=00028000
    
    //
    //  Define the internal SRAM.
    //
    -DIRAM_START=00300000
    -DIRAM_SIZE=28000
    -DIRAM_END=(IRAM_START+IRAM_SIZE-1)
    
    //
    //  Define the external SDRAM.
    //
    -DSDRAMSTART=20000000
    -DSDRAM_SIZE=4000000
    -DSDRAMEND=(SDRAMSTART+SDRAM_SIZE-1)
    
    
    //
    //  These defines are used for copying the code from ROM to RAM.
    //  We reserve 1/2 of the SRAM for this. (80kByte)
    //
    -DRAMCODE_START=IRAM_START
    -DRAMCODE_SIZE=14000
    -DRAMCODE_END=(RAMCODE_START+RAMCODE_SIZE-1)
    
    //
    // Read/Write segments are after the reserved "RAMCode segement".
    // You can alternatively use the external SDRAM for this.
    // This will look like this:
    // -DRAMSTART=SDRAMSTART
    // -DRAMEND=SDRAMEND
    // 
    -DRAMSTART=(RAMCODE_END+1)
    -DRAMEND=IRAM_END
    
    
    //*************************************************************************
    // Address range for reset and exception
    // vectors (INTVEC).
    // The vector area is 32 bytes,
    // an additional 32 bytes is allocated for the
    // constant table used by ldr PC in cstartup.s79.
    //*************************************************************************
    -Z(CODE)PROGRAM_START=ROMSTART-ROMEND
    -Z(CODE)INTVEC=ROMSTART-ROMEND
    
    //*************************************************************************
    // Startup code and exception routines (ICODE).
    //*************************************************************************
    -Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
    -Z(CODE)SWITAB=ROMSTART-ROMEND
    
    -Z(CODE)RAMCODE=RAMCODE_START-RAMCODE_END
    
    //*************************************************************************
    // Code segments may be placed anywhere.
    //*************************************************************************
    -Z(CODE)CODE=ROMSTART-ROMEND
    
    //*************************************************************************
    // Various constants and initializers.
    //*************************************************************************
    -Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
    -Z(CONST)CHECKSUM=ROMSTART-ROMEND
    -Z(CONST)PROGRAM_END
    
    //*************************************************************************
    // Data segments.
    //*************************************************************************
    -Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
    
    //*************************************************************************
    // __ramfunc code copied to and executed from RAM.
    //*************************************************************************
    -Z(DATA)CODE_I=RAMSTART-RAMEND
    -Z(CONST)CODE_ID=ROMSTART-ROMEND
    -QCODE_I=CODE_ID
    
    //*************************************************************************
    // ICCARM produces code for __ramfunc functions in
    // CODE_I segments. The -Q XLINK command line
    // option redirects XLINK to emit the code in the
    // debug information associated with the CODE_I
    // segment, where the code will execute.
    //*************************************************************************
    
    //*************************************************************************
    // Stack and heap segments.
    //*************************************************************************
    -D_CSTACK_SIZE=(100*4)
    -D_IRQ_STACK_SIZE=(8*8*4)  // 8 nesting levels, 8 registers saved, 4 bytes each
    
    // System and IRQ stack should reside in internal RAM if possible
    -Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
    -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
    
    //*************************************************************************
    // ELF/DWARF support.
    //
    // Uncomment the line "-Felf" below to generate ELF/DWARF output.
    // Available format specifiers are:
    //
    //   "-yn": Suppress DWARF debug output
    //   "-yp": Multiple ELF program sections
    //   "-yas": Format suitable for debuggers from ARM Ltd (also sets -p flag)
    //
    // "-Felf" and the format specifiers can also be supplied directly as
    // command line options, or selected from the Xlink Output tab in the
    // IAR Embedded Workbench.
    //*************************************************************************
    
    // -Felf

  2. Copy your embOS application into internal SRAM.
    We can do that in __low_level_init().
    Add following lines to your __low_level_init() after PLL initialization:

    C/C++ Source code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
      {
    #define MATRIX_MCFG (*(volatile unsigned long *)(0xFFFFEE00))
    
    #pragma segment="RAMCODE"
    #pragma segment="PROGRAM_START"
    #pragma segment="PROGRAM_END"
    	void * pSrc  = __sfb("RAMCODE");
    	void * pDest = __sfb("PROGRAM_START"); 
    	OS_U32 Size  = (int)((OS_U8 *)__sfb("PROGRAM_START") - (OS_U8 *)__sfb("PROGRAM_END"));
    	
    	//
    	// Copy ROM to internal SRAM
    	//
    	memcpy(pDest, pSrc, Size);
    	//
    	//  Remap internal SRAM to 0
    	//
    	MATRIX_MCFG = 0x03;
      }

Let me know if this solves your problem.

Souhail