微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > U-Boot在S3C2410上的移植分析

U-Boot在S3C2410上的移植分析

时间:04-19 来源:互联网 点击:

在drivers/目录中以dm9000x.c和dm9000x.h为模板添加网口设备控制程序dm9000.c和dm9000.h,其中dm9000.c主要包括以下函数:

int eth-init (bd-t *bd),初始化网络设备;
int eth-send(volatile void *,int),发送数据包;
int eth-rx(void),接收数据包。
void eth-halt (void),关闭网络设备;

为了方便网络设备的数据读写操作,还定义了如下函数:

static int dm9000-probe (void),搜索DM9000芯片,分配空间并登记之;
static u16 phy-read(int),从Phyxcer寄存器读取一个字;
static void phy-write ( int,u16),写一个字到Phyxcer 寄存器;
static u16 read-srom-word (int),从SROM 读取一个字数据;
static u8 DM9000-ior (int),从I/ O 口读取一个字节;
static void DM9000-iow(int reg,u8 value),写一个字节到I/ O 口;
最后在drivers/Makefile中加入dm9000.o。

修改Makefile 文件
在U-Boot-1.1.2/Makefile中ARM92xT Systems注释下面加入以下两行:
S3C2410-config :unconfig
  @./ mkconfig $( @:-config = ) arm arm920tS3C2410

其中“arm”是CPU的种类,arm920t是ARM CPU对应的代码目录,S3C2410是自己开发板对应的目录。

交叉编译器安装在:/ path/ armv4l-unknown -linux-目录下,所以把CROSS-COMPILE 设置成相应的路径: CROSS-COMPILE = / path/ arm4l-unknown-linux -

生成目标文件并进行测试
依次运行以下命令:

# make clean
# make S3C2410-config
# make

之后会生成三个文件:

U-Boot ——ELF 格式的文件, 可以被大多数Debug 程序识别;
U-Boot.bin ——二进制文件,纯粹的U-Boot

二进制执行代码,不保存ELF 格式和调试信息。 这个文件一般用于烧录到用户开发板中;U-Boot .srec ——Motorola S-Record格式,可以通过串行口下载到开发板中。

测试与应用

1) 测试

利用编制好的Flash烧写程序,通过JTAG口将生成的二进制文件U-Boot。bin烧入Flash的零地址。 烧录成功后,拔掉JTAG调试线并复位开发板,从Minicom终端输出如下信息:

U-Boot 1.1.2 (Jul 20 2005-09 :34 :21)
U-Boot code : 33F00000-> 33F1952C BSS:-> 33F1D870
RAM Configuration :
Bank # 0 : 30000000 64 MB
Flash Memory Start 0x0000000
Device ID of the Flash is 18
Flash : 16 MB
Write 18 to Watchdog and it is 18 now
In : serial
Out : serial
Err : serial
SMDK2410 #

串口输出的以上信息表明,CPU和串口已正常工作。通过U-Boot提供的命令flinfo和mtest可以测试Flash和RAM。经过测试,可以正确地读出Flash信息及读写RAM,表明Flash 和DRAM 已正确初始化。用tftp命令传输宿主机tftpboot目录下任一小文件到RAM成功,说明网卡芯片也成功驱动。

2) 简单应用

U- Boot的主要作用是用来引导内核。因此,通过U-Boot引导一个特定的内核,可以进一步测试其移植的稳定性。而使用U-Boot引导内核有两种不同的方法。第一种方法是直接将内核映象文件和根文件系统烧写入Flash,使用此方法,U-Boot在启动时将 Flash中的内核映象及根文件系统读入RAM指定位置并从同一位置启动内核。第二种方法是将内核映象文件和根文件系统下载至RAM中直接启动(而不是从Flash中读入RAM) ,此种方法不需要烧写Flash。笔者为了减少烧写Flash的次数,在本文中采用第二种方法,其步骤如下:

SMDK2410 # tftp 30008000 zImage
SMDK2410 # tftp 30800000 ramdisk.Image.gz
SMDK2410 # go 30008000

上述指令执行的过程中,未出现异常,内核成功启动,并最终进入Shell提示符“ # ”。在Shell提示符下输入内核编译时定制的各个命令,均可以正常运行。另外编写简单C程序,并用交叉编译器编译之,最终生成的可执行文件能够在开发板上正常运行。上述事实说明内核经过U-Boot引导已稳定运行在开发板上。此次应用,进一步验证了U-Boot移植的稳定性。至此,移植工作告一段落。

结 语

目前,笔者移植的U-Boot已经能稳定地运行在开发板上,这使得Linux内核的调试脱离了BDM调试器,节约了大量的开发时间,大大提高了效率,是对后续嵌入式开发的有力支持。当然,U-Boot只是一款好用的BootLoader,嵌入式Linux的开发存在很多技术细节,只有根据实际情况不断修改、调试、总结,才能获得更大的成功。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

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

网站地图

Top