barebox是一个bootloader,虽然不如uboot那么出名,但是相对uboot风格上更像linux kernel,而且相对简单,更有利于我们对启动做一个详细深入的学习。
全文分析的barebox的版本是barebox-2014.05.0
编译
首先是下载并解压barebox-2014.05.0,
默认这个版本就对tiny210有不错的支持,我们只需要用下面这些命令就可以了
export ARCH=arm export CROSS_COMPILE=/home/panzhenjie/tool/arm-2013.11/bin/arm-none-linux-gnueabi- cp arch/arm/configs/friendlyarm_tiny210_defconfig .config make
当然,CROSS_COMPILE需要更具你自己的环境配置,我使用的是codesourcery提用的编译工具。
生成的image有个叫barebox.bin,但是我们要烧写到sd卡里的却不是这个文件,而是barebox.s5p
原因是因为s5pv210这块芯片的rom code会对sd卡里的boot image有一个校验码的需求。
所以barebox.bin需要进行16个字节的校验码计算,然后添加在文件的最前端。
-rwxrwxr-x 1 panzhenjie panzhenjie 81892 6月 3 21:01 barebox.bin* -rw-rw-r-- 1 panzhenjie panzhenjie 81908 6月 3 21:01 barebox.s5p
从这里就可以看到,barebox.s5p有81908个字节,正好是81892+16
我们再用hexdump来确认下这一点
barebox.bin
0000000 0012 ea00 fffe eaff fffe eaff fffe eaff 0000010 fffe eaff fffe eaff fffe eaff fffe eaff 0000020 6162 6572 6f62 0078 0000 23e0 3fe8 0001 0000030 5555 5555 5555 5555 5555 5555 5555 5555 * 0000050 0013 ea00 e000 e04e f00e e1a0 c03c e59f
barebox.s5p
0000000 2000 0000 0000 0000 88c4 000d 0000 0000 0000010 0012 ea00 fffe eaff fffe eaff fffe eaff 0000020 fffe eaff fffe eaff fffe eaff fffe eaff 0000030 6162 6572 6f62 0078 0000 23e0 3fe8 0001 0000040 5555 5555 5555 5555 5555 5555 5555 5555 * 0000060 0013 ea00 e000 e04e f00e e1a0 c03c e59f
但是这16个字节的校验头到底是怎么生成书来的那?
这个就要先看下三星文档里的一张图片了
我们可以看到,其实这16个字节只有8个是有用的,另外8个是reserved 0
0000000 2000 0000 0000 0000 88c4 000d 0000 0000
我们再看一下刚才用hexdump生成的前16个字节,确实如文档所言。
BL1 size是0x00002000,CheckSum是0x000d88c4
s5pv210允许的BL1的最大大小是64K,因为barebox.bin是大于64K的,所以必须分两部启动。
这里0x2000=8K就是让rom code把8K的内容从sd卡加载到sram里,然后跳转到这些代码中去。
这一部分跑在sram中的代码需要配置好dram,然后把整个barebox加载到dram中,再跳转过去。
这样才能实现整个barebox的加载。
生成checksum的程序是scripts/s5p_cksum,原代码也在其中。
scripts/s5p_chsum.c line74 cksum = 0; for (i = 16; i < bufsize; ++i) cksum += (uint32_t)buf[i];
其实这个checksum的算法很简单,就是把每个字节的值相加,然后保存起来。
运行
接下来我们用如下命令烧写barebox.s5p到sd卡里
sudo dd if=./barebox.s5p of=/dev/sdb bs=512 seek=1
至此,这张sd卡就可以顺利把tiny210启动起来了。
barebox 2014.05.0 #2 Tue Jun 3 21:47:34 CST 2014 Board: Friendlyarm tiny210 malloc space: 0x23a00000 -> 0x23dfffff (size 4 MiB) refclk: 24000 kHz apll: 1000000 kHz mpll: 667000 kHz hclk: 133400 kHz pclk: 66700 kHz Open /dev/env0 No such file or directory no valid environment found on /dev/env0. Using default environment running /env/bin/init... /env/bin/init not found barebox:/
基于tiny210的barebox分析(一)