移植u-boot
来源:互联网 发布:python多行注释 编辑:程序博客网 时间:2024/05/17 09:38
u-boot工程简介
--------------------------------------
最早,DENX软件工程中心的Wolfgang Denk基于8xxrom的源码创建了PPCBOOT工程,并且不断添加处理器的支持。后来,Sysgo Gmbh把ppcboot移植到ARM平台上,创建了ARMboot工程。然后以ppcboot工程和armboot工程为基础,创建了u-boot工程。
现在u-boot已经能够支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码Bootloader。目前仍然由DENX的Wolfgang Denk维护。
u-boot的源码包可以从sourceforge网站下载,还可以订阅该网站活跃的u-boot Users邮件论坛,这个邮件论坛对于u-boot的开发和使用都很有帮助。
u-boot软件包下载网站: http://sourceforge.net/projects/u-boot
u-boot邮件列表网站: http://lists.sourceforge.net/lists/listinfo/u-boot-users/
DENX相关的网站: http://www.denx.de/re/DPLG.html
下载u-boot源码包:
--------------------------------------
http://sourceforge.net/project/showfiles.php?group_id=65938&package_id=63695
wget -c ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.5.tar.bz2
u-boot源码结构
--------------------------------------
解压就可以得到全部u-boot源程序。在顶层目录下有18个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。
第1类目录与处理器体系结构或者开发板硬件直接相关;
第2类目录是一些通用的函数或者驱动程序;
第3类目录是u-boot的应用程序、工具或者文档。
u-boot的源码顶层目录说明
目 录 特 性 解 释 说 明
board 平台依赖 存放电路板相关的目录文件,
例如:RPXlite(mpc8xx)、
smdk2410(arm920t)、
sc520_cdp(x86) 等目录
cpu 平台依赖 存放CPU相关的目录文件
例如:mpc8xx、ppc4xx、
arm720t、arm920t、 xscale、i386等目录
lib_ppc 平台依赖 存放对PowerPC体系结构通用的文件,
主要用于实现PowerPC平台通用的函数
lib_arm 平台依赖 存放对ARM体系结构通用的文件,
主要用于实现ARM平台通用的函数
lib_i386 平台依赖 存放对X86体系结构通用的文件,
主要用于实现X86平台通用的函数
include 通用 头文件和开发板配置文件,
所有开发板的配置文件都在configs目录下
common 通用 通用的多功能函数实现
lib_generic 通用 通用库函数的实现
net 通用 存放网络的程序
fs 通用 存放文件系统的程序
post 通用 存放上电自检程序
drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动
disk 通用 硬盘接口程序
rtc 通用 RTC的驱动程序
dtt 通用 数字温度测量器或者传感器的驱动
examples 应用例程 一些独立运行的应用程序的例子,例如helloworld
tools 工具 存放制作S-Record或者u-boot格式的映像等工具,
例如mkimage
doc 文档 开发使用文档
u-boot的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需要其中部分程序。这里具体以S3C2410 & arm920t处理器为例,具体分析S3C2410处理器和开发板所依赖的程序,以及u-boot的通用函数和工具。
u-boot的编译
--------------------------------------
u-boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成u-boot映像。
1.顶层目录下的Makefile
它负责u-boot整体配置编译。按照配置的顺序阅读其中关键的几行。每一种开发板在Makefile都需要有板子配置的定义。例如smdk2410开发板的定义如下。
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
# make smdk2410_config
Configuring for smdk2410 board...
命令make smdk2410_config,通过./mkconfig脚本生成include/config.mk的配置文件。文件内容正是根据Makefile对开发板的配置生成的。
ARCH = arm
CPU = arm920t
BOARD -= smdk2410
SOC = s3c24x0
上面的include/config.mk文件定义了ARCH、CPU、BOARD、SOC这些变量。这样硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下。
board/smdk2410/
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/asm-arm/
include/configs/smdk2410.h
再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了这些变量的定义。
# load ARCH, BOARD, and CPU configuration
include include/config.mk
export -ARCH CPU BOARD VENDOR SOC
Makefile的编译选项和规则在顶层目录的config.mk文件中定义。各种体系结构通用的规则直接在这个文件中定义。通过ARCH、CPU、BOARD、SOC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。
顶层目录的Makefile中还要定义交叉编译器,以及编译u-boot所依赖的目标文件。
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- //交叉编译器的前缀
...
export CROSS_COMPILE
...
# u-boot objects....order is important (i.e. start must be first)
OBJS = cpu/$(CPU)/start.o //处理器相关的目标文件
...
//定义依赖的目录,每个目录下先把目标文件连接成*.a文件。
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
...
//然后还有u-boot映像编译的依赖关系
ALL = u-boot.srec u-boot.bin System.map
all: $(ALL)
u-boot.srec: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
u-boot.bin: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
...
u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM='$(OBJDUMP) -x $(LIBS) /
|sed -n -e 's/.*/(__u_boot_cmd_.*/)/-u/1/p'|sort|uniq`;/
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) /
--start-group $(LIBS) $(PLATFORM_LIBS) --end-group /
-Map u-boot.map -o u-boot
Makefile缺省的编译目标为all,包括u-boot.srec、u-boot.bin、System.map。u-boot.srec和u-boot.bin又依赖于u-boot。u-boot就是通过ld命令按照u-boot.map地址表把目标文件组装成u-boot。其他Makefile内容就不再详细分析了,上述代码分析应该可以为阅读代码提供了一个线索。
2.开发板配置头文件
除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文件是include/configs/<board_name>.h。<board_name>用相应的BOARD定义代替。
这个头文件中主要定义了两类变量。
一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。例如:
#define CONFIG_ARM920T 1
#define CONFIG_DRIVER_CS8900 1
另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。例如:
#define CFG_FLASH_BASE 0x00000000
#define CFG_PROMPT "=>"
3.编译结果
根据对Makefile的分析,编译分为2步。
# make smdk2410_config
# make
编译完成后,可以得到u-boot各种格式的映像文件和符号表
u-boot编译生成的映像文件
文 件 名 称 说 明
System.map u-boot映像的符号表
u-boot.bin u-boot映像原始的二进制格式
u-boot u-boot映像的ELF格式
u-boot.srec u-boot映像的S-Record格式
u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。u-boot和u-boot.srec格式映像都自带定位信息。
4.u-boot工具
在tools目录下还有些u-boot的工具。这些工具有的也经常用到。
工 具 名 称 说 明
bmp_logo 制作标记的位图结构体
img2srec 转换SREC格式映像
envcrc 校验u-boot内部嵌入的环境变量
mkimage 转换u-boot格式映像
gen_eth_addr 生成以太网接口MAC地址
updater u-boot自动更新升级工具
这些工具都有源代码,可以参考改写其他工具。其中mkimage是很常用的一个工具,Linux内核映像和ramdisk文件系统映像都可以转换成u-boot的格式。
u-boot的移植
--------------------------------------
u-boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植u-boot程序。开始移植u-boot之前,先要熟悉硬件电路板和处理器。确认u-boot是否已经支持新开发板的处理器和I/O设备。假如u-boot已经支持一块非常相似的电路板,那么移植的过程将非常简单。
移植u-boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。开始移植之前,需要先分析一下u-boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的u-boot,至少能够配置编译通过。
以S3C2410处理器的开发板为例,u-boot-1.1.2版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。我们以S3C2410开发板fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410在u-boot-1.1.2中已经支持。
移植u-boot的基本步骤如下。
(1) 在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
参考上面2行,添加下面2行。
fs2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0
(2) 创建一个新目录存放开发板相关的代码,并且添加文件。
board/fs2410/config.mk
board/fs2410/flash.c
board/fs2410/fs2410.c
board/fs2410/Makefile
board/fs2410/memsetup.S
board/fs2410/u-boot.lds
(3) 为开发板添加新的配置文件
可以先复制参考开发板的配置文件,再修改。例如:
$cp include/configs/smdk2410.h include/configs/fs2410.h
如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。
(4) 配置开发板
$ make fs2410_config
(5) 编译u-boot
执行make命令,编译成功可以得到u-boot映像。有些错误是跟配置选项是有关系的,通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。
(6) 添加驱动或者功能选项
在能够编译通过的基础上,还要实现u-boot的以太网接口、Flash擦写等功能。
对于FS2410开发板的以太网驱动和smdk2410完全相同,所以可以直接使用。CS8900驱动程序文件如下。
drivers/cs8900.c
drivers/cs8900.h
对于Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发板大小、型号不都相同。所以还需要移植Flash的驱动。每种开发板目录下一般都有flash.c这个文件,需要根据具体的Flash类型修改。例如:
board/fs2410/flash.c
(7) 调试u-boot源代码,直到u-boot在开发板上能够正常启动。
调试的过程可能是很艰难的,需要借助工具,并且有些问题可能困扰很长时间。
添加u-boot命令
--------------------------------------
u-boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的u-boot命令。 u-boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section /
= {#name, maxargs, rep, cmd, usage, help}
这样每一个u-boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体。
基于u-boot命令的基本框架,来分析一下简单的icache操作命令,就可以知道添加新命令的方法。
(1) 定义CACHE命令。在include/cmd_confdefs.h中定义了所有u-boot命令的标志位。
#define CFG_CMD_CACHE 0x00000010ULL /* icache, dcache */
如果有更多的命令,也要在这里添加定义。
(2)实现CACHE命令的操作函数。下面是common/cmd_cache.c文件中icache命令部分的代码。
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
//这个函数解析参数,判断是打开cache,还是关闭cache
static int on_off (const char *s)
{
if (strcmp(s, "on") == 0) { //参数为“on”
return (1);
} else if (strcmp(s, "off") == 0) { //参数为“off”
return (0);
}
return (-1);
}
//对指令cache的操作函数
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
switch (argc) {
case 2: // 参数个数为1,则执行打开或者关闭指令cache操作
switch (on_off(argv[1])) {
case 0:
icache_disable(); //打开指令cache
break;
case 1:
icache_enable (); //关闭指令cache
break;
}
/* FALL TROUGH */
case 1: // 参数个数为0,则获取指令cache状态
printf ("Instruction Cache is %s/n",
icache_status() ? "ON" : "OFF");
return 0;
default: // 其他缺省情况下,打印命令使用说明
printf ("Usage:/n%s/n", cmdtp->usage);
return 1;
}
return 0;
}
...
U_Boot_CMD( //通过宏定义命令
icache, 2, 1, do_icache, //命令为icache,命令执行函数为do_icache()
"icache - enable or disable instruction cache/n", //帮助信息
"[on, off]/n"
" - enable or disable instruction cache/n");
...
#endif
u-boot的命令都是通过结构体__U_Boot_cmd_##name来描述的。根据U_Boot_CMD在include/command.h中的两行定义可以明白。
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section/
= {#name, maxargs, rep, cmd, usage, help}
还有,不要忘了在common/Makefile中添加编译的目标文件。
(3) 打开CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有#if语句需要预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例如:SMDK2410平台在include/configs/smdk2410.h中有如下定义。
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS /
(CONFIG_CMD_DFL | /
CFG_CMD_CACHE | /
CFG_CMD_REGINFO | /
CFG_CMD_DATE | /
CFG_CMD_ELF)
按照这3步,就可以添加新的u-boot命令。
--------------------------------------
最早,DENX软件工程中心的Wolfgang Denk基于8xxrom的源码创建了PPCBOOT工程,并且不断添加处理器的支持。后来,Sysgo Gmbh把ppcboot移植到ARM平台上,创建了ARMboot工程。然后以ppcboot工程和armboot工程为基础,创建了u-boot工程。
现在u-boot已经能够支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码Bootloader。目前仍然由DENX的Wolfgang Denk维护。
u-boot的源码包可以从sourceforge网站下载,还可以订阅该网站活跃的u-boot Users邮件论坛,这个邮件论坛对于u-boot的开发和使用都很有帮助。
u-boot软件包下载网站: http://sourceforge.net/projects/u-boot
u-boot邮件列表网站: http://lists.sourceforge.net/lists/listinfo/u-boot-users/
DENX相关的网站: http://www.denx.de/re/DPLG.html
下载u-boot源码包:
--------------------------------------
http://sourceforge.net/project/showfiles.php?group_id=65938&package_id=63695
wget -c ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.5.tar.bz2
u-boot源码结构
--------------------------------------
解压就可以得到全部u-boot源程序。在顶层目录下有18个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。
第1类目录与处理器体系结构或者开发板硬件直接相关;
第2类目录是一些通用的函数或者驱动程序;
第3类目录是u-boot的应用程序、工具或者文档。
u-boot的源码顶层目录说明
目 录 特 性 解 释 说 明
board 平台依赖 存放电路板相关的目录文件,
例如:RPXlite(mpc8xx)、
smdk2410(arm920t)、
sc520_cdp(x86) 等目录
cpu 平台依赖 存放CPU相关的目录文件
例如:mpc8xx、ppc4xx、
arm720t、arm920t、 xscale、i386等目录
lib_ppc 平台依赖 存放对PowerPC体系结构通用的文件,
主要用于实现PowerPC平台通用的函数
lib_arm 平台依赖 存放对ARM体系结构通用的文件,
主要用于实现ARM平台通用的函数
lib_i386 平台依赖 存放对X86体系结构通用的文件,
主要用于实现X86平台通用的函数
include 通用 头文件和开发板配置文件,
所有开发板的配置文件都在configs目录下
common 通用 通用的多功能函数实现
lib_generic 通用 通用库函数的实现
net 通用 存放网络的程序
fs 通用 存放文件系统的程序
post 通用 存放上电自检程序
drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动
disk 通用 硬盘接口程序
rtc 通用 RTC的驱动程序
dtt 通用 数字温度测量器或者传感器的驱动
examples 应用例程 一些独立运行的应用程序的例子,例如helloworld
tools 工具 存放制作S-Record或者u-boot格式的映像等工具,
例如mkimage
doc 文档 开发使用文档
u-boot的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需要其中部分程序。这里具体以S3C2410 & arm920t处理器为例,具体分析S3C2410处理器和开发板所依赖的程序,以及u-boot的通用函数和工具。
u-boot的编译
--------------------------------------
u-boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成u-boot映像。
1.顶层目录下的Makefile
它负责u-boot整体配置编译。按照配置的顺序阅读其中关键的几行。每一种开发板在Makefile都需要有板子配置的定义。例如smdk2410开发板的定义如下。
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
# make smdk2410_config
Configuring for smdk2410 board...
命令make smdk2410_config,通过./mkconfig脚本生成include/config.mk的配置文件。文件内容正是根据Makefile对开发板的配置生成的。
ARCH = arm
CPU = arm920t
BOARD -= smdk2410
SOC = s3c24x0
上面的include/config.mk文件定义了ARCH、CPU、BOARD、SOC这些变量。这样硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下。
board/smdk2410/
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/asm-arm/
include/configs/smdk2410.h
再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了这些变量的定义。
# load ARCH, BOARD, and CPU configuration
include include/config.mk
export -ARCH CPU BOARD VENDOR SOC
Makefile的编译选项和规则在顶层目录的config.mk文件中定义。各种体系结构通用的规则直接在这个文件中定义。通过ARCH、CPU、BOARD、SOC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。
顶层目录的Makefile中还要定义交叉编译器,以及编译u-boot所依赖的目标文件。
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- //交叉编译器的前缀
...
export CROSS_COMPILE
...
# u-boot objects....order is important (i.e. start must be first)
OBJS = cpu/$(CPU)/start.o //处理器相关的目标文件
...
//定义依赖的目录,每个目录下先把目标文件连接成*.a文件。
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
...
//然后还有u-boot映像编译的依赖关系
ALL = u-boot.srec u-boot.bin System.map
all: $(ALL)
u-boot.srec: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
u-boot.bin: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
...
u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM='$(OBJDUMP) -x $(LIBS) /
|sed -n -e 's/.*/(__u_boot_cmd_.*/)/-u/1/p'|sort|uniq`;/
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) /
--start-group $(LIBS) $(PLATFORM_LIBS) --end-group /
-Map u-boot.map -o u-boot
Makefile缺省的编译目标为all,包括u-boot.srec、u-boot.bin、System.map。u-boot.srec和u-boot.bin又依赖于u-boot。u-boot就是通过ld命令按照u-boot.map地址表把目标文件组装成u-boot。其他Makefile内容就不再详细分析了,上述代码分析应该可以为阅读代码提供了一个线索。
2.开发板配置头文件
除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文件是include/configs/<board_name>.h。<board_name>用相应的BOARD定义代替。
这个头文件中主要定义了两类变量。
一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。例如:
#define CONFIG_ARM920T 1
#define CONFIG_DRIVER_CS8900 1
另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。例如:
#define CFG_FLASH_BASE 0x00000000
#define CFG_PROMPT "=>"
3.编译结果
根据对Makefile的分析,编译分为2步。
# make smdk2410_config
# make
编译完成后,可以得到u-boot各种格式的映像文件和符号表
u-boot编译生成的映像文件
文 件 名 称 说 明
System.map u-boot映像的符号表
u-boot.bin u-boot映像原始的二进制格式
u-boot u-boot映像的ELF格式
u-boot.srec u-boot映像的S-Record格式
u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。u-boot和u-boot.srec格式映像都自带定位信息。
4.u-boot工具
在tools目录下还有些u-boot的工具。这些工具有的也经常用到。
工 具 名 称 说 明
bmp_logo 制作标记的位图结构体
img2srec 转换SREC格式映像
envcrc 校验u-boot内部嵌入的环境变量
mkimage 转换u-boot格式映像
gen_eth_addr 生成以太网接口MAC地址
updater u-boot自动更新升级工具
这些工具都有源代码,可以参考改写其他工具。其中mkimage是很常用的一个工具,Linux内核映像和ramdisk文件系统映像都可以转换成u-boot的格式。
u-boot的移植
--------------------------------------
u-boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植u-boot程序。开始移植u-boot之前,先要熟悉硬件电路板和处理器。确认u-boot是否已经支持新开发板的处理器和I/O设备。假如u-boot已经支持一块非常相似的电路板,那么移植的过程将非常简单。
移植u-boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。开始移植之前,需要先分析一下u-boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的u-boot,至少能够配置编译通过。
以S3C2410处理器的开发板为例,u-boot-1.1.2版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。我们以S3C2410开发板fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410在u-boot-1.1.2中已经支持。
移植u-boot的基本步骤如下。
(1) 在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
参考上面2行,添加下面2行。
fs2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0
(2) 创建一个新目录存放开发板相关的代码,并且添加文件。
board/fs2410/config.mk
board/fs2410/flash.c
board/fs2410/fs2410.c
board/fs2410/Makefile
board/fs2410/memsetup.S
board/fs2410/u-boot.lds
(3) 为开发板添加新的配置文件
可以先复制参考开发板的配置文件,再修改。例如:
$cp include/configs/smdk2410.h include/configs/fs2410.h
如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。
(4) 配置开发板
$ make fs2410_config
(5) 编译u-boot
执行make命令,编译成功可以得到u-boot映像。有些错误是跟配置选项是有关系的,通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。
(6) 添加驱动或者功能选项
在能够编译通过的基础上,还要实现u-boot的以太网接口、Flash擦写等功能。
对于FS2410开发板的以太网驱动和smdk2410完全相同,所以可以直接使用。CS8900驱动程序文件如下。
drivers/cs8900.c
drivers/cs8900.h
对于Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发板大小、型号不都相同。所以还需要移植Flash的驱动。每种开发板目录下一般都有flash.c这个文件,需要根据具体的Flash类型修改。例如:
board/fs2410/flash.c
(7) 调试u-boot源代码,直到u-boot在开发板上能够正常启动。
调试的过程可能是很艰难的,需要借助工具,并且有些问题可能困扰很长时间。
添加u-boot命令
--------------------------------------
u-boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的u-boot命令。 u-boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section /
= {#name, maxargs, rep, cmd, usage, help}
这样每一个u-boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体。
基于u-boot命令的基本框架,来分析一下简单的icache操作命令,就可以知道添加新命令的方法。
(1) 定义CACHE命令。在include/cmd_confdefs.h中定义了所有u-boot命令的标志位。
#define CFG_CMD_CACHE 0x00000010ULL /* icache, dcache */
如果有更多的命令,也要在这里添加定义。
(2)实现CACHE命令的操作函数。下面是common/cmd_cache.c文件中icache命令部分的代码。
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
//这个函数解析参数,判断是打开cache,还是关闭cache
static int on_off (const char *s)
{
if (strcmp(s, "on") == 0) { //参数为“on”
return (1);
} else if (strcmp(s, "off") == 0) { //参数为“off”
return (0);
}
return (-1);
}
//对指令cache的操作函数
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
switch (argc) {
case 2: // 参数个数为1,则执行打开或者关闭指令cache操作
switch (on_off(argv[1])) {
case 0:
icache_disable(); //打开指令cache
break;
case 1:
icache_enable (); //关闭指令cache
break;
}
/* FALL TROUGH */
case 1: // 参数个数为0,则获取指令cache状态
printf ("Instruction Cache is %s/n",
icache_status() ? "ON" : "OFF");
return 0;
default: // 其他缺省情况下,打印命令使用说明
printf ("Usage:/n%s/n", cmdtp->usage);
return 1;
}
return 0;
}
...
U_Boot_CMD( //通过宏定义命令
icache, 2, 1, do_icache, //命令为icache,命令执行函数为do_icache()
"icache - enable or disable instruction cache/n", //帮助信息
"[on, off]/n"
" - enable or disable instruction cache/n");
...
#endif
u-boot的命令都是通过结构体__U_Boot_cmd_##name来描述的。根据U_Boot_CMD在include/command.h中的两行定义可以明白。
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section/
= {#name, maxargs, rep, cmd, usage, help}
还有,不要忘了在common/Makefile中添加编译的目标文件。
(3) 打开CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有#if语句需要预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例如:SMDK2410平台在include/configs/smdk2410.h中有如下定义。
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS /
(CONFIG_CMD_DFL | /
CFG_CMD_CACHE | /
CFG_CMD_REGINFO | /
CFG_CMD_DATE | /
CFG_CMD_ELF)
按照这3步,就可以添加新的u-boot命令。
- XSBase255B -- u-boot移植
- u-boot移植心得
- u-boot移植日记
- U-BOOT移植
- 移植u-boot
- u-boot移植三
- U-BOOT移植总结
- U-boot移植说明
- at91rm9200移植u-boot
- lpc2210 u-boot移植
- U-BOOT移植小解
- U-BOOT全线移植
- u-boot移植s3c2410
- IXP425 U-boot移植
- u-boot移植手册
- U-boot移植过程
- u-boot移植
- lpc2210 u-boot移植
- 单例模式(singleton)
- Java对象的生命周期与作用域
- java,jsp错误页面在web.xml中的设置
- C#byte 类型转 sbyte 类型
- C# 参考之方法参数关键字:params、ref及out
- 移植u-boot
- 将xml文件按照xsl文件样式快速生成html文件的方法
- struts分页标签的用法小例
- Useful quotations
- 2006优秀Flex 网站欣赏
- WCDMA相关术语整理
- COM 技术内幕学习之九 (简化程序编写)
- Hashtable和HashMap的区别
- C# 参考之转换关键字:operator、explicit与implicit