OMAP Boot Sequence
http://www.omapedia.org/wiki/Bootloader_Project
两段式boot方式
两段式boot process,第一段由ROM代码load到内部static RAM(比较小,64K)
内部的ROM代码会尝试从不同外设启动,包括Serial(UART3),SD Card(MMC1,MMC2),Nand和USB。
启动顺序由一组GPIO配置,SYS_BOOT
配置可以从物理地址0x480022f0,透过JTAG或者如果运行linux,使用devmem2读取。
# devmem2 0x480022f0 b
/dev/mem opened.
Memory mapped at address 0x40020000.
Value at address 0x480022F0 (0x400202f0): 0x2F
Zoom2的启动配置顺序是:The default SYS_BOOT configuration for the Zoom2 appears to be: USB, Serial(UART3), SD Card(MM1), and NAND flash
Serial Boot
ROM代码往serial port写一个ID,如果host在一定时间内正确回应,那ROM代码可是从serial port读取数据,传输到内部sram里;如果没有错误,控制权随即转到sram。只有UART3才能用于uart启动。(这个simple ID是啥呢?)
SD Card Boot
查看第一个MMC控制器,找到Card后,扫描第一个分区,找到MLO『x-loader的二进制文件,加上头部信息――包含加载memory地址(指定文件将要加载的位置),以及文件的大小』,如果一切正常,MLO加载到内部sram,控制权随机转到sram,继续执行。MMC1和MMC2都可以用于booting。
Nand Boot
加载Nand的第一个sector,如果这个sector是bad或者corrupt或者blank,ROM代码继续尝试下一个sector(在退出前,会一直尝试4个sector)。找到好的sector,把内容传输到sram,转移控制权到sram,继续执行。
For example, you could flash the serial x-loader into the nand. The rom will load from nand and transfer control to the x-loader which will wait for the 2nd stage to be downloaded from the serial port.
Serial Boot
使用Kermit协议传输大型文件到main memory。一旦传输完成,控制权转移
SD Card Boot
寻找第一个MMC上的第一个分区里的u-boot.bin
把u-boot.bin传输到main memory,然后把控制权转移到u-boot
NAND Boot
Nand x-loader会期望在第5sector(offset 0x00800000)找到u-boot.然后把u-boot传输到main memory,控制权转移过去。
Uboot和xloader的build、flash过程
为什么要两个bootloader?
X-loader是简化版的u-boot,运行在on-chip的sram:它初始化系统的off-chip的内存以及其他必须的设备驱动,然后为linux加载较大型的bootloader,u-boot。
使用git,获取source code
CodeSourcery ARM Compiler
获取Uboot源代码
# mkdir bootloader
# cd bootloader
# git clone git://git.omapzoom.org/repo/u-boot.git
构建Uboot
# cd <path_to_u-boot>
# make distclean
# make CROSS_COMPILE=arm-none-linux-gnueabi- omap3430zoom2_config
# make CROSS_COMPILE=arm-none-linux-gnueabi-
各种配置文件
U-boot config files
Board |
config file |
4430SDP |
omap4430sdp_config |
3430SDP |
omap3430sdp_config |
3630SDP |
omap3630sdp_config |
3430LDP |
omap3430labrador_config |
Zoom2 |
omap3430zoom2_config |
Zoom3 |
omap3630zoom3_config |
2430sdp |
omap2430sdp_config |
2420h4 |
omap2420h4_config |
获取X-loader源代码
# cd bootloader
# git clone git://git.omapzoom.org/repo/x-loader.git
构建Xloader
Warning:必须在x-loader之前build u-boot
# cd <path_to_x-boot>
# make distclean
# make CROSS_COMPILE=arm-none-linux-gnueabi- omap3430zoom2_config
# make CROSS_COMPILE=arm-none-linux-gnueabi- ift
Board |
config file |
4430SDP |
omap4430sdp_config |
3430SDP |
omap3430sdp_config |
3630SDP |
omap3630sdp_config |
3630SDP 1GB |
omap3630sdp_1G_config |
3430LDP |
omap3430labrador_config |
Zoom2 |
omap3430zoom2_config |
Zoom3 |
omap3630zoom3_config |
2430sdp |
omap2430sdp_config |
2420h4 |
omap2420h4_config |
用build 透过serial boot的x-loader:
To build X-loader to boot over a serial connection, use "omap3430labradordownload_config"
BTW:该codebase是u-boot 1.1.4,在omapedia wiki网站有另一个项目u-boot upstreaming,在最新的u-boot mainline中加入omap支持