加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

U-Boot的移植

发布时间:2020-12-15 18:42:43 所属栏目:百科 来源:网络整理
导读:U-Boot的移植 U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。 开始移植U-Boot之前,先要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新开发板的处理器和I/O设

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)为开发板添加新的配置文件

可以先复制参考开发板的配置文件,再修改。例如:

$cpinclude/configs/smdk2410.h? include/configs/fs2410.h

如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。

(4)配置开发板

$ makefs2410_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在开发板上能够正常启动。

调试的过程可能是很艰难的,需要借助工具,并且有些问题可能困扰很长时间。

6.2.5??添加U-Boot命令

U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的U-Boot命令。

U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。

?

#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /

cmd_tbl_t__u_boot_cmd_##name Struct_Section = {#name,help}

?

这样每一个U-Boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。

从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体。

基于U-Boot命令的基本框架,来分析一下简单的icache操作命令,就可以知道添加新命令的方法。

(1)定义CACHE命令。在include/cmd_confdefs.h中定义了所有U-Boot命令的标志位。

?

#defineCFG_CMD_CACHE?????? 0x00000010ULL?? /*icache,dcache?????? */

?

如果有更多的命令,也要在这里添加定义。

(2)实现CACHE命令的操作函数。下面是common/cmd_cache.c文件中icache命令部分的代码。

?

#if(CONFIG_COMMANDS & CFG_CMD_CACHE)

staticint on_off (const char *s)

{????? //这个函数解析参数,判断是打开cache,还是关闭cache

?? ????if (strcmp(s,"on") == 0) {? //参数为“on”

?????????? ???return(1);

?? ????} else if (strcmp(s,"off") == 0){? //参数为“off”

?????????? ???return(0);

?? }

?? return (-1);

}

?

intdo_icache ( cmd_tbl_t *cmdtp,int flag,int argc,char *argv[])

{??? //对指令cache的操作函数

?? ??switch (argc) {

???? case2:??????????????/*?参数个数为1,则执行打开或者关闭指令cache操作?*/

??????????? switch (on_off(argv[1])) {

??????????? case 0: ??? icache_disable();???????//打开指令cache

?????????????????break;

??????????? case 1: ???icache_enable ();??????? //关闭指令cache

?????????????????break;

??????????? }

?????????? /* FALL TROUGH */

?? ??case1:?????????? /*?参数个数为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中的两行定义可以明白。

?

#defineU_BOOT_CMD(name,help}

?

还有,不要忘了在common/Makefile中添加编译的目标文件。

(3)打开CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有#if语句需要预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例如:SMDK2410平台在include/configs/smdk2410.h中有如下定义。

?

/***********************************************************

?*Command definition

?***********************************************************/

#defineCONFIG_COMMANDS /

????????????????(CONFIG_CMD_DFL? | /

????????????????CFG_CMD_CACHE ?? ?| /

????????????????CFG_CMD_REGINFO? ? | /

????????????????CFG_CMD_DATE ???? | /

????????????????CFG_CMD_ELF)

?

按照这3步,就可以添加新的U-Boot命令。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读