s3c2440笔记1(启动)

s3c2440启动方式
  1. 从nand flash 启动
    1.1
上电后将nand flash中的前4KB数据复制到“Stepping Stone”;
    1.2
CPU 执行“Stepping Stone”中的代码;
    //通常的做法是将nand
flash中的代码拷贝至sdram;

  2. 从nor
flash 启动
    2.1 根据nor
flash的总线数据宽度,从第一条指令开始执行;
    //通常的做法:是用这段程序将nor
flash中的代码拷贝至sdram;

启动代码核心分析


        GET option.inc ;栈地址等常量定义
GET memcfg.inc ;SDRAM初始化相关
GET 2440addr.inc ;特殊功能寄存器

USERMODE EQU 0x10 ;定义运行模式常量,即CPSR寄存器的模式控制位赋值

UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ ;定义各模式堆栈地址

;实现$HandleAddr宏
$HandlerLabel
sub sp,sp,#4 ; sp = sp -4
stmfd sp!,{r0} ; sp = sp -4, r0寄存器的值入栈
ldr r0,=$HandleAddr ; $HandleAddr是该宏的参数,将该值赋给r0
ldr r0,[r0] ; $HandleAddr相当于是一个函数指针,此时将该指针所指向函数入口地址赋值给r0
str r0,[sp,#4] ; ro入栈,即$HandleAddr
ldmfd sp!,{r0,pc} ; 出栈,恢复r0,将$HandleAddr赋值给pc
MEND

;入口地址,定义一个init段
;初始化异常向量表
b ResetHandler; 0x00000000 为ResetHandler

如上例:CPU上电时从0x0000000启动,此时ResetHandler被执行

;实现arm对中断的处理,IsrIRQ
IsrIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9} ;保存r8、r9

ldr r9,=INTOFFSET ;中断偏移寄存器,当ENT0时,该值为0,随后32个外部中断源依次递增
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2 ;r9左移2位、r8 = r8 + r9,
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc} ;跳转到中断服务函数

LTORG

;ResetHandler 实现
;1. WTCON 关闭看门狗;
;2. INTMSK\INTSUBMSK 中断屏蔽;
;3. 系统时钟初始化
;4. 存储器初始化
adrl r0, SMRDATA ; SDRAM的13个特殊寄存器设置参数
ldmia r0,{r1-r13}
ldr r0,=BWSCON
stmia r0,{r1-r13}

;堆栈初始化
bl InitStacks
;在InitStacks中,初始化各模式堆栈例如
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode ,通过修改CPSR,将处理器切换到该模式
ldr sp,=UndefStack ; UndefStack=0x33FF_5C00

;执行启动
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot
bne copy_proc_beg ;do not read nand flash
adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot
cmp r0, #0 ;if use Multi-ice,
bne copy_proc_beg ;do not read nand flash for boot
;nop
;===========================================================
nand_boot_beg ;从nand 启动
bl RdNF2SDRAM ;该函数将代码从nand 拷贝到 内存
ldr pc, =copy_proc_beg

;copy_pro_beg实现
;arm的可执行程序的映像文件,分为RO(代码段和只读数据段)、RW(可读/写数据段)和ZI 未初始化数据段
;根据link的设置,从0x00000000处跳转到SDRAM的0x30000000处
copy_proc_beg
adr r0, ResetEntry
ldr r2, BaseOfROM ;RO段的目标地址
cmp r0, r2
ldreq r0, TopOfROM
beq InitRam ;搬移RW
ldr r3, TopOfROM
0
ldmia r0!, {r4-r7} ;利用r4-r7,每次搬移16个字节
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
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0

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

;跳转到c函数
b Main ;

s3c2440笔记1(启动),布布扣,bubuko.com

时间: 2024-10-06 19:59:59

s3c2440笔记1(启动)的相关文章

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

SQL Server 2012实施与管理实战指南(笔记)——Ch5启动SQL Server服务和数据库

5.启动SQL Server服务和数据库 在数据库和服务启动过程中,经常会出现的问题: 1.SQL Server实例无法正常启动 2.系统数据库无法正常启动 3.网络配置失败 4.用户数据库无法启动 5.集群环境下SQL Server资源无法保持在线 目录 5.启动SQL Server服务和数据库... 1 5.1 SQL Server服务启动步骤... 1 5.1.1 从注册表中读取SQL Server启动信息... 1 5.1.2 检查硬件,配置内存和CPU.. 2 5.1.3 数据库启动.

[A8 学习笔记] A8 启动顺序

其实标题不应该这么说,ARM公司并没有规定启动顺序,这完全是由IC厂商自己决定的.以我手上三星公司的S5pv210为例,并以三星公司的官方用户手册为准. S5PV210由64kB ROM和96kB SRAM作为内部存储器.在启动过程中,使用内部64kB ROM和内部96K SRAM.S5PV210从内部ROM启用安全启动,这保证了映像不能被未经授权的用户修改. 由以下几种启动设备可供选择: General NAND Flash memory OneNAND memory SD/ MMC memo

【MySQL笔记】: 启动弹窗问题,unable to connect to remote host. catalog download has failed.

安装完MySQL之后,它每天凌晨启动一个Intaller任务,甚是烦人: 这是一个Windows的计划服务,在这里删除即可,开始/附件/系统工具/任务计划程序,把mysql的定时任务计划取消/删除就可以了 来自为知笔记(Wiz)

S3C2440的Linux启动过程分析(一)——SC2440处理器结构

1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MMU单元等.CP15为一个协处理器(Co-Processor).通过AMBA2.0(Advanced Microcontroller Bus Architecture)总线接口与外部设备相连. 图 1  S3C2440处理器框图 IVA指Instruction Virtual Address,指令虚拟

flask源代码笔记——应用启动

flask一个最简单的demo是: from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello, World!' if __name__ == '__main__': app.run() run()方法启动了应用,那么run()背后都调用哪些类.方法和函数呢? 将相关代码汇总起来,如下: def run(self, host='localhost', port=5000, **o

How tomcat works 读书笔记十七 启动tomcat 上

一路跋山涉水,这是最后一章了. 关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类. 理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了. 为了让用户更方便的启动tomcat,还有批处理文件startup.bat(终于见到最顶层的模块了!!) Catalina 先说Catalina 它里面有一个Server组件(不懂的看第14章).同时在它的start方法中包含一个Digester对象(不懂的看第15章)用来解析conf/下的Server.x

I.MX6Q(TQIMX6Q/TQE9)学习笔记——内核启动与文件系统挂载

经过前面的移植,u-boot已经有能力启动内核了,本文主要来看下如何通过之前移植的u-boot来启动内核.如果按照前面的文章完成了LTIB 的编译,那么,Linux的内核应该就会出现rpm/BUILD/目录下,接下来,我们就开始移植这个3.0.35版本的内核到TQIMX6Q. 内核的编译 为了简化内核编译的过程,可以在内核目录下创建编译脚本,命名为build.sh,内容如下: [cpp] view plaincopy #!/bin/sh export ARCH=arm export CROSS_

Linux自学笔记——Centos启动流程

Centos启动流程大概为:POST --> Boot Sequence(BIOS)--> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs (readonly)-->switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端.