详细的boorloader的移植二
网卡
�C
DM9000EP
2.源文件:
选择一标准的u-boot代码:u-boot-1.1.6
3.烧写工具:
u-boot的烧写使用JTAG线进行下载,用SJF2440.exe软件进行烧写,使用DNW终端进行串口调试。用串口线相连。
4.知识储备:
u-boot的目录结构:
目录
|
说明
|
board
|
和一些已有开发板有关的文件,比如
makefile
和
U-Boot.ldS
等都和具体开发板的硬件和地址分配有关。
|
common
|
与体系结构无关的文件,实现各种命令的
C
文件
|
cpu
|
CPU
相关文件,其中的子目录都是以
U-Boot
所支持的
CPU
为名,比如子目录
arm926ejS
、
mips
等,每个特定的子目录都包括
cpu.c
和
interrupt.c
,
start.s
。其中
cpu.c
初始化
CPU
、设置指令
cache
和数据
cache
等。
Interruput.c
设置系统的各种中断和异常;
start.s
是
U-Boot
自动执行时的第一个文件,它主要是设置系统堆栈和工作方式,为进入
C
程序奠定基础。
|
disk
|
Disk
驱动的分区处理代码
|
doc
|
文档
|
drivers
|
通用设备驱动程序,例如各种网卡、支持
CFI
的
Flash
、串口、
USB
等
|
fs
|
支持文件系统的文件,目前支持
cramfs
、
fat
、
fdos
、
jffs2
和
registerfs
|
include
|
头文件,还有对各种硬件平台支持的汇编文件,系统配置文件等
|
net
|
与网络有关的代码,
BOOTP
协议、
TFTP
协议、
RARP
和
NFS
等
|
lib_arm
|
与
ARM
体系结构相关的代码
|
tools
|
创建
S-Record
格式文件和
U-Boot images
的工具
|
u-boot代码:
由于代码比较庞大,只简单分析启动部分。网络和书很多书中有详细的分析,如果想详细了解查阅相关资料,或着提出讨论,还可以登陆顶嵌公司网站技术文档里查看。网址:
http://www.top-e.org/jiaoshi/html/?320.html
U-Boot
启动过程可以分成两个阶段
(stage)
下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段
第一阶段
(stage 1)
是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置
ARM
进入
SVC
模式、禁止
IRQ
和
FIQ
、关闭看门狗、屏蔽所有中断。设置时钟
(FCLK,HCLK,PCLK)
、清空
I/D cache
、清空
TLB
、禁止
MMU
和
cache
、配置内存控制器、为搬运代码做准备、搬移
uboot
映像到
RAM
中(使用
copy_loop
实现)、分配堆栈、清空
bss
段(使用
clbss_l
实现)。
第二阶段
(stage 2)
通常用C语言来实现。
start_armboot():
一系列初始化(
cpu,
板卡,中断,串口,控制台等),开启
I/D cache
。初始化
FLASH
,根据系统配置执行其他初始化操作。打印
LOG
,使能中断,获取环境变量,初始化网卡。最后进入
main_loop()
函数。在
main_loop
函数中会检查
bootdelay
和
bootcmd
环境变量,如果
bootcmd
已经设置过,则在等待
bootdelay
个毫秒后会自动执行
bootcmd
。如果等待过程中被用户中断(
ctl+c
)或者
bootcmd
没有设置,则会等待用户输入命令。
关键点一:
U-Boot
移植参考板
这是进行
U-Boot
移植首先要明确的。可以根据目标板上
CPU
、
FLASH
、
SDRAM
的情况,以尽可能相一致为原则,先找出
一个与所移植目标板为同一个或同一系列处理器的
U-Boot
支持板为移植参考板。对
U-Boot
移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移
植参考板的名称,在逐步熟悉
U-Boot
移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用
Linux
命令查找移植参考板的特定代码,如
grep �Cr 2410 ./
可确定出在
U-Boot
中与
smdk2410
板有关的代码,依此对照目标板实际进行屏蔽或修改。同时应不局限于移植参考板中的代码,要广泛借鉴
U-Boot
中已有的代码更好地实现一些具体的功能。
关键点二:
U-Boot
烧写地址和
CPU
寄存器参数设置
不同目标板,对
U-Boot
在
FLASH
中存放地址要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关
。也就是说,
U-Boot
烧写具体位置是由硬件决定的,而不是程序设计来选择的。
根据
CPU
处理器系列、类型不同,寄存器名称与作用有一定差别。必须根据目标板的实际,进行合
理配置。一个较为可行和有效的方法,就是借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费时间和考验耐力的过程,需要仔细对照处理器
各寄存器定义、参考设置、目标板实际作出选择并不断测试。
关键点三:
串口调试。
能从串口输出信息,即使是乱码,也可以说
U-Boot
移植取得了实质性突破。
依据笔者调试经历,串口是否有输出,除了与串口驱动相关外,还与
FLASH
相关的寄存器设置有关。因为
U-Boot
是从
FLASH
中被引导启动的,如果
FLASH
设置不正确,
U-Boot
代码读取和执行就会出现一些问题。因此,还需要就
FLASH
的相关寄存器设置进行一些参数调试。同时,要注意串口收发
芯片相关引脚工作波形。依据笔者调试情况,如果串口无输出,有一种可能就是该芯片损坏或工作不正常。
如果出现乱码,有一种可能就是波特率等参数设置有问题。
三.修改源代码:
1.
添加新开发板信息
(1)顶层
Makefile
:为了能让u-boot在编译之前根据此规则来获得具体的配置文件和编译规则。
在
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
之后,添加以下内容:
tq2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t tq2440 NULL s3c24x0
|
添加交叉编译器路径(根据个人情况):
ifeq ($(ARCH),arm)
CROSS_COMPILE=
/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin/arm-softfloat-linux-
endif
|
(
2
)建立新开发板目录:可以把类似的开发板进行修改
cd board
mkdir tq2440
cd tq2440
cp -arf ../smdk2410/* .
mv smdk2410.c tq2440.c
(
3
)修改
board/tq2440/u-boot.lds
在
cpu/arm920t/start.o
(.text)
后添加:
board/tq2440/boot_init.o (.text)
|
并在
tq2440
目录下新建
boot_init.c
文件,内容参考源文件,该代码主要实现了
CopyCode2Ram
函数,该函数功能是拷贝flash代码到sdram中,实现原理如下图。
文章出处:http://www.top-e.org/jiaoshi/html/403.html