Linux-4.14内核是全志H3的主线内核,是一个非常纯净的内核。而以前使用多半是基于全志公司定制开发的linux3.4,发现它并没有支持设备树。
- 编译安装uboot
安装交叉编译器
推荐使用的交叉编译器arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz
tar xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz //解压
export PATH=~/4.9.3/bin:$PATH //编译器的路径加入到PATH
arm-linux-gcc -v //查看是否安装成功
编译uboot
下载U-boot源码,并切换分支:
git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
编译u-boot
apt-get install swig python-dev python3-dev //设置环境
make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux- //配置
make ARCH=arm CROSS_COMPILE=arm-linux- //编译
编译完成后在u-boot源码中会生成u-boot-sunxi-with-spl.bin 和u-boot.bin 前者是与启动方式有关 后者与启动方式无关的bootloader
- 下载, 编译linux内核
下载Linux内核源码,并切换分支:
git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
编译内核:
cd linux
touch .scmversion
make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux- //配置内核
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
//编译内核和设备树
编译完成后会在arch/arm/boot/目录下生成zImage,并且在arch/arm/boot/dts/目录下生成dtb文件
- 制作刷机包
制作一个 512M 的空白映象文件:
dd if=/dev/zero of=fs_nanopi-m1_512M.img bs=1M count=512
把映象文件设置为“回环设备”:
sudo losetup /dev/loop0 fs_nanopi-m1_512M.img
分区:第一个分区格式化成FAT文件系统,来转载内核和设备树,大小设置成30M 第二个分区格式化成ext4文件系统,我们使用前面使用buildroot构建的文件系统,大小设置成256M 可以参看在nanopi-neo构建文件系统相关章节 第一个分区前面偏移20M,前面的无名分区放uboot 使用fdisk命令分区
sudo fdisk /dev/loop0
分区完后可以看到分区信息
识别分区, 并格式化:
sudo partprobe /dev/loop0
$ sudo mkfs.vfat -I /dev/loop0p1
$ sudo mkfs.ext4 /dev/loop0p2
烧写 bootloader
cd u-boot
$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1k seek=8
$ sudo dd if=u-boot.bin of=/dev/loop0 bs=1k seek=16400
烧写内核和设备树
cd linux
sudo mount -t vfat /dev/loop0p1 /mnt
sudo arch/arm/boot/zImage arch/arm/boot/dts/sun8i-h3-nanopi-m1.dtb /mnt
sudo umount /mnt
烧写文件系统
cd ~/build_root/nfs_root
sudo mount /dev/loop0p2 /mnt
sudo cp * -rfd /mnt
sudo umount /mnt
卸载回环设备, 烧写 TF 卡
sudo losetup -d /dev/loop0
卸载完后将得到映像文件fs_nanopi-m1_512M.img,用工具 win32diskimager 把它烧到 TF 卡中,此 TF 卡即可用来启动 nanopi-m1
板子上电后,有uboot启动信息,但不能启动内核,还需设置两个重要的环境变量bootcmd和bootargs。设置前者就是把内核和dtb从TF卡上读取到指定的内存位置,然后从指定位置启动内核并在指定的内存解析dtb文件。后者指定了根文件系统位于哪个分区
setenv bootcmd "fatload mmc 0:1 46000000 zImage;fatload mmc 0:1 47000000 sun8i-h3-nanopi-m1.dtb;bootz 46000000 0:0 47000000"
setenv bootargs "root=/dev/mmcblk1p2 rw console=ttyS0,115200"
saveenv
设置完成后,即可正确进入文件系统
- 更新内核 和设备树
在开发过程中需要调试板子,需要不断更新内核和设备树文件。启动进入文件系统后 mount /dev/mmcblk1p1 /mnt 出现ascii not found 还需指定字符集 mount -t vfat -o iocharset=cp437 /dev/mmcblk1p1 /mnt
使用cp zImage /mnt 然后 umount /mnt 重启后即可以看到内核被更新了 cp sun8i-h3-nanopi-m1.dtb /mnt umount /mnt 重启后即可以看到设备树文件被更新了