标签:
ReadMe文件分析
1. 目录架构
- board 板子独立的文件
- common 与硬件架构无关的通用功能
- cpu cpu相关文件
- disk 磁盘分区驱动相关
- doc 文档
- drivers 通用的设备驱动
- examples 例程
- fs filesystem 相关代码
- include 头文件
- lib_xx 与具体的硬件架构相关的库文件
- net 网络部分的代码
- post 上电自检
- rtc 实时时钟驱动
- tools 生成 s-record 和 image的工具
2. 配置方法
与板子相关的配置选项都在 "include/configs/<board_name>.h" 中。使用 "make <board_name>_config" 来进行配置。
具体的配置选项以后再细看。
3. 如何编译 u-boot
1) 交叉编译,如果你配置的arm相关的板子,那么编译的时候会自动使用PATH下的arm-linux- 编译器。当然你也可以在顶层 Makefile 中通过 CROSS_COMPILE 来指定交叉编译器,如 CROSS_COMPILE = arm-linux-
2) 配置,如上所述,make name_config
3) 编译, make all
最终会生成三个文件
u-boot.bin 纯二进制文件
u-boot ELF格式的二进制文件
u-boot.srec Motorola S-Record 格式
默认编译是在当前目录下,可以通过下面的两个方法来指定 build dir
make O=/tmp/builddir/ distclean
make O=/tmp/build/ NAME_config
make O=/tmp/build/ all
或者,直接指定BUILD_DIR变量
export BUILD_DIR=/tmp/build
make distclean
make NAME_config
make all
4. 如果u-boot不支持你的板子,那么你需要把它添加到u-boot中再进行编译。步骤如下:
1). 在 top Makefile 和 MAKEALL 脚本中添加新的配置选项,
2). 在board目录下,创建自己的板子的目录,其中至少包含 Makefile board.c flash.c u-boot.lds文件
3). 创建新的 include/configs/<boardname>.h 用来进行配置
4). 如果你的板子的cpu不被u-boot所支持,那么你也要在cpu目录下创建新的
5). 正常的编译过程
5. 常用的u-boot命令
这部分我打算等我移植了自己一版u-boot之后,再来细看u-boot的一些常用命令还有环境参数等等。这边略过。
6. 关于u-boot格式问题。
上面编译u-boot的时候生成了三个 u-boot的image文件。
u-boot ELF格式的二进制文件
u-boot.bin 纯二进制文件
u-boot.srec Motorola S-Record 格式
前面两者很好理解。u-boot.srec是Standalone Programs: 即可以在u-boot环境下运行的可执行程序。当程序执行完成之后,仍返回u-boot。u-boot支持动态的加载和运行 “standalone” 程序。这些程序可以使用u-boot提供的I/O操作,或者中断服务等。源代码的examples/hello_world.c下在编译 u-boot的时候会自动被编译成hello_world.srec这种 standalone 程序。
7. 生成linux image
u-boot 不支持传统的 linux内核格式,比如zImage, bzImage。而使用 uImage 这种格式。生成方法如下:
1) 生成标准的 ELF 格式的linux内核,vmlinux
2) 将vmlinux转成纯粹的二进制格式 linux.bin
3) 压缩二进制文件 gzip -9 linux.bin
4) 使用 mkimage 将linux.bin.gz 打包成 uImage
Mkimage –A ppc –O linux –T kernel –C gzip –a 0 –e 0 –n “Linux kernel image” –d linux.bin.gz uImage
8. 学习过程
这段来自README文件的代码阐述了使用u-boot的过程,还是挺有意思的。
int main(int argc, char *argv[]) { sighandler_t no_more_time; signal(SIGALRM, no_more_time); alarm(PROJECT_DEADLINE - toSec (3 * WEEK)); if (available_money > available_manpower) { Pay consultant to port U-Boot; return 0; } Download latest U-Boot source; Subscribe to u-boot mailing list; if (clueless) email("Hi, I am new to U-Boot, how do I get started?"); while (learning) { Read the README file in the top level directory; Read http://www.denx.de/twiki/bin/view/DULG/Manual; Read applicable doc/*.README; Read the source, Luke; /* find . -name "*.[chS]" | xargs grep -i <keyword> */ } if (available_money > toLocalCurrency ($2500)) Buy a BDI3000; else Add a lot of aggravation and time; if (a similar board exists) { /* hopefully... */ cp -a board/<similar> board/<myboard> cp include/configs/<similar>.h include/configs/<myboard>.h } else { Create your own board support subdirectory; Create your own board include/configs/<myboard>.h file; } Edit new board/<myboard> files Edit new include/configs/<myboard>.h while (!accepted) { while (!running) { do { Add / modify source code; } until (compiles); Debug; if (clueless) email("Hi, I am having problems..."); } Send patch file to the U-Boot email list; if (reasonable critiques) Incorporate improvements from email list code review; else Defend code as written; } return 0; } void no_more_time (int sig) { hire_a_guru(); }
标签:
原文地址:http://www.cnblogs.com/Gru--/p/5140343.html