uboot移植
最近这两周的空余时间一直在研究uboot,移植过程中也遇到了很多问题,开贴说一下自己的理解。uboot代码我是下载的206年7月分的版本(u-boot-2016.07.tar.bz2),下载地址:ftp://ftp.denx.de/pub/u-boot/
目标开发板:AQ2440,CPU为三星s3c2440。
第一步:在uboot代码中添加对开发板的支持
uboot虽然已经支持了很多处理器平台,但是也没有做到将市面上的所有CPU都进行适配。所以我们在移植时可以选择一个已经适配了的CPU型号进行移植。uboot已经对s3c2410这一款CPU进行了适配,而s3c2440与s3c2410相近,所以我选择了在s3c2410的代码上进行修改,所以我直接将S3C2410的单板相关文件都复制为S3C2440的。
假设我们已经到了源码的根目录,执行以下操作:
a.在board中创建单板目录
cd board/samsung/
cp smdk2410 -r smdk2440
然后修改Kconfig文件内容,将所有的”2410“替换为”2440“,替换后文件如下:
if TARGET_SMDK2440
修改MAINTAINERS文件,修改后如下:
SMDK2440 BOARD
M: David Müller <d.mueller@elsoft.ch>
S: Maintained
F: board/samsung/smdk2440/
F: include/configs/smdk2440.h
F: configs/smdk2440_defconfig
修改Makefile,
obj-y := smdk2440.o
obj-y += lowlevel_init.o
最后将smdk2410.c改名为smdk2440.c
mv smdk2410.c smdk2440.c
创建单板相关头文件
同样,我们将include/configs/目录下的smdk2410.h文件复制为smdk2440.h
cd include/config
cp smdk2410.h smdk2440.h
然后修改两个宏定义,
修改前:#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 /* on a SAMSUNG SMDK2410 Board */
修改后:
#define CONFIG_S3C2440 /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_SMDK2440 /* on a SAMSUNG SMDK2440 Board */
c.创建defconfig文件
同样直接拷贝:
cd configs/
cp smdk2410_defconfig smdk2440_defconfig
拷贝过来以后,修改smdk2440_defconfig文件:
CONFIG_ARM=y
CONFIG_TARGET_SMDK2440=y
CONFIG_BOOTDELAY=5
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="SMDK2440 # "
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_FAT=y
d.修改arch/arm/Kconfig文件
vi arch/arm/Kconfig
添加如下内容:
config TARGET_SMDK2440
bool "Support smdk2440"
select CPU_ARM920T
source "board/samsung/smdk2440/Kconfig"
在上述操作完成后,尝试编译:
make smdk2440_config
make 单板添加完成后就是代码的修修改改了,先放两张图,如何让uboot顺利的跑起来,理解这两张图是关键
关于uboot的启动过程可以先参考这篇博客http://blog.csdn.net/hare_lee/article/details/6916325 概括来说uboot的启动分为两个阶段,
(1)第一阶段的功能
a.硬件设备初始化
b.加载U-Boot第二阶段代码到RAM空间
c.设置好栈
d.跳转到第二阶段代码入口
(2)第二阶段的功能
a. 初始化本阶段使用的硬件设备
b.检测系统内存映射
c.将内核从Flash读取到RAM中
d.为内核设置启动参数
e.调用内核
页:
[1]