F1C200S (二) Uboot
交叉编译工具链
F1C200s内核ARM9 使用 ARMv5 架构,因此支持 ARMv5 的工具链都能编译,一般使用arm-linux-gnueabi-
开发环境使用 Ubuntu16.04
- 解压编译器到
/usr/local/arm-linux-gcc/
- 添加环境变量
nano /etc/profile
- 添加内容路径
PATH=$PATH:/usr/local/arm-linux-gcc/bin
- 使得路径生效
source /etc/profile
编译 Uboot
BootLoader
引导程序可以采用U-boot
X-boot
Rt-Thread
- 为了方便,直接使用荔枝派的 Uboot
git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01
- 查看分支
git branch -a
切换到 nano 分支git checkout nano-v2018.01u-boot
- 指定 Uboot 交叉工具链和架构,修改
Makefile
第249 行ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
- 查看配置文件
cd config && ls
,可以看到荔枝派的 Uboot 文件中包含了 nano 的配置文件 - 回到 Uboot 文件夹,配置
make menuconfig
- 按图配置
bootargs
console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw
- 配置
bootcmd
load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000;
- 编译
make -j4
,编译完成后会在当前目录生成u-boot-sunxi-with-spl.bin烧录文件 - 烧录到 SD 卡
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
bs bytes
:同时设置读入/输出的块大小为bytes个字节。
seek blocks
:从输出文件开头跳过blocks个块后再开始复制。
注解
bootcmd 启动内核
load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000;
load mmc 0:1 0x80008000 zImage
: 即上面的命令意思是将mmc的0:1 分区中的zImage复制到内存中的0x80008000地址处。这里的zimage就是Linux内核,后续会提到该文件编译,0:1这个可以这样理解0表示TF卡(TF卡属于mmc存储器的一种),1这表示TF卡的第一个分区(boot分区)后面会提到。
而对于内存位置 0x80008000 地址位置,将其理解为默认值就行了。这样完成了zImage的加载。load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb
:将mmc的0:1分区中的suniv-f1c100s-licheepi-nano.dtb文件加载到内存中的0x80c08000地址处。对于suniv-f1c100s-licheepi-nano.dtb 这个文件,叫做设备树文件,简单来说就是当前开发板上面所有外设备描述文件,这部分将会在后续内核编译部分进行详细说明。bootz 0x80008000 - 0x80c08000
:告诉内核镜像的起始地址为0x80008000,加载的设备树地址为0x80c08000。这里是告诉cpu从这里开始启动Linux, bootz命令的格式是:bootz空格0x80008000空格-空格0x80c08000,注意-左右有空格。
bootargs 启动根文件系统
console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw
这部分配置信息是由u-boot 直接按照参数字符串方式提供给Linux内核,然后由Linux内核进行执行的,这也说明里为什么格式与bootcmd配置方式不一致。
console=ttyS0,115200
: 终端为ttyS0即串口0,波特率为115200panic=5
:当Linux卡住5秒后仍未成功就会执行Linux恐慌异常的一些操作rootwait
:告诉内核挂在文件系统之前需要先加载相关驱动,一般bootargs中都要加上这个参数root=/dev/mmcblk0p2
:根文件系统的位置在mmc的0:2分区处,/dev是设备文件夹,内核在加载mmc中的时候就会在根文件系统中生成mmcblk0p2设备文件,这个设备文件其实就是mmc的0:2分区(这里对应TF卡的第二个分区:rootfs),这样内核对文件系统的读写操作方式本质上就是读写/dev/mmcblk0p2该设备文件。earlyprintk
:参数是指在内核加载的过程中打印输出信息,这样内核在加载的时候终端就会输出相应的启动信息。rw表示文件系统的操作属性,此处rw表示可读可写。
License:
CC BY 4.0