FreeCalypso > hg > ffs-editor
comparison src/cs/system/main/gcc/bootentry.S @ 0:92470e5d0b9e
src: partial import from FC Selenite
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 15 May 2020 01:28:16 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:92470e5d0b9e |
|---|---|
| 1 /* | |
| 2 * This assembly module is our counterpart to TI's int.s: all boot entry | |
| 3 * point code that needs to be at the beginning of the flash resides here. | |
| 4 */ | |
| 5 | |
| 6 #include "asm_defs.h" | |
| 7 #include "fc-target.h" | |
| 8 #include "rf.cfg" | |
| 9 | |
| 10 #if defined(FLASH) && !defined(CONFIG_TARGET_COMPAL) | |
| 11 /* | |
| 12 * Put something sensible in the boot ROM overlay area, just for the | |
| 13 * heck of it, or for extra robustness. | |
| 14 */ | |
| 15 .section bootrom.overlay,"ax",%progbits | |
| 16 .code 32 | |
| 17 .org 0 | |
| 18 b BootROM_disabled_entry | |
| 19 #include "vectors.S" | |
| 20 BootROM_disabled_entry: | |
| 21 /* copy the boot ROM switch code to IRAM and jump to it */ | |
| 22 ldr r4, =__romswitch_flash_addr | |
| 23 ldr r5, =__romswitch_ram_addr | |
| 24 ldr r2, =__romswitch_size | |
| 25 1: ldr r0, [r4], #4 | |
| 26 str r0, [r5], #4 | |
| 27 subs r2, r2, #4 | |
| 28 bhi 1b | |
| 29 ldr pc, =__romswitch_ram_addr | |
| 30 | |
| 31 .section bootrom.switch,"ax",%progbits | |
| 32 .code 32 | |
| 33 .org 0 | |
| 34 @ enable the Calypso boot ROM | |
| 35 ldr r1, =0xFFFFFB10 | |
| 36 mov r2, #0x0100 | |
| 37 strh r2, [r1] | |
| 38 @ jump to it! | |
| 39 mov pc, #0 | |
| 40 #endif | |
| 41 | |
| 42 .section .inttext,"ax",%progbits | |
| 43 .code 32 | |
| 44 | |
| 45 #ifdef FLASH | |
| 46 .org 0 | |
| 47 #ifndef CONFIG_TARGET_COMPAL | |
| 48 /* sane targets with Calypso boot ROM enabled by the PCB wiring */ | |
| 49 /* provide the necessary magic words for the boot ROM */ | |
| 50 .word 0 | |
| 51 .word _Firmware_boot_entry | |
| 52 #elif defined(CONFIG_TARGET_C11X) || defined(CONFIG_TARGET_C139) || \ | |
| 53 defined(CONFIG_TARGET_J100) | |
| 54 /* | |
| 55 * On this target we'll put a patched version of Compal's boot code in | |
| 56 * flash sector 0 (the brickable one); the main fw images will then be | |
| 57 * flashed starting at 0x10000, which is where our modified boot code | |
| 58 * expects them to be. The interface between our hacked boot code and | |
| 59 * the main fw has been made to mimic TI's TCS211 reference fw. | |
| 60 */ | |
| 61 #include "vectors.S" | |
| 62 .org 0x58 /* entry point at 0x10058 */ | |
| 63 b _Firmware_boot_entry | |
| 64 #elif defined(CONFIG_TARGET_C155) | |
| 65 /* | |
| 66 * On this target the hand-off point between the bootloader and the main | |
| 67 * fw image coincides with a flash erase block boundary, thus we can reuse | |
| 68 * the original bootloader without having to reflash the brickable sector | |
| 69 * at all. The following bits will appear at 0x20000. | |
| 70 */ | |
| 71 .asciz "FreeCalypso firmware for C155/156 target" | |
| 72 .org 0xE0 | |
| 73 /* C155/156 bootloader jumps here */ | |
| 74 b _Firmware_boot_entry | |
| 75 #include "vectors.S" | |
| 76 #else | |
| 77 #error "Unsupported flash boot configuration" | |
| 78 #endif | |
| 79 #endif | |
| 80 | |
| 81 /* definitions from TI's int.s */ | |
| 82 | |
| 83 #define IRQ_STACK_SIZE 128 | |
| 84 #define FIQ_STACK_SIZE 512 | |
| 85 #define SYSTEM_SIZE 1024 | |
| 86 #define TIMER_SIZE 1024 | |
| 87 #define TIMER_PRIORITY 2 | |
| 88 | |
| 89 @ TI's literal pool before the entry point | |
| 90 | |
| 91 addrCS0: .word 0xfffffb00 @ CS0 address space | |
| 92 | |
| 93 EX_MPU_CONF_REG: .word 0xFFFEF006 @ Extended MPU configuration register address | |
| 94 EX_FLASH_VALUE: .short 0x0008 @ set bit to enable A22 | |
| 95 | |
| 96 .balign 4 | |
| 97 | |
| 98 CNTL_ARM_CLK_REG: .word 0xFFFFFD00 @ CNTL_ARM_CLK register address | |
| 99 DPLL_CNTRL_REG: .word 0xFFFF9800 @ DPLL control register address | |
| 100 EXTRA_CONTROL_REG: .word 0xFFFFFB10 @ Extra Control register CONF address | |
| 101 MPU_CTL_REG: .word 0xFFFFFF08 @ MPU_CTL register address | |
| 102 | |
| 103 CNTL_ARM_CLK_RST: .short 0x1081 @ Initialization of CNTL_ARM_CLK register | |
| 104 @ Use DPLL, Divide by 1 | |
| 105 DPLL_CONTROL_RST: .short 0x2002 @ Configure DPLL in default state | |
| 106 DISABLE_DU_MASK: .short 0x0800 @ Mask to Disable the DU module | |
| 107 ENABLE_DU_MASK: .short 0xF7FF @ Mask to Enable the DU module | |
| 108 MPU_CTL_RST: .short 0x0000 @ Reset value of MPU_CTL register - All protections disabled | |
| 109 | |
| 110 @ FreeCalypso change, please see MEMIF-wait-states document | |
| 111 @ in the freecalypso-docs repository for the explanation. | |
| 112 | |
| 113 #if (RF_FAM == 12) | |
| 114 CS0_MEM_REG: .short 0x2a2 @ 1 Dummy Cycle 16 bit 2 WS SW BP enable | |
| 115 CS1_MEM_REG: .short 0x2a2 @ 1 Dummy Cycle 16 bit 2 WS SW BP enable | |
| 116 CS2_MEM_REG: .short 0x2a2 @ 1 Dummy Cycle 16 bit 2 WS SW BP enable | |
| 117 #else | |
| 118 CS0_MEM_REG: .short 0x2a1 @ 1 Dummy Cycle 16 bit 1 WS SW BP enable | |
| 119 CS1_MEM_REG: .short 0x2a1 @ 1 Dummy Cycle 16 bit 1 WS SW BP enable | |
| 120 CS2_MEM_REG: .short 0x2a1 @ 1 Dummy Cycle 16 bit 1 WS SW BP enable | |
| 121 #endif | |
| 122 CS3_MEM_REG: .short 0x283 @ 1 Dummy Cycle 8 bit 3 WS SW BP enable | |
| 123 CS4_MEM_REG: .short 0xe85 @ default reset value | |
| 124 CS6_MEM_REG: .short 0x2c0 @ Internal RAM init : 0 WS, 32 bits, little, write enable | |
| 125 CS7_MEM_REG: .short 0x040 @ Internal BOOT ROM init : 0 WS, 32 bits, little, write disable | |
| 126 CTL_MEM_REG: .short 0x02a @ rhea strobe 0/1 + API access size adaptation | |
| 127 | |
| 128 .balign 4 | |
| 129 | |
| 130 .globl _Firmware_boot_entry | |
| 131 _Firmware_boot_entry: | |
| 132 @ TI's code from int.s follows | |
| 133 | |
| 134 @ | |
| 135 @ Configure DPLL register with reset value | |
| 136 @ | |
| 137 ldr r1,DPLL_CNTRL_REG @ Load address of DPLL register in R1 | |
| 138 ldrh r2,DPLL_CONTROL_RST @ Load DPLL reset value in R2 | |
| 139 strh r2,[r1] @ Store DPLL reset value in DPLL register | |
| 140 | |
| 141 @ | |
| 142 @ Wait that DPLL goes in BYPASS mode | |
| 143 @ | |
| 144 Wait_DPLL_Bypass: | |
| 145 ldr r2,[r1] @ Load DPLL register | |
| 146 and r2,r2,#1 @ Perform a mask on bit 0 | |
| 147 cmp r2,#1 @ Compare DPLL lock bit | |
| 148 beq Wait_DPLL_Bypass @ Wait Bypass mode (i.e. bit[0]='0') | |
| 149 | |
| 150 @ | |
| 151 @ Configure CNTL_ARM_CLK register with reset value: DPLL is used to | |
| 152 @ generate ARM clock with division factor of 1. | |
| 153 @ | |
| 154 ldr r1,CNTL_ARM_CLK_REG @ Load address of CNTL_ARM_CLK register in R1 | |
| 155 ldrh r2,CNTL_ARM_CLK_RST @ Load CNTL_ARM_CLK reset value in R2 | |
| 156 strh r2,[r1] @ Store CNTL_ARM_CLK reset value in CNTL_ARM_CLK register | |
| 157 | |
| 158 @ | |
| 159 @ Disable/Enable the DU module by setting/resetting bit 11 to '1'/'0' | |
| 160 @ | |
| 161 ldr r1,EXTRA_CONTROL_REG @ Load address of Extra Control register CONF | |
| 162 ldrh r2,ENABLE_DU_MASK @ Load mask to write in Extra Control register CONF | |
| 163 ldrh r0,[r1] @ Load Extra Control register CONF in r0 | |
| 164 and r0,r0,r2 @ Enable DU module | |
| 165 strh r0,[r1] @ Store configuration in Extra Control register CONF | |
| 166 | |
| 167 @ | |
| 168 @ Disable all MPU protections | |
| 169 @ | |
| 170 ldr r1,MPU_CTL_REG @ Load address of MPU_CTL register | |
| 171 ldrh r2,MPU_CTL_RST @ Load reset value of MPU_CTL register | |
| 172 strh r2,[r1] @ Store reset value of MPU_CTL register | |
| 173 | |
| 174 @ MEMIF timing setup | |
| 175 | |
| 176 ldr r1,addrCS0 | |
| 177 ldrh r2,CS0_MEM_REG @ ROM initialization | |
| 178 strh r2,[r1] @ CS0 | |
| 179 | |
| 180 ldrh r2,CS1_MEM_REG @ RAM Initialization | |
| 181 strh r2,[r1,#2] @ CS1 | |
| 182 | |
| 183 ldrh r2,CS2_MEM_REG @ RAM Initialization | |
| 184 strh r2,[r1,#4] @ CS2 | |
| 185 | |
| 186 ldrh r2,CS3_MEM_REG @ Parallel I/O on B-Sample | |
| 187 strh r2,[r1,#6] @ CS3 (unused on EVA4?) | |
| 188 | |
| 189 ldrh r2,CS4_MEM_REG @ Latch on B-Sample | |
| 190 strh r2,[r1,#0xa] @ CS4 (unused on EVA4) | |
| 191 | |
| 192 ldrh r2,CS6_MEM_REG @ Internal SRAM initialization | |
| 193 strh r2,[r1,#0xc] @ CS6 Internal RAM | |
| 194 | |
| 195 ldrh r2,CS7_MEM_REG @ Internal SRAM initialization | |
| 196 strh r2,[r1,#0x8] @ CS7 Internal Boot ROM | |
| 197 | |
| 198 ldrh r2,CTL_MEM_REG @ API-RHEA configuration | |
| 199 strh r2,[r1,#0xe] | |
| 200 | |
| 201 @ enable ADD22 | |
| 202 | |
| 203 ldr r1,EX_MPU_CONF_REG | |
| 204 ldrh r2,[r1] | |
| 205 ldr r0,EX_FLASH_VALUE | |
| 206 orr r0, r0, r2 | |
| 207 strh r0,[r1] | |
| 208 | |
| 209 /* Ensure that the processor is in supervisor mode. */ | |
| 210 | |
| 211 MRS a1,CPSR @ Pickup current CPSR | |
| 212 BIC a1,a1,#MODE_MASK @ Clear the mode bits | |
| 213 ORR a1,a1,#SUP_MODE @ Set the supervisor mode bits | |
| 214 ORR a1,a1,#LOCKOUT @ Ensure IRQ and FIQ interrupts are | |
| 215 @ locked out | |
| 216 MSR CPSR,a1 @ Setup the new CPSR | |
| 217 | |
| 218 /* | |
| 219 * FreeCalypso Selenite: if this is a flash build, | |
| 220 * copy IRAM code and .data from flash to RAM. | |
| 221 */ | |
| 222 | |
| 223 #ifdef FLASH | |
| 224 /* copy iram.text to where it's supposed to be */ | |
| 225 ldr r8, =__iramtext_flash_addr | |
| 226 ldr r9, =__iramtext_ram_addr | |
| 227 ldr r10, =__iramtext_size | |
| 228 1: ldmia r8!, {r0-r7} | |
| 229 stmia r9!, {r0-r7} | |
| 230 subs r10, r10, #0x20 | |
| 231 bhi 1b | |
| 232 /* likewise copy .data from flash to XRAM */ | |
| 233 ldr r8, =__initdata_flash_addr | |
| 234 ldr r9, =__initdata_ram_addr | |
| 235 ldr r10, =__initdata_size | |
| 236 1: ldmia r8!, {r0-r7} | |
| 237 stmia r9!, {r0-r7} | |
| 238 subs r10, r10, #0x20 | |
| 239 bhi 1b | |
| 240 #endif | |
| 241 | |
| 242 /* Both flash and XRAM builds: zero .bss */ | |
| 243 | |
| 244 ldr r0, =__intbss_start | |
| 245 ldr r1, =__intbss_size | |
| 246 bl bzero | |
| 247 ldr r0, =__extbss_start | |
| 248 ldr r1, =__extbss_size | |
| 249 bl bzero | |
| 250 | |
| 251 @ TI's int.s code continues | |
| 252 | |
| 253 @ | |
| 254 @ Initialize the system stack pointers. This is done after the BSS is | |
| 255 @ cleared because the TCD_System_Stack pointer is a BSS variable! It is | |
| 256 @ assumed that the .cmd file is written to direct where these stacks should | |
| 257 @ be allocated and to align them on double word boundaries. | |
| 258 @ | |
| 259 LDR a1,StackSegment @ Pickup the begining address from .cmd file | |
| 260 @ (is aligned on 8 byte boundary) | |
| 261 MOV a2,#SYSTEM_SIZE @ Pickup system stack size | |
| 262 SUB a2,a2,#4 @ Subtract one word for first addr | |
| 263 ADD a3,a1,a2 @ Build start of system stack area | |
| 264 MOV v7,a1 @ Setup initial stack limit | |
| 265 LDR a4,System_Limit @ Pickup system stack limit address | |
| 266 STR v7,[a4, #0] @ Save stack limit | |
| 267 MOV sp,a3 @ Setup initial stack pointer | |
| 268 LDR a4,System_Stack @ Pickup system stack address | |
| 269 STR sp,[a4, #0] @ Save stack pointer | |
| 270 MOV a2,#IRQ_STACK_SIZE @ Pickup IRQ stack size in bytes | |
| 271 ADD a3,a3,a2 @ Allocate IRQ stack area | |
| 272 MRS a1,CPSR @ Pickup current CPSR | |
| 273 BIC a1,a1,#MODE_MASK @ Clear the mode bits | |
| 274 ORR a1,a1,#IRQ_MODE @ Set the IRQ mode bits | |
| 275 MSR CPSR,a1 @ Move to IRQ mode | |
| 276 MOV sp,a3 @ Setup IRQ stack pointer | |
| 277 MOV a2,#FIQ_STACK_SIZE @ Pickup FIQ stack size in bytes | |
| 278 ADD a3,a3,a2 @ Allocate FIQ stack area | |
| 279 MRS a1,CPSR @ Pickup current CPSR | |
| 280 BIC a1,a1,#MODE_MASK @ Clear the mode bits | |
| 281 ORR a1,a1,#FIQ_MODE @ Set the FIQ mode bits | |
| 282 MSR CPSR,a1 @ Move to the FIQ mode | |
| 283 MOV sp,a3 @ Setup FIQ stack pointer | |
| 284 | |
| 285 MRS a1,CPSR @ Pickup current CPSR | |
| 286 BIC a1,a1,#MODE_MASK @ Clear the mode bits | |
| 287 ORR a1,a1,#ABORT_MODE @ Set the Abort mode bits | |
| 288 MSR CPSR,a1 @ Move to the Abort mode | |
| 289 LDR sp,Exception_Stack @ Setup Abort stack pointer | |
| 290 | |
| 291 MRS a1,CPSR @ Pickup current CPSR | |
| 292 BIC a1,a1,#MODE_MASK @ Clear the mode bits | |
| 293 ORR a1,a1,#UNDEF_MODE @ Set the Undefined mode bits | |
| 294 MSR CPSR,a1 @ Move to the Undefined mode | |
| 295 LDR sp,Exception_Stack @ Setup Undefined stack pointer | |
| 296 @ (should never be used) | |
| 297 | |
| 298 @ go to Supervisor Mode | |
| 299 MRS a1,CPSR @ Pickup current CPSR | |
| 300 BIC a1,a1,#MODE_MASK @ Clear mode bits | |
| 301 ORR a1,a1,#SUP_MODE @ Set the supervisor mode bits | |
| 302 MSR CPSR,a1 @ All interrupt stacks are setup, | |
| 303 @ return to supervisor mode | |
| 304 @ | |
| 305 @ /* Define the global data structures that need to be initialized by this | |
| 306 @ routine. These structures are used to define the system timer | |
| 307 @ management HISR. */ | |
| 308 @ TMD_HISR_Stack_Ptr = (VOID *) a3; | |
| 309 @ TMD_HISR_Stack_Size = TIMER_SIZE; | |
| 310 @ TMD_HISR_Priority = TIMER_PRIORITY; | |
| 311 @ | |
| 312 @ TMD_HISR_Stack_Ptr points at the top (the lowest address) of the allocated | |
| 313 @ area. The Timer HISR (called "SYSTEM H") and its related stack will be created | |
| 314 @ in TMI_Initialize(). The current stack pointer will be set at the bottom (the | |
| 315 @ lowest address) of the expected area. | |
| 316 | |
| 317 LDR a4,HISR_Stack_Ptr @ Pickup variable's address | |
| 318 ADD a3,a3,#4 @ Increment to next available word | |
| 319 STR a3,[a4, #0] @ Setup timer HISR stack pointer | |
| 320 MOV a2,#TIMER_SIZE @ Pickup the timer HISR stack size | |
| 321 BIC a2,a2,#3 @ Insure word alignment | |
| 322 ADD a3,a3,a2 @ Allocate the timer HISR stack | |
| 323 @ from available memory | |
| 324 LDR a4,HISR_Stack_Size @ Pickup variable's address | |
| 325 STR a2,[a4, #0] @ Setup timer HISR stack size | |
| 326 MOV a2,#TIMER_PRIORITY @ Pickup timer HISR priority (0-2) | |
| 327 LDR a4,HISR_Priority @ Pickup variable's address | |
| 328 STR a2,[a4, #0] @ Setup timer HISR priority | |
| 329 | |
| 330 /* TI's original code called f_load_int_mem() at this point */ | |
| 331 /* let's do our internal ROM enable step here */ | |
| 332 | |
| 333 ldr r1, EXTRA_CONTROL_REG | |
| 334 ldrh r0, [r1, #0] | |
| 335 bic r0, #0x0300 | |
| 336 orr r0, #0x0100 | |
| 337 strh r0, [r1, #0] | |
| 338 | |
| 339 @ We now fill up the System, IRQ, FIQ and System Timer HISR stacks with 0xFE for | |
| 340 @ checking the status of the stacks later. | |
| 341 @ inputs: | |
| 342 @ a3 still has the bottom of all four stacks and is aligned. | |
| 343 @ algorithm: | |
| 344 @ We start from the top of all four stacks (*System_Limit), which is | |
| 345 @ necessarily aligned. We store 0xFEFEFEFE until we have filled the | |
| 346 @ bottom of the fourth stack | |
| 347 @ outputs: | |
| 348 @ memory has 0xFE on all four stacks: System, FIQ, IRQ and System Timer HISR | |
| 349 @ a3 still has the bottom of all four stacks | |
| 350 | |
| 351 LDR a2,System_Limit @ pickup system stack limit address | |
| 352 LDR a1,[a2] @ a1 = StackSegment | |
| 353 LDR a4,=0xFEFEFEFE | |
| 354 | |
| 355 fill_stack: | |
| 356 STR a4,[a1],#4 @ store a word and increment by four | |
| 357 CMP a1,a3 @ is this the last address? | |
| 358 BLT fill_stack @ if not, loop back | |
| 359 | |
| 360 @ | |
| 361 @ /* Call INC_Initialize with a pointer to the first available memory | |
| 362 @ address after the compiler's global data. This memory may be used | |
| 363 @ by the application. */ | |
| 364 @ INC_Initialize(first_available_memory); | |
| 365 @ | |
| 366 MOV a1,a3 @ Pass the first available memory | |
| 367 B INC_Initialize @ to high-level initialization | |
| 368 | |
| 369 @ literal pool from int.s (after the code) | |
| 370 | |
| 371 StackSegment: | |
| 372 .word _Stack_segment_start | |
| 373 | |
| 374 System_Limit: | |
| 375 .word TCT_System_Limit | |
| 376 | |
| 377 System_Stack: | |
| 378 .word TCD_System_Stack | |
| 379 | |
| 380 HISR_Stack_Ptr: | |
| 381 .word TMD_HISR_Stack_Ptr | |
| 382 | |
| 383 HISR_Stack_Size: | |
| 384 .word TMD_HISR_Stack_Size | |
| 385 | |
| 386 HISR_Priority: | |
| 387 .word TMD_HISR_Priority | |
| 388 | |
| 389 Exception_Stack: | |
| 390 .word _Except_Stack_SP |
