/* | |
* File: mcf5225x_lo.s | |
* Purpose: Low-level routines for the MCF5225x. | |
* | |
* Notes: | |
* | |
* License: All software covered by license agreement in - | |
* docs/Freescale_Software_License.pdf | |
*/ | |
#define mcf5225x_init _mcf5225x_init | |
#define common_startup _common_startup | |
#define cpu_startup _cpu_startup | |
#define main _main | |
#define __IPSBAR ___IPSBAR | |
#define __SRAM ___SRAM | |
#define __FLASH ___FLASH | |
#define __SP_INIT ___SP_INIT | |
.extern __IPSBAR | |
.extern __SRAM | |
.extern __FLASH | |
.extern __SP_INIT | |
.extern mcf5225x_init | |
.extern common_startup | |
.extern cpu_startup | |
.extern main | |
.global asm_startmeup | |
.global _asm_startmeup | |
.global d0_reset | |
.global _d0_reset | |
.global d1_reset | |
.global _d1_reset | |
.data | |
d0_reset: | |
_d0_reset: .long 0 | |
d1_reset: | |
_d1_reset: .long 0 | |
.text | |
/******************************************************************** | |
* | |
* This is the main entry point upon hard reset. The memory map is | |
* setup based on linker file definitions, then the higher level | |
* system initialization routine is called. Finally, we jump to the | |
* "main" process. | |
*/ | |
asm_startmeup: | |
_asm_startmeup: | |
move.w #0x2700,sr | |
/* Save off reset values of D0 and D1 */ | |
move.l d0,d6 | |
move.l d1,d7 | |
/* Initialize RAMBAR1: locate SRAM and validate it */ | |
move.l #__SRAM,d0 | |
andi.l #0xFFFF0000,d0 | |
add.l #0x21,d0 | |
movec d0,RAMBAR1 | |
/* Locate Stack Pointer */ | |
move.l #__SP_INIT,sp | |
/* Initialize IPSBAR */ | |
move.l #__IPSBAR,d0 | |
add.l #0x1,d0 | |
move.l d0,0x40000000 | |
/* Initialize FLASHBAR */ | |
move.l #__FLASH,d0 | |
cmp.l #0x00000000,d0 | |
bne change_flashbar | |
add.l #0x61,d0 | |
movec d0,RAMBAR0 | |
_continue_startup: | |
/* Locate Stack Pointer */ | |
move.l #__SP_INIT,sp | |
/* Initialize the system */ | |
jsr mcf5225x_init | |
/* Common startup code */ | |
//jsr common_startup | |
/* Save off intial D0 and D1 to RAM */ | |
move.l d6,d0_reset | |
move.l d7,d1_reset | |
/* CPU specific startup code */ | |
//jsr cpu_startup | |
/* Jump to the main process */ | |
jsr main | |
bra . | |
nop | |
nop | |
halt | |
change_flashbar: | |
/* | |
* The following sequence is used to set FLASHBAR. Since we may | |
* be executing from Flash, we must put the routine into SRAM for | |
* execution and then jump back to Flash using the new address. | |
* | |
* The following instructions are coded into the SRAM: | |
* | |
* move.l #(__FLASH + 0x21),d0 | |
* movec d0, RAMBAR0 | |
* jmp _continue_startup | |
* | |
* An arbitrary SRAM address is chosen until the real address | |
* can be loaded. | |
* | |
* This routine is not necessary if the default Flash address | |
* (0x00000000) is used. | |
* | |
* If running in SRAM, change_flashbar should not be executed | |
*/ | |
move.l #__SRAM,a0 | |
/* Code "move.l #(__FLASH + 0x21),d0" into SRAM */ | |
move.w #0x203C,d0 | |
move.w d0,(a0)+ | |
move.l #__FLASH,d0 | |
add.l #0x21,d0 | |
move.l d0,(a0)+ | |
/* Code "movec d0,FLASHBAR" into SRAM */ | |
move.l #0x4e7b0C04,d0 | |
move.l d0,(a0)+ | |
/* Code "jmp _continue_startup" into SRAM */ | |
move.w #0x4EF9,d0 | |
move.w d0,(a0)+ | |
move.l #_continue_startup,d0 | |
move.l d0,(a0)+ | |
/* Jump to code segment in internal SRAM */ | |
jmp __SRAM | |
/********************************************************************/ | |
.end |