网卡<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

– DM9000EP

       

2.源文件:

   选择一标准的u-boot代码:u-boot-1.1.6

3.烧写工具:

u-boot的烧写使用JTAG线进行下载,用SJF2440.exe软件进行烧写,使用DNW终端进行串口调试。用串口线相连。

4.知识储备:

u-boot的目录结构:

目录

说明

board

和一些已有开发板有关的文件,比如makefileU-Boot.ldS等都和具体开发板的硬件和地址分配有关。

common

与体系结构无关的文件,实现各种命令的C文件

cpu

 CPU相关文件,其中的子目录都是以U-Boot所支持的CPU为名,比如子目录arm926ejSmips等,每个特定的子目录都包括cpu.cinterrupt.cstart.s。其中cpu.c初始化CPU、设置指令cache和数据cache等。Interruput.c设置系统的各种中断和异常;start.sU-Boot自动执行时的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。

disk

Disk驱动的分区处理代码

doc

文档

drivers

通用设备驱动程序,例如各种网卡、支持CFIFlash、串口、USB

fs

支持文件系统的文件,目前支持cramfsfatfdosjffs2registerfs

include

头文件,还有对各种硬件平台支持的汇编文件,系统配置文件等

net

与网络有关的代码,BOOTP协议、TFTP协议、RARPNFS

lib_arm

ARM体系结构相关的代码

tools

创建S-Record格式文件和U-Boot p_w_picpaths的工具

u-boot代码:

由于代码比较庞大,只简单分析启动部分。网络和书很多书中有详细的分析,如果想详细了解查阅相关资料,或着提出讨论,还可以登陆顶嵌公司网站技术文档里查看。网址:http://www.top-e.org/jiaoshi/html/?320.html

U-Boot启动过程可以分成两个阶段(stage)

下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段

第一阶段(stage 1)是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQFIQ、关闭看门狗、屏蔽所有中断。设置时钟(FCLK,HCLK,PCLK)、清空I/D cache、清空TLB、禁止MMUcache、配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。

第二阶段(stage 2)通常用C语言来实现。

start_armboot(): 

     一系列初始化(cpu, 板卡,中断,串口,控制台等),开启I/D cache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查bootdelaybootcmd环境变量,如果bootcmd已经设置过,则在等待bootdelay个毫秒后会自动执行bootcmd。如果等待过程中被用户中断(ctl+c)或者bootcmd没有设置,则会等待用户输入命令。   

关键点一: U-Boot移植参考板

     这是进行U-Boot移植首先要明确的。可以根据目标板上CPUFLASHSDRAM的情况,以尽可能相一致为原则,先找出 一个与所移植目标板为同一个或同一系列处理器的U-Boot支持板为移植参考板。对U-Boot移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移 植参考板的名称,在逐步熟悉U-Boot移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如 grep –r 2410 ./ 可确定出在U-Boot中与smdk2410板有关的代码,依此对照目标板实际进行屏蔽或修改。同时应不局限于移植参考板中的代码,要广泛借鉴U-Boot 中已有的代码更好地实现一些具体的功能。 

关键点二: U-Boot烧写地址和CPU寄存器参数设置 

     不同目标板,对U-BootFLASH中存放地址要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关 。也就是说,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中,实现原理如下图。