⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootarm.s

📁 MTK debug flash 兼容性的code
💻 S
📖 第 1 页 / 共 5 页
字号:
   MSR     CPSR_cxsf,a3                     ; Switch to supervisor mode (SVC)
   
   LDR     a4, SYSTEM_FATAL_ERROR
   BX      a4

   ENDIF ;/* single bank support */

;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*      INT_ExceptionSwitchSP                                            */
;/*                                                                       */
;/* DESCRIPTION                                                           */
;/*      Saving current stack pointer (SP) at the entry of system error,  */
;/*      including fatal error, assert and CPU exception                  */
;/*      (INT_Exception_SP); and switch SP to exception used stack.       */
;/*                                                                       */
;/* CALLS                                                                 */
;/*                                                                       */
;/* INPUTS                                                                */
;/*      None                                                             */
;/*                                                                       */
;/* OUTPUTS                                                               */
;/*      None                                                             */
;/*************************************************************************/
; VOID INT_ExceptionSwitchSP(VOID)
; {
INT_ExceptionSwitchSP

   LDR   r10, Exception_SP_PTR
   STR   SP, [r10]
   LDR   r10, BOOT_EX_Stack_End
   MOV   SP, r10                            ; Setup initial stack pointer
   [ THUMB
   BX    lr                                 ; Return to caller
   |
   MOV   pc,lr                              ; Return to caller
   ]
;}   

;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*      INT_ExceptionResetSystemSP                                       */
;/*                                                                       */
;/* DESCRIPTION                                                           */
;/*      To reserve complete EX use stack for TST dump mechanism during   */
;/*      system error, EX use stack has to be reset before trapping to    */
;/*      tst_system_assertion_handler().                                  */
;/*                                                                       */
;/* CALLS                                                                 */
;/*                                                                       */
;/* INPUTS                                                                */
;/*      None                                                             */
;/*                                                                       */
;/* OUTPUTS                                                               */
;/*      None                                                             */
;/*************************************************************************/
; VOID INT_ExceptionResetSystemSP( VOID)
; {
INT_ExceptionResetSystemSP
   
   LDR   r10, BOOT_EX_Stack_End
   MOV   SP, r10                            ; Setup initial exception stack pointer   
   
   [ THUMB
   BX    lr                                 ; Return to caller
   |
   MOV   pc,lr                              ; Return to caller
   ]
;}   

;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*      INT_GetCurrentSP                                                 */
;/*                                                                       */
;/* DESCRIPTION                                                           */
;/*      Get the value of the current sp register.                        */
;/* CALLS                                                                 */
;/*                                                                       */
;/* INPUTS                                                                */
;/*      None                                                             */
;/*                                                                       */
;/* OUTPUTS                                                               */
;/*      current sp                                                       */
;/*************************************************************************/
; int INT_GetCurrentSP(VOID)
; {
INT_GetCurrentSP
   
   MOV   r0, sp                             ; get the current stack pointer

   [ THUMB
   BX    lr                                 ; Return to caller
   |
   MOV   pc,lr                              ; Return to caller
   ]
;}

;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*      INT_SwitchStackAndBranch                                         */
;/*                                                                       */
;/* DESCRIPTION                                                           */
;/*      Switch current stack pointer to new_stack and then run           */
;/*      func(argv).                                                      */
;/*                                                                       */
;/* CALLED BY                                                             */
;/*      INT_SwitchStackToRun                                             */
;/*                                                                       */
;/* CALLS                                                                 */
;/*      None                                                             */
;/*                                                                       */
;/* INPUTS                                                                */
;/*      new_stack      the new stack pointer which want to switch to     */
;/*      func           the pointer of function which want to run         */
;/*      argc           the number of arguments of func                   */
;/*      argv           the list of arguments                             */
;/*                                                                       */
;/* OUTPUTS                                                               */
;/*      The reture value of func                                         */
;/*************************************************************************/
; kal_uint32 INT_SwitchStackAndBranch(kal_uint32 new_stack, kal_func_ptr func, kal_uint32 argc, va_list argv)
; {
INT_SwitchStackAndBranch
   EXPORT   INT_SwitchStackAndBranch
   
   STMDB    SP!, {R4-R7, LR}

   MOV      R7, SP                          ; Backup original SP in R7
   LDR      R6, [R3]                        ; Load the poitner of argv
   MOV      R5, R0                          ; Backup new SP in R5
   SUBS     R2, R2, #4                      ; Check if need to copy stack?
   BLS      skip_copy_stack

   ADD      R6, R6, #16
   SUB      R5, R0, R2, LSL #2              ; Reserve new stack to store arg4~n

copy_stack
   LDRHI    R4, [R6], #4                    ; Copy arg4~n from argv to new stack
   STRHI    R4, [R5], #4
   CMP      R0, R5
   BHI      copy_stack

   SUB      R5, R0, R2, LSL #2              ; Change new stack pointer

skip_copy_stack
   MOV      R6, R1                          ; Backup function pointer
   LDR      R4, [R3]                        ; Backup the pointer of argv;

   LDR      R0, [R4]                        ; Setup arguments of procedure call
   LDR      R1, [R4, #4]
   LDR      R2, [R4, #8]
   LDR      R3, [R4, #12]

   MOV      SP, R5                          ; Switch to new stack
   ADR      lr, func_return
   BX       R6                              ; Procedure call
func_return
   MOV      SP, R7                          ; Switch back to old stack

   LDMIA    SP!, {R4-R7, PC}
;}

   IF SINGLE_BANK_SUPPORT
   CODE32
   AREA |SNORCODE|, CODE, READONLY

   IMPORT Flash_ReturnReady

FIQ_RETURN_PTR
   DCD     processing_fiqlr

INT_FIQ_Parse

    STMDB   sp!, {a2}
    MRS     a2, SPSR
    TST     a2, #F_BIT
    LDMIA   sp!, {a2}
    SUBNES  PC,lr,#4

    STMDB   sp!,{a1-a4}                     ; Save a1-a4 on temporary FIQ stack
    SUB     a4,lr,#4                        ; Save IRQ's lr (return address)
    
    LDR     a1, FIQ_RETURN_PTR
    STR     a4, [a1]                        ; Save IRQ's return address to global variable.

   IF SINGLE_BANK_SUPPORT
    STMDB   sp!,{a1-a4,r12,r14}
    BL      Flash_ReturnReady               ; make flash enter ready state
    LDMIA   sp!,{a1-a4,r12,r14}             ; r12 is for veneer use
   ENDIF

    BL      TCT_Interrupt_Context_Save      ; Call context save routine
    BL      INT_FIQ_Lisr
    B       TCT_Interrupt_Context_Restore


SYSTEM_FATAL_ERROR
   DCD     stack_system_error

Default_ISR
   SUBS     pc,lr,#4

;  
;/*************************************************************************/
;/* The following section contains the remaining interrupt handlers.      */
;/* Place you Interrupt Service routine at the appropriate label.         */
;/* For IRQ, you can use Nucleus PLUS call to NU_Register_LISR            */
;/* setup up an interrupt service routine.                                */
;/*************************************************************************/

Undef_Instr_ISR
   MOV      a1,#UNDEF_EXCEPTION_TYPE        ; Set type UND_ISR   (1)
   MOV      a2,lr
   B        saveException

SWI_ISR
   MOV      a1,#SWI_EXCEPTION_TYPE          ; Set type SWI_ISR   (2)
   MOV      a2,lr
   B        saveException

Prefetch_Abort_ISR
   MOV      a1,#PREFETCH_EXCEPTION_TYPE     ; Set type ABORT_ISR (3)
   MOV      a2,lr
   B        saveException

Data_Abort_ISR
   MOV      a1,#DATA_EXCEPTION_TYPE         ; Set type DATA_ABORT (4)
   MOV      a2,lr
   
saveException  
   MRS     a3,CPSR                          ; Pickup current CPSR
   BIC     a3,a3,#MODE_MASK                 ; Clear the mode bits
   ORR     a3,a3,#SUP_MODE                  ; Prepare to switch to supervisor mode (SVC)
   MSR     CPSR_cxsf,a3                     ; Switch to supervisor mode (SVC)
   
   IF SINGLE_BANK_SUPPORT
    STMDB   sp!,{a1-a4,r12,r14}
    BL      Flash_ReturnReady               ; make flash enter ready state
    LDMIA   sp!,{a1-a4,r12,r14}             ; r12 is for veneer use
   ENDIF

   LDR     a4, SYSTEM_FATAL_ERROR
   BX      a4

   ENDIF ;/* single bank support */

   CODE32
   AREA |INTERNCODE|, CODE, READONLY

;
;}
;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*                                                                       */
;/*      INT_IRQ_Parse                                                    */
;/*                                                                       */
;/* DESCRIPTION                                                           */
;/*                                                                       */
;/*      This routine is the board-specific section for                   */
;/*      interrupt handling                                               */
;/*                                                                       */
;/*************************************************************************/
INT_IRQ_Parse

    IF KAL_ON_NUCLEUS

    STMDB   sp!, {a2}
    MRS     a2, SPSR
    TST     a2, #I_BIT
    LDMIA   sp!, {a2}
    SUBNES  pc,lr,#4

    STMDB   sp!,{a1-a4}                     ; Save a1-a4 on temporary IRQ stack
    SUB     a4,lr,#4                        ; Save IRQ's lr (return address)

    LDR     a1,=processing_irqlr
    STR     a4, [a1]                        ; Save IRQ's return address to global variable.

  IF DCM_ENABLE
    STMDB   sp!,{a1-a4}
    STMDB   sp!,{r12}
    STMDB   sp!,{r14}
    BL   DCM_Recovery 
    LDMIA   sp!,{r14}
    LDMIA   sp!,{r12}
    LDMIA   sp!,{a1-a4}  
  ENDIF

   IF SINGLE_BANK_SUPPORT
    STMDB   sp!,{a1-a4,r12,r14}
    BL      Flash_ReturnReady               ; make flash enter ready state
    LDMIA   sp!,{a1-a4,r12,r14}             ; r12 is for veneer use
   ENDIF

    BL      TCT_Interrupt_Context_Save      ; Call context save routine
    BL      isrC_Main
    B       TCT_Interrupt_Context_Restore

    ELSE

    STMDB   sp!, {a2}
    MRS     a2, SPSR
    TST     a2, #I_BIT
    LDMIA   sp!, {a2}
    SUBNES  pc,lr,#4

    STMDB   sp!,{a1,a4}                     ; Save a1 and a4 on temporary IRQ stack

    SUB     a4,lr,#4                        ; Save IRQ's lr (return address)
    LDR     a1,=processing_irqlr
    STR     a4, [a1]                        ; Save IRQ's return address to global variable.

    LDMIA   sp!,{a1,a4}                     ; Restore a1 and a4

  IF DCM_ENABLE
    STMDB   sp!,{a1-a4}
    STMDB   sp!,{r12}
    STMDB   sp!,{r14}
    BL   DCM_Recovery 
    LDMIA   sp!,{r14}
    LDMIA   sp!,{r12}
    LDMIA   sp!,{a1-a4}  
  ENDIF

    B       _tx_thread_context_save
__tx_irq_processing_return
    BL      _tx_thread_irq_nesting_start
    BL      isrC_Main
    BL      _tx_thread_irq_nesting_end
    B       _tx_thread_context_restore
 
    ENDIF


;
;/*************************************************************************/
;/*                                                                       */
;/* FUNCTION                                                              */
;/*      DisableIRQ                                                       */
;/*                                                       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -