ARM-start.s注释(2410Init.s)

本人只是做个笔记保存一下。

来源:http://blog.itpub.net/13771794/viewspace-478463/

;=========================================
; NAME: 2410INIT.S
; DESC: C start up codes
;       Configure memory, ISR ,stacks
; Initialize C-variables
; HISTORY:
; 2002.02.25:kwtark: ver 0.0
; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode
;=========================================

GET option.s
GET memcfg.s
GET 2410addr.s

BIT_SELFREFRESH EQU (1<<22)
;ARM异常模式的定义
;Pre-defined constants
USERMODE    EQU 0x10
FIQMODE     EQU 0x11
IRQMODE     EQU 0x12
SVCMODE     EQU 0x13
ABORTMODE   EQU 0x17
UNDEFMODE   EQU 0x1b
MODEMASK    EQU 0x1f
NOINT       EQU 0xc0

;ARM个异常模式堆栈
;The location of stacks
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~

;Check if tasm.exe(armasm -16 [email protected] 1.0) is used.
GBLL    THUMBCODE
[ {CONFIG} = 16 ;[ = IF
THUMBCODE SETL {TRUE}
     CODE32          ; CODE32 表明一下操作都在ARM状态
    |      ;| = ELSE
THUMBCODE SETL {FALSE}
    ]     ;] = ENDIF

;宏定义MOV_PC_LR
    MACRO
MOV_PC_LR
    [ THUMBCODE
            bx lr
    |
            mov pc,lr
    ]
MEND

MACRO
MOVEQ_PC_LR
    [ THUMBCODE
         bxeq lr
    |
            moveq pc,lr
    ]
MEND

;宏定义-进入异常流程
;HANDLER-宏的名称
;$HandleLabel-宏的参数
;这个宏的作用是把各个中断程序的地址装入当前的PC,2410有两种装断模式 一种是没有中断向量表,一种是使用中断向量表的
;使用中断向量表只能是IRQ方式,当使用中断向量表的时候,中断发生时由2410的中断控制器自动跳转到
;相应的位置。
    MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
sub sp,sp,#4        ;decrement sp(to store jump address)
stmfd
sp!,{r0}        ;PUSH the work register to stack(lr doest push because
it return to original address)!表示数据传送完毕后,将最后的地址写入基址寄存器
ldr     r0,=$HandleLabel;load the address of Handle1XXX to r0
ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
MEND
;连接器生成的输出段相关的符号
;引入连接器生成的映象文件的各个部分地址。
;OR-只读区域、RW-读写区域、ZI-初始化为0的区域。
IMPORT |Image$$RO$$Base| ; Base of ROM code
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base|   ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base|   ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise

;引入外部函数Main,进入C程序。
IMPORT Main    ; The main entry of mon program
;IMPORT LEDTEST
;定义ARM汇编程序段,段名为SelfBoot,程序段为只读的代码段。
AREA    SelfBoot, CODE, READONLY
;程序入口地址
ENTRY

ResetEntry

;程序段执行的第一跳指令,为8个异常中断处理向量,要按顺序放置。
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b .   ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt

LTORG ;声明一个数据缓冲池的开始  
HandlerFIQ      HANDLER HandleFIQ
HandlerIRQ      HANDLER HandleIRQ
HandlerUndef    HANDLER HandleUndef
HandlerSWI      HANDLER HandleSWI
HandlerDabort   HANDLER HandleDabort
HandlerPabort   HANDLER HandlePabort

;采用INTOFFSET寄存器判定IRQ中断源
IsrIRQ
sub sp,sp,#4      
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}

;======================================================
; ENTRY
;======================================================
;初始化程序入口指令
ResetHandler
ldr r0,=WTCON       ;watch dog disable
ldr r1,=0x0        
str r1,[r0]

ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]

ldr r0,=INTSUBMSK
ldr r1,=0x3ff   ;all sub interrupt disable
str r1,[r0]

;To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
       
;Configure MPLL
ldr r0,=MPLLCON         
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz
str r1,[r0]

;设置存储器控制寄存器。
;Set memory control registers
adr r0, SMRDATA
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA一共13个寄存器
0      
ldr r3, [r0], #4   
str r3, [r1], #4   
cmp r2, r0  
bne %B0

;禁止Icache和Dcache,禁止MMU
;IMPORT MMU_DisableICache
    ;bl MMU_DisableICache ;
;IMPORT MMU_DisableDCache
    ;bl MMU_DisableDCache ;
    ;IMPORT MMU_InvalidateICache
    ;bl MMU_InvalidateICache ;
    ;IMPORT MMU_DisableMMU
    ;bl MMU_DisableMMU ;

;初始化堆栈
    ;Initialize stacks
bl InitStacks

;建立IRQ中断
; Setup IRQ handler
ldr r0,=HandleIRQ       ;This routine is needed
ldr r1,=IsrIRQ          ;if there isn‘t ‘subs pc,lr,#4‘ at 0x18, 0x1c‘
str r1,[r0]

;===========================================================
adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r2
ldreq r0, TopOfROM
beq InitRam
ldr r3, TopOfROM
;将RO区域的代码copy到RW域中并且将ZI区域初始化为0。
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0

sub r2, r2, r3
sub r0, r0, r2    
  
InitRam
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3 ;copy 初始化代码
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0

mov r0, #0 ;初始化ZI区域为0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1

bl Main ;bl Main        ;Dont use main() because ......
   b .

;堆栈初始化
;function initializing stacks
InitStacks
;Don‘t use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, ‘msr cpsr,r1‘ can be used instead of ‘msr cpsr_cxsf,r1

;UndefMode堆栈
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1   ;UndefMode
ldr sp,=UndefStack

;AbortMode堆栈
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1   ;AbortMode
ldr sp,=AbortStack

;IRQMode堆栈
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1   ;IRQMode
ldr sp,=IRQStack
   
    ;FIQMode堆栈
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1   ;FIQMode
ldr sp,=FIQStack

;SVCMode堆栈
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1   ;SVCMode
ldr sp,=SVCStack

;USER mode has not be initialized.

mov pc,lr
;The LR register won‘t be valid if the current mode is not SVC mode.‘

LTORG ;声明一个数据缓冲池的开始

SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.                    
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK=75Mhz.

DCD
(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28));BWSCON=0x2211D110
   
DCD
((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))  
;GCS0 BANK0CON=0x0700
    DCD
((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))  
;GCS1 BANK1CON=0x7FFC
    DCD
((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))  
;GCS2 BANKCON2=0x0700
    DCD
0x1f7c;((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))  
;GCS3 BANKCON3=0x0700
    DCD
((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))  
;GCS4 BANKCON4=0x0700
    DCD
((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))  
;GCS5 BANKCON5=0x0700
    DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6 BANKCON6=0x18005
    DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7 BANKCON7=0x18005
    DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH=0x008E0459  
   DCD 0x32            ;SCLK power saving mode, BANKSIZE 128M/128M       ;BANKSIZE=0x32
    DCD 0x30            ;MRSR6 CL=3clk   ;MRSRB6=0x30
    DCD 0x30            ;MRSR7    ;MRSRB7=0x30

BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|

ALIGN ;通过添加补丁字节使当前位置满足一定的对齐方式

;可读写的数据段
    AREA RamData, DATA, READWRITE

;^=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000
        ^   _ISR_STARTADDRESS ;0x33ff8000
HandleReset #   4   ;#--Field:定义一个结构化内存表中的数据域,该域为4个字节
HandleUndef #   4
HandleSWI   #   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved #   4
HandleIRQ   #   4
HandleFIQ   #   4

;Don‘t use the label ‘IntVectorTable‘,
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable‘
HandleEINT0   #   4
HandleEINT1   #   4
HandleEINT2   #   4
HandleEINT3   #   4
HandleEINT4_7 #   4
HandleEINT8_23 #   4
HandleRSV6   #   4
HandleBATFLT   #   4
HandleTICK   #   4
HandleWDT   #   4
HandleTIMER0 #   4
HandleTIMER1 #   4
HandleTIMER2 #   4
HandleTIMER3 #   4
HandleTIMER4 #   4
HandleUART2 #   4
HandleLCD    #   4
HandleDMA0   #   4
HandleDMA1   #   4
HandleDMA2   #   4
HandleDMA3   #   4
HandleMMC   #   4
HandleSPI0   #   4
HandleUART1   #   4
HandleRSV24   #   4
HandleUSBD   #   4
HandleUSBH   #   4
HandleIIC   #   4
HandleUART0    #   4
HandleSPI1    #   4
HandleRTC    #   4
HandleADC    #   4

END

时间: 2024-10-06 03:20:56

ARM-start.s注释(2410Init.s)的相关文章

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

linux下arm汇编注释符

注意使用 @ 符 # 是整行注释符 @ 是行内注释符 以为 @ 是行内注释符,害我调试了半天.

Make ARCH=arm CROSS_COMPILE=arm-linux-gcc menuconfig 分析

在编译LINUX内核时,首先要修改内核源码顶层目录下的makefile文件,将其中ARCH ?= $(SUBARCH)修改为ARCH ?= arm,将CROSS_COMPILE    ?= 修改为CROSS_COMPILE    ?= arm-linux-gcc,或者不修改,而是将ARCH和CROSS_COMPILE的值通过命令行传入.然后在linux内核源码目录下,执行make menuconfig,那之后发生了什么? make命令在未指定文件的情况下,默认寻找名为Makefile或GNUMa

opencv在arm和x86上的移植

一.开发环境 操作系统:fedora14 Opencv版本:2.0 Qt版本:4.7 arm:mini6410 交叉编译工具:arm-linux-gcc-4.5.1 二.安装与配置 Linux系统的安装,交叉Qt-creator的安装还有交叉编译工具的安装,网上说的基本都没什么问题,测试后都可以用.这里安装Qt-Creator遇到了一点小问题,按照网上的和mini6410开发手册上的安装方法太复杂了,用QtSdk-offline-linux-x86-v1.2.1.run安装方便又准确. 这篇文章

ARM体系结构与编程-5

GET通常用于包含定义常量的源文件. 例如:GET 2440addr.inc 用AREA定义一个段,ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 例如: AREA init, CODE, READONLY ENTRY ...... END EQU用于定义常量,提醒:在每条ARM指令前必须有空格,但是用EQU定义常量时,必须顶格写,否则编译器报错. LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区. ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式

交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

作者:彭东林 邮箱:[email protected] QQ: 405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html) 工具链: arm-none-linux-gnueabi-gcc  (gcc version 4.8.3 20140320) Python版本: Python-2.7.13 概述 前面一篇博文(交叉编译

ARM Linux从Bootloader、kernel到filesystem启动流程

转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesystem.bootloader 是一上电就拿到cpu 的控制权的,而bootloader实现了硬件的初始化.bootloader俨然就成了Power on 之后”第一个吃螃蟹”的代码. 谈到这就得想到硬件机制是如何满足这个功能的了.CPU内部一般都集成小容量的SRAM (又叫stapping stone,垫脚石),

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

[zhuan]arm中的汇编指令

http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是 “以下是代码段”, “以下是初始化数据段”, “以下是未初始化数据段”. 2.".global" 定义一个全局符号,通常是为ld使用.比如经常看到的 .global _start 3.".