updated(2012/05/02): mainline的u-boot已经包含对pandaboard的支持, 其中x-loader已经被spl所取代. 相关介绍请参照我的另一篇博文<>
本篇文章是参考了pandaboard官方wiki, TI的官方文档及linaro的相关image制作的工具总结而来.
首先,来做些准备工作, 了解一下pandaboard启动所要用到的各种boot loader.
按如下顺序启动
- Boot ROM
这是固化到硬件中的boot程序, 它的作用是用来引导板子上电之后到哪里去找x-loader. 具体到pandaboard, 参照board manual的'2.6SYSBOOT Configuration'节可以看到, 更详细的就需要下载巨无霸OMAP4430的TRM来看了(在27.2.4.2Booting Device Order Selection). 这里默认是首先从USB找, 第二选择是MMC1. 大家拿到板子可以先确认下,自己的板子是不是默认设置哦. 不然搞了半天启动不起来,就郁闷了:)
具体的引脚位置:
- X-Loader
TI把对应的x-loader的文件一般叫做MLO, (这在Boot ROM的逻辑中是写死的, 必须要叫MLO, 否则找不到该x-loader)
这里我们来看一下什么是MLO,可以参照<Writing an MLO for a Beagleboard XM>.它也是一种u-boot, 不过是加上了一个头部(告诉u-boot从哪里开始加载), TI称之为签名.它主要用来做一些硬件的初始化工作及引导第二bootloader.
按照TI的文档,后续会有SPL来代替x-loader(比如,linaro已经为pandaboard这么做了).
大家也可以参照:http://elinux.org/Panda_How_to_MLO_&_u-boot,及http://lists.denx.de/pipermail/u-boot/2011-October/105079.html相关的描述
- U-boot
这里首先说明下, beagleboard的时候, TI还是用自己fork的u-boot来进行引导,但是现在最新的mainline上的u-boot已经支持pandaboard和beagleboard了.
linaro所提供的编译环境中,u-boot就是从mainline上获得加入了一些patch.
具体U-boot的功能及组织结构,这里也不多罗嗦了,只要你会用google就能得到你想要的.
说到底,上述的'2','3'就是模拟了PC上bios的事情, 配置各种硬件信息(内存,时钟信号,nand等等嵌入式设备上的总线和模块).各个不同的厂商,都有一些自己特有的东西, 就我的经验TI/Qualcomm/Samsung各有个的一套配置及设置方式.这就是arm的世界,嵌入式的战国世界!
- Linux kernel
这里有必要看一下,linaro是如何设定对应的kernel config的
linaro把u-boot和kernel的代码与AOSP的代码放在一起,通过修改device/linaro/下的相关板卡配置文件,引入了对于kernel及u-boot的编译过程
详见device/linaro/common/tasks/
├── bootfiles.mk
├── bootloader.mk
├── kernel.mk
├── mktarball.sh
├── tarballs.mk
└── uboot.mk
而对应的u-boot及内核的启动命令都是由下面提到的linaro-media-create工具来完成。
- linux rootfs
另外, 2-4按照TI的硬件说明都是需要vfat的文件系统, 而5则是extX(TI官方wiki上使用的是ext3, linaro上的image脚本制作的是ext4).
还有就是boot.src, 它是由u-boot加载之后,由它来指定具体的启动参数及启动环境. 它是由一个指定的xxxx.txt, 并由mkimage工具来生成.如下:
- File Excerpt: /files/beagle/bootScript
- mmc init
- setenv console tty0 console=ttyS2,115200n8
- setenv ramroot /dev/ram0 rw ramdisk_size=131072 initrd=0x88000000,512M
- setenv optargs mem=80M@0x80000000 mem=384M@0x88000000
- setenv bootargs console=${console} ${optargs} mpurate=800 root=${ramroot} rootfstype=ext4
- fatload mmc 0 0x82000000 uImage
- fatload mmc 0 0x88000000 rootfs.ext4
- bootm 0x82000000
用mkimage生成, 并copy到启动的sdcard的目录下File Excerpt: /files/beagle/bootScript mmc init setenv console tty0 console=ttyS2,115200n8 setenv ramroot /dev/ram0 rw ramdisk_size=131072 initrd=0x88000000,512M setenv optargs mem=80M@0x80000000 mem=384M@0x88000000 setenv bootargs console=${console} ${optargs} mpurate=800 root=${ramroot} rootfstype=ext4 fatload mmc 0 0x82000000 uImage fatload mmc 0 0x88000000 rootfs.ext4 bootm 0x82000000
- > mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'Boot script' -d bootScript boot.scr
- > cp /files/panda/boot.scr /mnt/panda
在linaro中, 该文件是由下面提到的linaro_image_tool生成, 具体的启动选项(即xxxx.txt)在media_create\boards.py中生成.> mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'Boot script' -d bootScript boot.scr > cp /files/panda/boot.scr /mnt/panda
最后, 还是来看看linaro为我们准备的image制作工具(也可以使用TI提供的脚本来完成, 不过比较麻烦, 但是对其中细节感兴趣的, 倒是可以参考)
该工具使用的相关文档:
https://wiki.linaro.org/Platform/Android/ImageInstallation?action=show&redirect=Platform%2FAndroid%2FInstallImages
按照文中说明, 很方便的就可以使用自己编译的u-boot, kernel, rootfs来烧制出可以启动pandaboard的sdcard了.
同时,可以参照<玩转pandaboard之初体验>相关文件介绍:
根目录是一些总控命令
|-- COPYING
|-- COPYING.GPL-2
|-- COPYING.GPL-3
|-- do-release -- 用来发布新版本的脚本
|-- initrd-do -- 生成合适的initrd文件
|-- linaro-android-media-create -- 制作android rootfs sdcard的命令
|-- linaro-fetch-image -- 从release server获得编译好的image
|-- linaro-fetch-image-ui -- 同上
|-- linaro-hwpack-create -- 设置用来编译rootfs的hardware pack
|-- linaro-hwpack-install -- 同上
|-- linaro-hwpack-replace -- 同上
|-- linaro-image-indexer -- 建立与release server对应的image信息的database
|-- linaro_image_tools\
|-- linaro-media-create -- 制作其它系统(ubuntu)的rootfs sdcard命令
|-- org.linaro.linaro-image-tools.policy
|-- README
`-- setup.pylinaro_image_tools\
|-- cmd_runner.py -- 调用各种辅助命令的python封装
|-- cmd_runner.pyc
|-- fetch_image.py -- 从release server上获得image的工具
|-- fetch_image_settings.yaml -- 从release server上获得image的配置文件
|-- hwpack\
|-- __init__.py
|-- __init__.pyc
|-- media_create\
|-- testing.py
|-- tests\
|-- utils.py
|-- utils.pyc
|-- __version__.py
`-- __version__.pyc------------------------------------------------------------
media_create\ rootfs文件系统及各board对应的配置文件制作及应用
|-- android_boards.py --为各种开发板上定制适合android的sdcard格式信息及kernel启动命令行, 与linaro-android-media-create相匹配
|-- android_boards.pyc
|-- boards.py -- 用来对不同的开发板进行所需要的sdcard进行初始化, 里面有各个开发板的一些section信息,kernel cmd等, 依赖于hwpack的一些工具函数
|-- boards.pyc
|-- check_device.py -- 检查连入系统的mmc是什么设备及对应dev/xxxx名称
|-- check_device.pyc
|-- chroot_utils.py -- chroot的工具封装, 用来在编译机上配合hardware pack建立独立的target文件系统(类似redhat的mock机制的一部粉)
|-- __init__.py
|-- __init__.pyc
|-- partitions.py -- 提供各种分区功能
|-- partitions.pyc
|-- rootfs.py -- 提供从独立的target 文件系统copy到sdcard上的工具
|-- rootfs.pyc
|-- tests
|-- unpack_binary_tarball.py -- 提供解包工具
`-- unpack_binary_tarball.pyc
hwpack\ 辅助target目标文件系统相关配置及制作,类似fedora下的mock机制
|-- better_tarfile.py
|-- builder.py
|-- config.py
|-- hardwarepack_format.py
|-- hardwarepack.py
|-- __init__.py
|-- packages.py
|-- tarfile_matchers.py
|-- testing.py
`-- tests
|-- ...
其它,
什么是.pyc文件, 它用来帮组加载py时加速. 参见http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html