📄 boot_ads.s.svn-base
字号:
; ****************************************************************************; * This confidential and proprietary software may be used only as authorized*; * by a licensing agreement from STMicroelectronics. *; * In the event of publication, the following notice is applicable: *; * *; * (C) COPYRIGHT 2004 STMicroelectronics *; * Innovative Systems Design Group - Central R&D *; * ALL RIGHTS RESERVED *; * *; * The entire notice above must be reproduced on all authorized copies. *; * *; * -- File: boot_ads.s *; * -- Author: Christian Gazzina <christian.gazzina@st.com> *; * -- Description: Routine di Boot di PRICe * ; * Versione utilizzante il 'runtime' ADS *; * (chiamata a __main) *; * (abilitazione delle dtcm fin dall'inizio) *; * *; * -- Modification History: - 1.1 (09/08/2004) *; ****************************************************************************; $Id: boot_ads.s,v 1.1 2005/05/26 15:51:47 sp_head Exp $; $Log: boot_ads.s,v $; Revision 1.1 2005/05/26 15:51:47 sp_head; user NI;; Revision 1.1.1.2 2004/12/03 15:34:24 spear; First import from CRD;; Revision 1.1.1.1 2004/12/02 11:07:22 spear; First import from CRD;; ; Revision: 1.2 Tue Nov 23 10:14:57 2004 gazzina; *** empty comment string ***; ; Revision: 1.1 Mon Sep 13 21:32:56 2004 gazzina; freeze pre-AFE INCLUDE arm.equ INCLUDE mmu946T.s INCLUDE MPU_TABLE.equ AREA Boot, CODE, READONLY ; Impostazione degli Stack Pointer; First...trials....Stack_Limit EQU 0x02004000 ; 12 KB USR_Stack EQU Stack_LimitIRQ_Stack EQU Stack_Limit - 0x200SVC_Stack EQU IRQ_Stack - 0x200;Entry point ENTRY; *****************; Exception Vectors; ***************** LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr NOP ; Reserved vector LDR PC, IRQ_Addr LDR PC, FIQ_Addr IMPORT p_nIRQ_ISR ; In code.c Reset_Addr DCD Start_BootUndefined_Addr DCD Undefined_HandlerSWI_Addr DCD SWI_HandlerPrefetch_Addr DCD Prefetch_HandlerAbort_Addr DCD Abort_Handler DCD 0 ; Reserved vectorIRQ_Addr DCD p_nIRQ_ISRFIQ_Addr DCD FIQ_Handler; ************************; Interrupt per ora; Disabilitati; ************************Undefined_Handler B ErrorSWI_Handler ; SWI switches to SVC mode, with no IRQs (ARM Architecture Reference) STMFD sp!, {r0-r1} LDR r0, [lr, #-4] ; Read SWI instruction BIC r0, r0, #0xFF000000 ; extract the SWI number LDR r1, =SWI_Angel CMP r0, r1 LDMFD sp!, {r0-r1} ; restore register BNE uHALil_ExitSWI ; Unknown SWI CMP r0, #angel_SWIreason_EnterSVC BEQ uHALir_SWIEnterOS ; return in SVC mode uHALil_ExitSWI MOV r0, #0 ; Pretend it was all okay MOVS pc, lr ; just ignore SWI ; MOVS pc.. will return the Thumb state if called ; from that stateuHALir_SWIEnterOS STMFD sp!, {r0} MRS r0, SPSR ; Get spsr TST r0, #PSR_T_bit ; Occurred in Thumb state? ORRNE r0, r0, #0x13 ; Put into SVC mode MSRNE SPSR_cxsf, r0 ; Save SPSR LDMFD sp!, {r0} ; restore register MOVNES pc, lr MOV pc, lr Prefetch_Handler B ErrorAbort_Handler B ErrorFIQ_Handler B Error Error B ErrorStart_Boot EXPORT Start_Boot;------------------------------------------------------------------------------; DTCM ENABLE;------------------------------------------------------------------------------ ; Set-Up Region Register ; Preserve Misterius SBZ Bit... RD_DTCM_REGION_REGISTER r4 AND r4,r4,#0x00000001 LDR r5, =CP9_DTCM_MAPPING ORR r4,r4,r5 WR_DTCM_REGION_REGISTER r4 ; Enable DTCM ! ENABLE_DTCM r4 ; Read the DTCM size (debug!!!) MRC p15, 0, r4, c0, c0, 2;------------------------------------------------------------------------------; INIT STACK POINTERS;------------------------------------------------------------------------------ ;Enter IRQ Mode and set up its stack MOV R0, #MODE_IRQ_32:OR:DISABLE_IRQ:OR:DISABLE_FIQ; MSR CPSR_c, R0 ;Enter IRQ Mode LDR sp, =IRQ_Stack ;Setup IRQ stack pointer ;Enter SVC Mode and set up its stack MOV R0, #MODE_SVC_32:OR:DISABLE_IRQ:OR:DISABLE_FIQ; MSR CPSR_c, R0 ;Enter SVC Mode LDR sp, =SVC_Stack ;Setup SVC stack pointer ;------------------------------------------------------------------------------; INIT SYSTEM RAM;------------------------------------------------------------------------------ ;Enter USER Mode and set up its stack. IRQ Enabled MOV R0, #MODE_USR_32:OR:DISABLE_FIQ; MSR CPSR_c, R0 ;Enter USER Mode LDR sp, =USR_Stack ;Setup USER stack pointer IMPORT __main B __main; If above subroutine ever returns, just sit in an endless loophere B here END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -