Personal tools

Log in

Changes

From IGEP - ISEE Wiki

Jump to: navigation, search

The IGEP X-loader

3,676 bytes added, 12:09, 26 February 2011
no edit summary
The IGEP X-Loader must reside in the microSD card or in the OneNand.<br>
== Low Level Initialization ==
The OMAP Processor loads the XLoader directly from the mmc or the OneNand and copy the binary into the internal processor RAM (0x40200000) and jump to this place, this internal memory it's limited to 64K divided as: Interrupts, code, data and stack. Initialization code can be found using this link: [http://git.igep.es/?p=pub/scm/igep-x-loader.git;a=blob;f=cpu/omap3/start.S;h=4cbf4379b8502ebfe0409b35e4aafba712234c34;hb=HEAD start.S]&nbsp;
<pre>&nbsp; 96 reset:
97 /*
98 * set the cpu to SVC32 mode
99 */
100 mrs r0,cpsr
101 bic r0,r0,#0x1f
102 orr r0,r0,#0xd3
103 msr cpsr,r0
 
104
 
105 /* Copy vectors to mask ROM indirect addr */
 
106 adr r0, _start /* r0 &lt;- current position of code */
 
107 add r0, r0, #4 /* skip reset vector */
 
108 mov r2, #64 /* r2 &lt;- size to copy */
 
109 add r2, r0, r2 /* r2 &lt;- source end address */
 
110 mov r1, #SRAM_OFFSET0 /* build vect addr */
 
111 mov r3, #SRAM_OFFSET1
 
112 add r1, r1, r3
 
113 mov r3, #SRAM_OFFSET2
 
114 add r1, r1, r3
 
115 next:
 
116 ldmia r0!, {r3-r10} /* copy from source address [r0] */
 
117 stmia r1!, {r3-r10} /* copy to target address [r1] */
 
118 cmp r0, r2 /* until source end address [r2] */
 
119 bne next /* loop until equal */
 
120
 
121 bl cpy_clk_code /* put dpll adjust code behind vectors */
 
122
 
123 /* the mask ROM code should have PLL and others stable */
 
124 bl cpu_init_crit
 
125
 
126 relocate: /* relocate U-Boot to RAM */
 
127 adr r0, _start /* r0 &lt;- current position of code */
 
128 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
 
129 cmp r0, r1 /* no need to relocate if XIP */
 
130 beq stack_setup /* skip txt cpy if XIP(SRAM, SDRAM) */
 
131
 
132 ldr r2, _armboot_start
 
133 ldr r3, _bss_start
 
134 sub r2, r3, r2 /* r2 &lt;- size of armboot */
 
135 add r2, r0, r2 /* r2 &lt;- source end address */
 
136
 
137 copy_loop:
 
138 ldmia r0!, {r3-r10} /* copy from source address [r0] */
 
139 stmia r1!, {r3-r10} /* copy to target address [r1] */
 
140 cmp r0, r2 /* until source end addreee [r2] */
 
141 ble copy_loop
 
142
 
143 /* Set up the stack */
 
144 stack_setup:
 
145 ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
 
146 sub sp, r0, #128 /* leave 32 words for abort-stack */
 
147 and sp, sp, #~7 /* 8 byte alinged for (ldr/str)d */
 
148
 
149 /* Clear BSS (if any). Is below tx (watch load addr - need space) */
 
150 clear_bss:
 
151 ldr r0, _bss_start /* find start of bss segment */
 
152 ldr r1, _bss_end /* stop here */
 
153 mov r2, #0x00000000 /* clear value */
 
154 clbss_l:
 
155 str r2, [r0] /* clear BSS location */
 
156 cmp r0, r1 /* are we at the end yet */
 
157 add r0, r0, #4 /* increment clear index pointer */
 
158 bne clbss_l /* keep clearing till at end */
 
159
 
160 ldr pc, _start_armboot /* jump to C code */
 
161
 
162 _start_armboot: .word start_armboot
 
</pre>
<br>
 
<br>
it do a basic initialization and at end jump to the C initial function called [http://git.igep.es/?p=pub/scm/igep-x-loader.git;a=blob;f=lib/board.c start_armboot] defined in the file lib/board.c.<br>
== C Execution Flow<br> ==
=== cpu_init<br> ===
Function: [http://git.igep.es/?p=pub/scm/igep-x-loader.git;a=blob;f=cpu/omap3/cpu.c cpu_init]<br>
This function it's the responsable to do the CPU generic initialization and it's the first function called. <br>
=== board_init<br> ===
Function: [http://git.igep.es/?p=pub/scm/igep-x-loader.git;a=blob;f=board/igep0020/igep0020.c board_init]<br>
This function it's defined per board and it's the responsable to initialize the board,