本文内容参考http://blog.csdn.net/zy812248258/article/details/39120799以及http://jexbat.com/2016/BeagleBone-Image/,在此向作者表示感谢。
(A)从 AM335x 的启动流程可知,如果需要从UART启动 U-Boot,方法如下。
(B)从 AM335x 的启动流程可知,如果需要从MMC/SD启动 U-Boot,有FAT和RAW两种模式。下面对其分别介绍。
(1)FAT启动模式
在FAT 启动模式下,当按住BBB板子上的boot按键,板子便从SD卡(也就是mmc0)启动,此时ROM-Code从SD卡的一个活动主分区(boot分区)寻找SPL文件,将其加载到片内SRAM,控制权移交SRAM,之后SPL运行后又以和寻找SPL相同的方式开始寻找u-boot.img文件,于是从boot分区找到u-boot.img文件,并将其加载到片外SDRAM,之后u-boot加载内核,挂载根分区的根文件系统(rootfs分区)。系统启动!
早期的 BeagleBone Black 映像会采取FAT启动模式,即把 MLO 和 u-boot.img 放在活跃主分区(active primary partition)的 FAT 文件系统的根目录里。SD 的映像会包含两个分区,一个 FAT32 分区和一个 Linux ext3/4 分区。
全功能的第二阶段 U-Boot 会包含硬编码的环境变量(即默认的环境变量),其位于include/configs/am335x_evm.h的CONFIG_EXTRA_ENV_SETTINGS宏下。uboot启动后,它可以靠这些环境变量提供的配置进一步加载 MMC/SD中的uEnv.txt文件更新环境变量。之所以使用硬编码的环境变量和 uEnv.txt 是因为采用这种配置方式的 U-Boot 不能用 saveenv 保存环境变量(uboot会将uEnv.txt读入到内存中并进行修改,但无法通过saveenv命令将环境变量保存到MMC/SD中,但可以保存到NAND Flash中)。
由此得出结论,一张SD必须具备一个活动主分区,而且分区格式为FAT32(LBA),暂时把这个分区的名字叫做boot,boot分区中必须要有MLO、u-boot.img,以及一个根分区,分区格式为ext3/4,叫做rootfs,rootfs分区中必须有根文件系统,其他的就无所谓了。也就是说其他的文件可以和这些文件共存,只要保证这些文件以及目录完好即可。
既然现在大小、分区数都有自己来定了,那么我手上一张8GB的内存卡microSD,我希望除了这两个用于启动系统的分区外还有第三个分区用于存放自己的文件,这样以后操作另外两个分区不会影响第三个分区,也不用像以前老是要把U盘的东西复制出来腾出空间做启动盘。在linux可系统中对于一个移动设备它可以识别上面所有的分区,包括ext2/3/4以及FAT32(LBA),而windows系统对于一个移动设备,他仅仅识别上面第一个主分区,如果没有主分区就识别第一个逻辑分区,仅仅支持FAT32(LBA)格式。另外,对于BBB开发板,活动主分区一定要在第一个,否则启动系统时找不到文件。
那么,有两种选择,
1)分区为boot分区,活动主分区,格式FAT32(LBA),大小50M即可
2)分区为rootfs分区,主分区,格式ext3/4,大小2GB
3)分区为store分区,主分区,格式ext3/4,剩余全部空间
或者
1)分区为boot分区,活动主分区,格式FAT32(LBA),大小5GB
2)分区为rootfs分区,主分区,格式ext3/4,剩余全部
两种分区方法各有好处缺点。也可以有其他选择。Note:一个硬盘或者移动存储设备,上面最多可以有四个分区,其中包括主分区和扩展分区,并且扩展分区最多一个,当然也可以没有扩展分区。扩展分区之下可以有若干个逻辑分区。所以总容量=主分区+扩展分区,而扩展分区=逻辑分区之和。
最后是如何制作一张SD启动卡? 可以有两种选择,第一,利用TI-SDK的脚本来制作,该脚本功能较多,可以制作2分区的也可以制作3分区的启动卡,而且写入的相关启动文件比如MLO、u-boot.img、根文件系统(包括了内核)既可以是TI-SDK包里面自带的预编译好的,也可以是自己做的放在其他地方的文件;第二,完全自己手动制作,定制一张自己想要的大小、分区数、写入自己编译的MLO、u-boot.img、根文件系统。
(2)RAW启动模式
在 RAW 模式下,内置 ROM 代码会依次从 sector #0 (offset 0x00000)、sector #256 (0x20000)、sector #512 (0x40000)和sector #768 (0x60000) 这几个位置来搜索 TOC structure/Configuration Header(这个数据结构可以在TI的AM335x Technical Reference Manual中查到)。
如果你还想将MMC作为一个磁盘,那么 MMC 上就必须有一个 MBR。在这种配置下,你就不能把 U-Boot SPL/MLO放在sector #0 了(参见Wikipedia里的MBR结构)。由于前面提到 ROM 代码会顺序搜索可用的MLO,因此把 U-Boot SPL/MLO 放到0x20000 (sector #256)就可以解决这个问题。
随后,U-boot SPL 可以从 0x60000 进一步加载完整功能的 U-Boot。从块存储设备运行 U-Boot 的优点之一是可以保存环境变量,也就不再需要加载 uEnv.txt。
所以目前 Beaglebone Black 官方镜像把 MLO 和 U-Boot 数据写入在第一个分区之前的扇区内,因为我们的第一个分区的数据从 sector 2048 开始,每个 sector 为 512字节,所以足足有 1MB 的存储空间供我们使用。