编译和刷入 U-Boot
从源代码编译 U-Boot
获取 U-Boot
在网上获取 U-Boot 的源代码。以 Github 为例,把 u-boot/u-boot 仓库克隆下来:
$ git clone git@github.com:u-boot/u-boot.git
如果想要一个稳定版本的 U-Boot ,你可以 checkout 一个 tag,以 v2018.11-rc3 为例:
$ git checkout v2018.11-rc3
或者直接下载指定版本的 U-Boot 源码,以 v2018.11-rc3 为例:
$ wget https://github.com/u-boot/u-boot/archive/v2018.11-rc3.tar.gz
$ tar xvf v2018.11-rc3.tar.gz
获取交叉编译工具链
您如果是 Archlinux 用户,可以直接安装 arm-none-eabi-gcc :
$ sudo pacman -Sy arm-none-eabi-gcc
您如果是 Debian 用户,可以安装 gcc-arm-linux-gnueabihf :
$ sudo apt install gcc-arm-linux-gnueabihf
您如果是 Ubuntu 用户,可以安装 gcc-arm-linux-gnueabihf
$ sudo apt-get install gcc-arm-linux-gnueabihf
您如果是 Fedora 用户,可以安装 arm-none-eabi-gcc-cs
$ sudo dnf install arm-none-eabi-gcc-cs
对于未列出的 Linux 发型版,您可以搜索一下它的源有没有交叉编译工具链,如果没有,也可以使用 Linaro GCC。
由于各发型版安装的交叉编译器前缀不同,如果安装的编译器是 arm-none-eabi-gcc ,那么我们之后用到的 CROSS_COMPILE 就是 arm-none-eabi- ,即去掉最后的 gcc 部分。其它常见的还有 arm-linux-gnueabihf- 和 arm-linux-gnueabi ,都可以。
配置 U-Boot
采用我们提供的 .config
我们提供的已经测试过的 U-Boot 的 .config 文件已经存放在 sbc-fish/sfpi 的 u-boot 目录下。这里的 .config 都是可以直接复制到 U-Boot 根目录中使用的。
以 U-Boot v2018.11-rc3 为例,进入到 U-Boot 目录,下载 .config :
$ wget https://raw.githubusercontent.com/sbc-fish/sfpi/master/u-boot/v2018.11-rc3/.config
如果我们没有提供相应版本的 .config ,可以找一个版本较近的 .config 下载下来用,如果有部分配置需要更改,在后续编译的时候会有相应的提示,一般用默认参数就可以了。
如果想要自己调整配置:
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig
其中 CROSS_COMPILE 是您所安装的交叉编译工具链的前缀。如果您使用我们提供的 .config ,应该不需要做更改。
编译 U-Boot
然后开始编译:
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j24
其中 -j24
根据您的机器的 CPU 进行调整。此时应该得到一个 u-boot-sunxi-with-spl.bin
的文件,在当前目录下。
刷入 U-Boot
分区
建议向 TF 卡写入 MBR 格式的分区表,并在第一个分区前预留一定的空间。如果我们在上一步编译的文件大小为几百 K ,一个可供参考的分区方案是:
Disk: /dev/disk4 geometry: 980/128/63 [7907328 sectors]
Offset: 0 Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: 0B 1023 254 63 - 1023 254 63 [ 2048 - 20480] Win95 FAT-32
2: 83 1023 254 63 - 1023 254 63 [ 22528 - 7884800] Linux files*
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
第一个分区(FAT-32)从第 2048 个扇区开始,即在 1M (2048*512=1M) 的地方开始,这样给 U-Boot 预留出足够的空间。这个预留的空间大小,根据编译出来的 u-boot-sunxi-with-spl.bin
文件和 TF 卡容量自行调整。对于分区工具的使用,可以参考 Partitioning - Archlinux Wiki 、 fdisk - Archlinux Wiki 或 fdisk Manpages 。
使用 DD 刷入 U-Boot
把 u-boot-sunxi-with-spl.bin
写入到 TF 卡的 8192 偏移处即可,命令如下:
$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/disk4 bs=1024 seek=8
如果您是 macOS 用户,可以使用我们编写的 flash_uboot_macOS.sh 。
启动
连接串口
把 TF 卡插入到咸鱼派中,连接 microUSB 到电脑中,应该会看到一个 USB to Serial 设备。各平台的驱动可以在沁恒官网下载得到。在 Windows 下,可以采用串口助手等工具,在 Linux 和 macOS 下,可以用如下命令:
$ screen [tty] 115200
查看串口。对于 macOS ,此处的 tty 应为 /dev/tty.wchusbserial* 的格式。
按下板上的上电按钮,如果配置成功,应该可以成功看到 U-Boot 的启动如下:
U-Boot SPL 2018.11-rc3 (Nov 09 2018 - 11:55:32 +0800)
DRAM: 64 MiB
Trying to boot from MMC1
U-Boot 2018.11-rc3 (Nov 09 2018 - 11:55:32 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
MMC: SUNXI SD/MMC: 0
Loading Environment from FAT... OK
In: serial@01c28000
Out: serial@01c28000
Err: serial@01c28000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 0
=>
至此,我们就可以进行下一步的 Linux 内核编译过程了。见 Linux 内核的编译。