一般移植U-BOOT会修改绿色部分的代码,U-BOOT中各目录间也是有层次结构的,虽然这种分法不是绝对的,但是在移植过程中可以提供一些指导意义。
可以通过“内容一的举例”来看看移植过程中需要更改哪些文件,我将其放在文末。
要学习u-boot之前,最好先了解一块板子的裸板程序启动的过程,因为u-boot其实就是裸板程序的集大成者。
U-boot的主线目标功能是从flash中读出内核,放到内存中,启动内核。为了要实现这个功能,u-boot分为两个阶段,主要在start.s文件中。
2.1第一阶段
硬件设备初始化;
为加载 Bootloader 的第二阶段代码准备 RAM 空间;
复制 Bootloader 的第二阶段代码到 RAM 空间中;
设置好栈;
跳转到第二阶段代码的 C 入口点;
在第一阶段进行的硬件初始化一般包括:关闭 WATCHDOG、关中断、设置 CPU的速度和时钟频率、 RAM 初始化等。这些并不都是必须的,比如 S3C2410/S3C2440的开发板所使用的 U-Boot 中,就将 CPU的速度和时钟频率放在第二阶段进行设置。
2.2第二阶段
初始化本阶段要使用到的硬件设备;
检测系统内存映射( Memory map );
将内核映像和根文件系统映像从 Flash上读到 RAM 空间中;
为内核设置启动参数;
调用内核;
备注:为了方便开发,初始化一个串口以便程序员与 Bootloader 进行交互。部分内容的解释在文末,名为“内容二的解释”。
将u-boot源码放在linux系统下编译(需要配置交叉编译工具),设置为板子的配置(如make smdk2410_config),再编译(make),最好的办法是拿一个开发板的u-boot源码进行编译,因为开发板厂商一般都会提供编译环境等(这些问题不该在初学时就遇到,否则会极大降低学习的积极性),编译成功后,将代码复制到windows下用source insight查看代码(这样看代码之间的互联性比较方便)。
以我的板子(jz2440为例),将全部目录加进SI后,要去掉部分不是2440板子的板级文件(注:加入文件时,如果不能加入.S文件,需要更改SI的设置)
board目录只留samsung/smdk2410;
arch目录只留:(注意要加入各层的通用文件(未在文件夹内的))
a、arm/cpu/arm920t/s3c24x0以及各层的通用文件(未在文件夹内的)
b、arm/cpu/dts
c、arm/include/asm/arch-s3c24x0和proc-armv以及各层的通用文件(未在文件夹内的)
d、arm/lib
include/config目录只加smdk2410.h
再同步(project-synchronize files)
? 最传统的方法是从makefile开始分析,但是这样太难了,
比如common/cmd_nand.c文件提供了操作NAND Flash的各种命令,这些命令调用drivers/nand/nand_base.c中的擦除、读写函数来实现;而这些函数是针对NAND Flash的共性做的封装,与平台/开发板相关的代码用宏或外部函数代替;平台相关则在cpu/xxx,开发板相关则在board/xxx。
以增加yaffs文件系统映像功能为例,先在common下的cmd_nand.c增加命令,比如nand write.yaffs,这个命令调用/drivers/nand/nand_util.c中的函数,而这些函数依赖于drivers/nand/nand_base.c、cpu/arm920t/s3c24x0/nand_flash.c文件中的相关函数。
所谓检测内存映射,就是确定板上使用了多少内存、他们的地址空间是什么。由于嵌入式开发中的 Bootloader 多是针对某类板子进行编写,所以可以根据板子的情况直接设置,不需要考虑可以适用于各类情况的复杂算法。
Flash上的内核映像有可能是经过压缩的,在读到 RAM 之后,还需要进行解压。当然,对于有自解压功能的内核,不需要 Bootloader 来解压。
将根文件系统映像复制到RAM中并不是必须的,这取决于是什么类型的根文件系统,以及内核访问它的方法。
将内核放在适当的位置后,在跳入执行内核之前,需要根据内核启动的需求,配置相应的启动参数。
调用内核的函数是什么还没找到,待会再找
原文:https://www.cnblogs.com/princepeng/p/11212854.html