3. SD卡烧录eMMC或NAND¶
前面介绍的都是通过USB烧录eMMC、SD或nand,那么有没有方法可以插入SD卡即可烧录eMMC/nand?本章节将介绍如何通过SD卡烧录eMMC/nand系统。
3.1. SD烧录eMMC¶
3.1.1. 根文件系统安装必要工具¶
需要在buildroot配置项添加以下配置:
1 2 3 4 5 6 | BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
BR2_PACKAGE_TAR=y
BR2_PACKAGE_BZIP2=y
|
3.1.2. 烧录脚本说明¶
创建sd_download_emmc.sh脚本,脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #!/bin/sh
#格式化eMMC
dd if=/dev/zero of=/dev/mmcblk1 bs=1M count=2
#设置分区,boot分区40M,rootfs分区剩余空间
#不要删除下面空白项,空白项也是参数!
fdisk /dev/mmcblk1 << EOF
n
p
1
+40M
n
p
2
w
EOF
#烧录Uboot
dd if=/dev/zero of=/dev/mmcblk1 bs=1k seek=768 conv=fsync count=8
echo 0 > /sys/block/mmcblk1boot0/force_ro
dd if=u-boot-mmc.imx of=/dev/mmcblk1boot0 bs=512 seek=2
echo 1 > /sys/block/mmcblk1boot0/force_ro
#格式化boot分区并挂载
mkfs.ext4 -F -E nodiscard /dev/mmcblk1p1
mkdir -p /mnt/mmcblk1p1
mount -t ext4 /dev/mmcblk1p1 /mnt/mmcblk1p1
#烧录zImage
cp -rf zImage /mnt/mmcblk1p1/
#烧录dtb
cp -rf imx6ull-mmc-npi-lite.dtb /mnt/mmcblk1p1/
#卸载boot分区
sleep 1
sync
umount /mnt/mmcblk1p1
#格式化rootfs分区并挂载
mkfs.ext4 -F -E nodiscard /dev/mmcblk1p2
mkdir -p /mnt/mmcblk1p2
mount -t ext4 /dev/mmcblk1p2 /mnt/mmcblk1p2
#烧录rootfs
tar -xvf rootfs.tar -C /mnt/mmcblk1p2
#拷贝modules到rootfs
mkdir -p /mnt/mmcblk1p2/lib/modules
tar axf modules.tar.bz2 -C /mnt/mmcblk1p2/lib/modules/
#卸载rootfs分区
sleep 1
sync
umount /mnt/mmcblk1p2
sync
echo Update Complete!
#(可选) 将系统心跳灯1s闪烁提示烧录完成
#echo none > /sys/class/leds/cpu/trigger
#while true
#do
# echo 1 > /sys/class/leds/cpu/brightness
# sleep 1
# echo 0 > /sys/class/leds/cpu/brightness
# sleep 1
#done
|
添加执行权限:
1 | chmod 777 sd_download_emmc.sh
|
3.1.3. 烧录系统¶
将eMMC镜像组件和脚本放到同一个目录下,如下所示:
1 2 3 4 5 | #查看当前目录文件
ls
imx6ull-mmc-npi-lite.dtb sd_download_emmc.sh
u-boot-mmc.imx zImage
modules.tar.bz2 rootfs.tar
|
执行sd_download_emmc.sh脚本将镜像组件烧录到eMMC:
1 2 3 4 5 | #执行烧录
./sd_download_emmc.sh
#烧录完成提示
echo Update Complete!
|
烧录完成后切换到eMMC启动即可。
3.2. SD烧录nand¶
注意
SD镜像默认使用的是eMMC的设备树,由于eMMC的设备树只初始化eMMC和SD卡,不初始化nand,因此SD卡启动插入nand的板卡无法识别nand,从而无法通过SD烧录nand!
为了解决SD卡启动无法识别nand问题,简单做法可以将nand设备树 imx6ull-nand-npi-lite.dtb
,重命名为 imx6ull-mmc-npi-lite.dtb
,并进行替换,因为nand设备树初始化nand和SD卡,不初始化eMMC。
更名后,可以通过以下几种方式,重新打包、烧录或直接进行替换:
mfgtool工具替换设备树,然后烧录到SD卡。
build_sd_img工具替换设备树,打包SD卡镜像,然后烧录到SD卡。
已经烧录镜像的SD卡,挂载Boot分区直接替换。
以下使用第三种方式,挂载Boot分区直接替换:
1 2 3 4 5 6 7 8 9 10 11 | #SD启动板卡后挂载boot分区
mount /dev/mmcblk0p1 /mnt
#重命名nand设备树为eMMC设备树
mv imx6ull-nand-npi-lite.dtb imx6ull-mmc-npi-lite.dtb
#替换原来设备树
cp -f imx6ull-mmc-npi-lite.dtb /mnt/
#卸载boot分区
umount /mnt
|
3.2.1. 根文件系统安装必要工具¶
需要在buildroot配置项添加以下配置:
1 2 3 4 5 6 | BR2_PACKAGE_MTD=y
BR2_PACKAGE_FREESCALE_IMX=y
BR2_PACKAGE_IMX_KOBS=y
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
BR2_PACKAGE_TAR=y
BR2_PACKAGE_BZIP2=y
|
3.2.2. 烧录脚本说明¶
创建sd_download_nand.sh脚本,脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/bin/sh
#判断是否存在nand设备
if [ ! -b /dev/mtdblock0 ]; then
echo "NandFlash does not exist"
exit 1
fi
#擦除uboot分区并烧录uboot
mount -t debugfs debugfs /sys/kernel/debug
flash_erase /dev/mtd0 0 0
kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 u-boot-nand.imx
#擦除dtb分区并烧录dtb
flash_erase /dev/mtd1 0 0
nandwrite -p /dev/mtd1 imx6ull-nand-npi-lite.dtb
#擦除kernel分区并烧录内核
flash_erase /dev/mtd2 0 0
nandwrite -p /dev/mtd2 zImage
#擦除rootfs分区并烧录rootfs
flash_erase /dev/mtd3 0 0
ubiformat /dev/mtd3
ubiattach /dev/ubi_ctrl -m 3
ubimkvol /dev/ubi0 -Nrootfs -m
mkdir -p /mnt/mtd3
mount -t ubifs ubi0:rootfs /mnt/mtd3
tar -xvf rootfs.tar -C /mnt/mtd3
#拷贝modules到rootfs
mkdir -p /mnt/mtd3/lib/modules
tar axf modules.tar.bz2 -C /mnt/mtd3/lib/modules/
#卸载rootfs分区
sleep 1
sync
umount /mnt/mtd3
sync
echo Update Complete!
#(可选) 将系统心跳灯1s闪烁提示烧录完成
#echo none > /sys/class/leds/cpu/trigger
#while true
#do
# echo 1 > /sys/class/leds/cpu/brightness
# sleep 1
# echo 0 > /sys/class/leds/cpu/brightness
# sleep 1
#done
|
添加执行权限:
1 | chmod 777 sd_download_nand.sh
|
3.2.3. 烧录系统¶
将nand镜像组件和脚本放到同一个目录下,如下所示:
1 2 3 4 5 6 | #查看当前目录文件
ls
u-boot-nand.imx sd_download_nand.sh
imx6ull-nand-npi-lite.dtb zImage
modules.tar.bz2 u-boot-nand.imx
rootfs.tar
|
执行sd_download_emmc.sh脚本将镜像组件烧录到eMMC:
1 2 3 4 5 | #执行烧录
./sd_download_nand.sh
#烧录完成提示
echo Update Complete!
|
烧录完成后切换到nand启动即可。