微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c6410 uboot代码分析

s3c6410 uboot代码分析

时间:11-09 来源:互联网 点击:
以下用以记录uboot代码的分析过程,目标是s3c6410,如有错误,欢迎指正。

强调,内容与三星原厂提供的uboot-1.1.6有更改的地方,因为外接外设的区别,特别是nand_flash、外接网卡芯片和LCD芯片

以下纯代码情景分析,请结合uboot的功能结构图和内存分布图查看代码,这样会更加容易理解。

s3c-u-boot-1.1.6源代码可以在三星下面的网站获得,但前提是你有官方的email。

还是百度google搜一下吧,当然我这也是有的哦。

http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=835&partnum=S3C6410




功能结构图(上图) uboot内存分布图(上图)

1.start.s代码分析(第一阶段)

/*以下是具有arm特色的异常向量表,为中断异常准备 */

--------------------

.globl _start
_start: breset
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _fiq

_undefined_instruction:
.word undefined_instruction
_software_interrupt:
.word software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.word not_used
_irq:
.word irq
_fiq:
.word fiq
_pad:
.word 0x12345678 /* now 16*4=64 */
.global _end_vect
_end_vect:

.balignl 16,0xdeadbeef

--------------------

/*当发生中断异常时,pc会跳转到.word的后面地址处 处理异常,

undefined异常由arm核译码单元检测,并触发未定义指令异常请求,硬件设置pc的值为0x4,强制程序从内存0x4地址执行指令;

0x8存放软件中断处理指令,arm中使用swi指令时触发软件中断,硬件设置PC的值为0x8,同时进入系统模式,多用在系统库的编写;

prefetch异常,预取指中止异常,导致正在取的指令无法正常取出,这里需要注意流水线造成的pc值;

data中止,无法获取数据,产生的原因有可能是内存未准备好、内存无读或写权限等一些原因产生的异常;

0x14暂时未使用;

0x18提供系统硬件中断跳转接口,一般我们的处理器都会引出很多的外部中断线,在这里能做的就是判断系统中断线产生的中断,注册中断,初始化中断,调用中断函数等等;

0x1c地址为_fiq快速中断,一个系统在中断流水线上可能产生很多中断,但快中断只会有一个

*/

--------------------

_undefined_instruction:
.word undefined_instruction
_software_interrupt:
.word software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.word not_used
_irq:
.word irq
_fiq:
.word fiq
_pad:
.word 0x12345678 /* now 16*4=64 */
.global _end_vect
_end_vect:

.balignl 16,0xdeadbeef

--------------------

/*

_TEXT_BASE标号所代表的是uboot代码的运行地址,对于s3c6410

系统来说,如果nand flash启动方式,系统会把0xc000000里面前4KB的内容映射到引导镜像区,即0x0地址,但是我们需要把

uboot代码放到我们的SDRAM,原因是我们代码里面需要对变量做更改并且增加代码执行效率等

下面代码的含义是定义uboot程序执行的运行地址,值为0xc7e00000,.word后面的值TEXT_BASE在编译的时候,

通过向编译器传递参数获得,-DTEXT_BASE方式向编译器传递宏参,在编译的时候可以注意下编译的时候都会指定它的值,值得定义在

config.mk中,Makefile会包含它。

*/

--------------------

_TEXT_BASE:
.wordTEXT_BASE

--------------------

/*

在uboot里面会开启MMU,下面是在MMU开启前uboot在内存存放的真实物理地址,值为0x57e00000。强调一下,我们做的开发板的SDRAM在DMC1上,即访问物理内存的实际物理地址从0x50000000开始,SDRAM的大小为256M,正好是一个DMC1,所以内存的访问地址就是0x50000000-0x6FFFFFFF之间了。

*/

--------------------

_TEXT_PHY_BASE:
.wordCFG_PHY_UBOOT_BASE

--------------------

/*

这个不解释也是可以的,但是还是要解释。很多人对_start的值有疑惑,认为是0x0,因为看到_start的标号在代码段最开始处,其实是错误的,汇编代码里面的标号是和编译时指定的运行地址有关系的。我们在编译程序的时候会通过-DTEXT_BASE=0xc7e00000参数告诉编译器我们程序将会运行在0xc7e00000地址,那么自然编译器会认为代码开始的时候就运行在这个地址,那么_start的值自然就是0xc7e00000了。总结之,标号的值与编译时指定的程序地址有关系,而与程序实际存放在内存出的位置无关。小心使用哦。特别在使用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top