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启动即可。