s3c2440启动代码.docx
- 文档编号:6619515
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:7
- 大小:163.15KB
s3c2440启动代码.docx
《s3c2440启动代码.docx》由会员分享,可在线阅读,更多相关《s3c2440启动代码.docx(7页珍藏版)》请在冰豆网上搜索。
s3c2440启动代码
Bootloader学习
开发板:
TQ2440
开发环境:
fedora10
U-boot代码:
u-boot-1.1.6
简单上手篇:
Ok,学习bootloader前我们先不管这么多先,先编译移植,来个感性的认识先吧!
这里我们就编译一个天嵌自带的u-boot,编译出适合TQ2440运行的启动代码!
其实很简单的,大家放松吧!
一般情况下,我会把源码放在linux的/opt/EmbedSky/Linux下。
第一步进入到/opt/EmbedSky/Linux目录。
第二步解压源码tarxvfj/mnt/hgfs/Linux/u-boot-1.1.6.tar.bz2–C/
第三步进入u-boot源码配置u-boot:
makeEmbedSky_config(后面会讲为什么是这样的)
最后一步编译:
make
使用ls查看一下当前目录可以看到u-boot.bin这个就是我们的镜像了!
Ok,搞定!
简单吧!
自己动手篇:
这一章节我们亲自来动手做一个属于自己的u-boot吧!
第一步:
上一章节中可否记得makeEmbedSky_config,为什么是EmbedSky_config呢?
?
?
我们打开主目录的Makefile可以看到如下定义:
EmbedSky_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tEmbedSkyNULLs3c24x0
明白了吧,就是这样的。
我想做一个属于自己的u-boot就得改这里了!
那我们就依葫芦画瓢吧:
haha_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920thahaNULLs3c24x0
下次记得我们的是用makehaha_config的了咯!
第二步:
既然我们修改了主目录的makefile,那是有代价滴,没事,我们就继续改咯!
进入board目录将之前的天嵌的那个文件夹改为haha,并修改里面的内容:
1、修改EmbedSky.c改为haha.c。
2、修改makefile,
将COBJS:
=EmbedSky.oflash.oboot_init.o
改为COBJS:
=haha.oflash.oboot_init.o
第三步:
将include/configs目录下的EmbedSky.h改为haha.h
Ok,就这样吧,照着上面编译一下吧!
遇到什么问题自己再慢慢查资料咯。
其实,这个的移植裁剪还是比较简单的,假如拿到一个全新的u-boot要做的工作还是挺多的,这些就自己慢慢搞吧!
代码分析篇:
先看下u-boot目录下的主要目录吧:
Board:
存放开发板相关的目录,他里面放着各种各样的开发板的板子有关的代码。
比如说我们只是关注SMDK2410的,所以其他的文件可以删掉。
Common:
主要是u-boot命令有关的文件,我们可以向其中添加自己的命令。
再来看看u-boot的启动过程吧,看下面的截图:
从这张截图我们看到u-boot的启动是分为两个过程的,第一个过程是汇编代码编写的,第二个过程是c代码编译的。
我们先大致了解一下代码情况吧!
u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;在board/EmbedSky/u-boot.lds下有配置。
u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
我们再来看看另一张图片吧:
从这里我们看到u-boot的镜像是放在nandflash里的,代码运行之后要搬运到SDRAM中就是TEXT_BASE开始的地指处。
我们现在正式进入代码里面进行了解吧!
start.s文件看到:
.globl_start
_start:
breset
/*ldrpc,_undefined_instruction
ldrpc,_software_interrupt
ldrpc,_prefetch_abort
ldrpc,_data_abort
ldrpc,_not_used
ldrpc,_irq
ldrpc,_fiq*/这一段就是异常向量表了,当发生异常的时候,就会执行到这个向量表。
这里我们不管它先。
也就是说我们要跳转到reset去,而且是不带返回的跳转。
接着看到,这一段断码是为了设置cpu的模式。
reset:
mrsr0,cpsr//将cpsr值保存到r0中
bicr0,r0,#0x1f//r0&=~1f
orrr0,r0,#0xd3//10011,也就是设置为超级用户、中断关闭
msrcpsr,r0//将设置好的r0的值赋给cpsr
接着定义了一系列的寄存器,不用管它,之后就是关闭看门狗了:
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
ldrr0,=pWTCON
movr1,#0x0//置0就是关闭了看门狗了
strr1,[r0]
接着是设置中断屏蔽寄存器:
movr1,#0xffffffff//中断的位给屏蔽了
ldrr0,=INTMSK
strr1,[r0]
设置各时钟的分频比:
#if0
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldrr0,=CLKDIVN
movr1,#3
strr1,[r0]
#endif
跳转到cpu初始化blcpu_init_crit,清除指令cache和数据cache的功能。
在这里来点小插曲吧,不然很闷啊,讲什么呢?
就讲讲协处理吧,协处理器就是为了分担的cpu工作的,在这里重点讲解一下p15吧,通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式。
看着啊:
p15包括15个具体的寄存器如下
-R0:
ID号寄存器
-R0:
缓存类型寄存器
-R1:
控制寄存器
-R2:
转换表基址寄存器(TranslationTableBase--TTB)
-R3:
域访问控制寄存器(Domainaccesscontrol)
-R4:
保留
-R5:
异常状态寄存器(faultstatus-FSR)
-R6:
异常地址寄存器(faultaddress-FAR)
-R7:
缓存操作寄存器
-R8:
TLB操作寄存器
-R9:
缓存锁定寄存器
-R10:
TLB锁定寄存器
p15的寄存器只能被MRC和MCR(MovetoCoprocessorfromARMRegister)指令访问。
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中。
MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中。
这个小插曲还好吧,至少等一下你们看下面的代码时不会这么迷糊了吧。
cpu_init_crit:
movr0,#0
mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/
mcrp15,0,r0,c8,c7,0/*flushv4TLB*/
mrcp15,0,r0,c1,c0,0////将c1为0的数值写入r0中作用就是禁止相应的位之类的(可通过cache介绍文档的知识了解)bicr0,r0,#0x00002300@clearbits13,9:
8(--V---RS)
bicr0,r0,#0x00000087@clearbits7,2:
0(B----CAM)
orrr0,r0,#0x00000002@setbit2(A)Align
orrr0,r0,#0x00001000@setbit12(I)I-Cache
mcrp15,0,r0,c1,c0,0//将r0的值读到p15的寄存器c1中
movip,lr
bllowlevel_init
movlr,ip
movpc,lr
#endif
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- s3c2440 启动 代码