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

📄 firmware_remap_startup.s79

📁 在BOOTLOADR中增加当今最好AES加密技术,可用于客户远程更新应用程式
💻 S79
字号:
;-----------------------------------
; File:          firmware_remap_startup.s79
; Function:      Basic firmware startup code (with exception vectors remap)
; Supported chip(s):
;    - AT91SAM7XC128
;    - AT91SAM7XC256
; Supported toolchain(s):
;    - IAR Embedded Workbench
; Date created:  04 May 2006
; Created by:    JJo
;-----------------------------------

;-----------------------------------
; Includes

#include <AT91SAM7X256_inc.h>

;-----------------------------------
; Code start

;**
;* Begin a program module, with a 32-bit aligned relocatable code segment located
;* at address 0. Core is in ARM (32-bit) mode.
;**

  PROGRAM ?RESET           
  RSEG	  INTRAMEND_REMAP
  RSEG    INTRAMSTART
  RSEG	  INTVEC:CODE(2)     
  CODE32
  ORG	  0

;-----------------------------------
; Exception vectors
;
; Only IRQ support is required by the bootloader, so it cannot be modified.
; The other vectors can be adjusted depending on the client application.

reset:
  B       initReset           ; 0x00 Reset handler
undefvec:
  B       undef_handler       ; 0x04 Undefined Instruction
swivec:
  B       swi_handler         ; 0x08 Software Interrupt
pabtvec:
  B       pabt_handler        ; 0x0C Prefetch Abort
dabtvec:
  B       dabt_handler        ; 0x10 Data Abort
rsvdvec:
  B       rsvdvec             ; 0x14 reserved
irqvec:
  B       irq_handler         ; 0x18 IRQ		
fiqvec:
  B       fiq_handler         ; 0x1C FIQ

  EXTERN  blinkLed

;-- Blink led 0 and trigger a software interrupt
undef_handler:
  MSR     CPSR_C, #ARM_MODE_SVC
  LDR     r0, =0
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  SWI     0

;-- Blink led 1 and trigger a prefetch abort
swi_handler:
  MSR     CPSR_C, #ARM_MODE_SVC
  LDR     r0, =1
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  B       0x01000000

;-- Blink led 2 and trigger a data abort
pabt_handler:
  MSR     CPSR_C, #ARM_MODE_SVC
  LDR     r0, =2
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  LDR     r0, =0x40000000
  STR     r0, [r0]

;-- Blink led 3 and trigger an irq
dabt_handler:
  MSR     CPSR_c, #ARM_MODE_SVC
  LDR     r0, =3
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  LDR     r0, =AT91C_BASE_AIC
  MOV     r1, #0x100
  STR     r1, [r0, #AIC_ISCR]

;-- Blink led 2 and trigger a fiq
irq_handler:
  LDR     lr, =AT91C_BASE_AIC
  LDR     r0, [lr, #AIC_IVR]
  STR     r0, [lr, #AIC_EOICR]
  MSR     CPSR_c, #ARM_MODE_SVC
  LDR     r0, =2
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  LDR     r0, =AT91C_BASE_AIC
  MOV     r1, #0x1
  STR     r1, [r0, #AIC_ISCR]

;-- Blink led 1 and trigger a undefined instruction abort
fiq_handler:
  LDR     r0, [r8, #AIC_FVR]
  STR     r0, [r8, #AIC_EOICR]
  MSR     CPSR_c, #ARM_MODE_SVC
  LDR     r0, =1
  LDR     r1, =blinkLed
  MOV     lr, pc
  BX      r1
  DC32    0xEEEEEEEE

;-----------------------------------
; ICODE segment

  RSEG    ICODE:CODE(2)
  CODE32

;-----------------------------------
; Chip initialization
initReset:

;-- Retrieve end of RAM address to allocate stacks
__iramend EQU SFB(INTRAMEND_REMAP)

;-- Additional low-level initialization (in case the one in the bootloader
;-- has a bug)
;  EXTERN   AT91F_LowLevelInit

;  LDR    sp, =__iramend              
;  LDR	  r0, =AT91F_LowLevelInit
;  MOV    lr, pc
;  BX	  r0

;-- Constants
IRQ_STACK_SIZE          EQU     (3*8*4)
ARM_MODE_FIQ            EQU     0x11
ARM_MODE_IRQ            EQU     0x12
ARM_MODE_SVC            EQU     0x13
I_BIT                   EQU     0x80
F_BIT                   EQU     0x40

;-- Modes setup (stacks, ...)
  LDR     r0, =__iramend

;-- FIQ mode (put AIC address in r8)
  MSR     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
  LDR     r8, =AT91C_BASE_AIC

;-- IRQ mode (stack)
  MSR     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
  MOV     sp, r0
  SUB     r0, r0, #IRQ_STACK_SIZE

;-- SVC mode, IT disabled (copy vectors in RAM, remap, stack)
  MSR     CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT
  MOV     sp, r0

;-- copy ICODE segment in RAM
__intVecStart EQU SFB(INTVEC)
__intVecEnd   EQU SFE(INTVEC)
__iramStart   EQU SFB(INTRAMSTART)

  LDR     r0, =__intVecStart
  LDR     r1, =__iramStart
  LDR     r2, =__intVecEnd

copy:
  LDR     r3, [r0], #4
  STR     r3, [r1], #4
  CMP     r0, r2
  BNE     copy

;-- Remap SRAM to have new exception vectors at address 0
  LDR     r0, =AT91C_BASE_MC
  LDR     r1, =AT91C_MC_RCB
  STR     r1, [r0, #MC_RCR]

;-- Unmask interrupts
  MSR     CPSR_c, #ARM_MODE_SVC

;-- Initialize C (CTR0)
  EXTERN  __segment_init

  LDR     r0, =__segment_init
  MOV     lr, pc
  BX      r0

;-- Branch on C main
  EXTERN	main
  PUBLIC	__main

?jump_to_main:
  LDR     lr, =?call_exit
  LDR     r0, =main

__main:
  BX      r0

;-- End of code, loop for ever
?call_exit:
end:
  B       end

  ENDMOD
  END

⌨️ 快捷键说明

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