uboot移植(一)——uboot源码目录分析
本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot
一:uboot的概念及移植的原理。
uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图。从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能。
移植原理:uboot中有很多平行代码,各自属于各自不同的架构/CPU/开发板,当我们具体到某一款开发板的时,编译的时候通过创建符号链接的方法来选择具体的哪一个文件夹/文件进行编译,这样就可以在配置的时候通过不同的配置来使用不同的文件,就可以实现可移植性。
二:uboot中个文件介绍
1:.gitignore:git工具文件,这个文件和git工具有关和我们的uboot本身无关。
2:arm_config.mk:一个Makefile文件,后面会有某个Makefile会调用它。
3:CHANGELOG Changelog_Samsung CHANGELOG-before-U-Boot-1.1.5 三个Changelog文件,这几个文件用来记录uboot的版本变迁和版本的修改
4:config.mk:一个Makefile文件,等待被调用,该文件里面的TEXT_BASE指定了代码在内存中的地址
5:COPYING:版权声明
6:CREDITS:鸣谢
7:image_split:一个脚本,用于分割uboot.bin到BL1
8:MAINTAINERS:维护者
9:MAKEALL:一个脚本,是帮助编译uboot的
10:Makefile:是uboot源代码的主Makefile,将来整个uboot被编译时就是用这个
Makefile管理编译的。后面会单独分析
11:mk:快速编译的脚本,里面的内容是 make distclean make x210_sd_config make -j4,也就是清理->配置->编译
12:mkconfig:是uboot配置阶段的主要配置脚本,这个脚本根据传入的不同SOC/开发板的参数来创建对应的符号链接,是uboot实现可移植性的关键。后面会单独分析
13:mkmovi:一个和iNand/SD卡启动有关的脚本
14:README:读我,一个简单的说明文档(纯英文)
15:rules.mk:uboot的Makefile使用规则文件
三:uboot的源码目录分析
1:api:
硬件无关的功能函数的API。uboot移植时基本不用管,这些函数是uboot本身使用的。
2:api_examples:
API相关的测试事例代码。
3:board
本文件下的子文件与开发板相关,每一个子文件代表一个芯片厂家,芯片厂家文件夹下存放的每一个子文件夹是一种开发板,由于历史原因,board目录下尚保留有大量的开发板文件夹没有归档到芯片厂家文件夹内,保持兼容性,因此整体显得比较混乱。如samsung的smdk2400、smdk2410开发板就位于samsung文件夹外。
S5PV210芯片对应的文件夹位于board/samsung/x210,文件夹内的lowlevel_init.S文件主要用于时钟、串口、MMU、Flash底层驱动、板级初始化,u-boot.lds文件是链接脚本文件,对于工程项目编译后期的链接阶段非常重要,决定了程序的组装。
4:common
本文件夹下存放与处理器体系结构无关的通用代码,uboot的命令解析代码/common/command.c、所有命令的上层代码cmd_*.c、uboot环境变量处理代码env_*.c、CRC校验等都位于本目录下。
5:drivers
本目录下存放所有外围芯片的驱动,网卡、USB、串口、LCD、Nand Flash等。
6:disk
本目录存放于磁盘驱动的分区处理代码
7:fs
本目录下存放文件系统相关的代码,每一个子文件夹代表一种文件系统。
8:net
本目录下存放于网络协议相关的代码。
9:doc
本目录下存放uboot的说明文档。
10:include
头文件,包括各种CPU的寄存器定义,文件系统、网络等等
configs子目录下的文件是与目标板相关的配置头文件,后面mkconfig文件中创建的符号链接都在该目录下面。
11:lib_xxx
lib_arm、lib_avr32、lib_blackfin、lib_generic、lib_i386、lib_m68k、lib_microblaze、lib_mips、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc
每一个文件夹代表一种CPU体系架构。与S5PV210相关的文件夹有lib_arm、lib_generic,lib_generic目录存放的是各CPU体系架构通用的加密算法、压缩算法、字符处理相关代码。在每一种CPU体系架构文件夹内都存在board.c,是uboot启动第二阶段代码入口函数和相关初始化函数存放的地方。
12:libfdt
本目录下存放的是设备数相关的代码。
13:tools
编译S-Record或uboot映像等相关工具,如制作bootm引导的内核映像文件工具mkimage源码。
14:post
上电自检相关代码
15:nand_spl、onenand_bl1、onenand_ipl
Nand、onenand启动相关的代码。
16:sd_fusing
本目录下存放的是烧录相关的工具代码