本帖最后由 mzy2364 于 2022-3-11 22:57 编辑
之前用过很多IMX6ULL的开发板,都是板载的EMMC,程序的更新都是通过USB实现的,USB程序的刷写优点是方便易用,也是开发中用的最多的一种方式,但是如果固件太大的话更新时间会很长。 我手上这个IMX6ULL-EVK开发板板载了SD卡作为系统启动的载体,而且EMMC和NAND FLASH都没有焊接,所以默认也是选择SD卡进行启动,程序的更新是通过读卡器将固件烧写到内存卡中,然后启动系统,玩过树莓派的朋友都知道,系统是一个img文件,里面包含了uboot、kernel以及文件系统,只需要使用Win32DiskImager等软件就可以将系统烧写到SD卡,这种方式也更适合分享系统给其他人,我们开发IMX6ULL程序的时候也可以采取这种方式,这里分享下制作SD卡启动镜像的过程。 uboot、内核和文件系统的编译就不说了,有很多坛友也分享过了,在制作系统镜像前,需要提前编译好uboot、kernel、设备树、文件系统。 首先来看下img文件里面的分区情况,这个跟实际我们烧写的系统分区情况是一样的,我们参考NXP的mfgtools工具里面的mksdcard.sh文件,这个是用于USB烧写系统到SD卡的,这个脚本的内容告诉了我们分区情况: 我们的分区内容跟mksdcard.sh保持一致,实际上内核可能需要的空间很小,我们再熟悉步骤以后再自由更改。
USB烧写SD卡的步骤就是将系统先下载到RAM里面,然后初始化SD卡并且分区,然后将对应的文件拷贝到对应的分区里面,我们在电脑上制作img镜像,步骤是一样的:
1、根据固件的大小建立一个合适的 img 空文件并且对其进行合理的分区
2、将img文件挂载到linux系统中,这样后续的操作就和操作系统的某个硬盘一样
3、复制对应的文件,复制uboot、内核设备树和文件系统
4、取消挂载得到对应的镜像文件,用于烧写
下面开始制作img镜像
安装必要的软件
- sudo apt-get install dosfstools dump parted kpartx
复制代码
建立工作目录
- mkdir myimg
- cd myimg
- mkdir boot #这个文件夹用于挂载内核的分区
- mkdir root #这个文件夹用于挂载文件系统分区
复制代码 复制需要的文件
- <blockquote>u-boot.imx #uboot文件
复制代码
复制文件完成后工作目录下面的内容
创建空白的img镜像文件首先要知道系统固件的大小,计算方式为 600M+rootfs大小,如果我们的文件系统是压缩包的话,需要先知道文件系统的大小,可以先解压到一个文件夹,然后使用 du rootfs_dir -s -h 命令查看文件夹大小。
文件系统大小为243M,所以整个系统需要大于600+243M,我们为了方便直接创建一个1G大小的镜像
- dd if=/dev/zero of=imx6ull.img bs=512 count=2097152
复制代码
of=imx6ull.img 表示输出文件为 imx6ull.img
bs=512 扇区是 512 字节
count=2097152 表示扇区的数量 1G/512Byte=2097152
到这里我们的空镜像文件就已经创建好了
对img文件进行分区
- sudo parted imx6ull.img --script -- mklabel msdos
- sudo parted imx6ull.img --script -- mkpart primary fat32 20480s 1044479s
- sudo parted imx6ull.img --script -- mkpart primary ext4 1228800s -1
复制代码 fat32 文件系统类型为 fat32 这是内核设备树的文件系统
20480s 这个表示内核设备树扇区的起始地址(注意不是实际地址,扇区地址x扇区大小=实际地址),这个分区紧跟在 10M 的 u-boot 空间后面,地址为 10x1024x1024/512 = 20480
1044479s 内核设备树扇区的结束地址=扇区起始地址+扇区大小-1,20480+50010241024/512-1 = 1044479
ext4 文件系统为 ext4 这是根文件系统的
1228800s 文件系统的扇区起始地址 600x1024x1024/512 = 1228800
文件系统的结束地址不填
将镜像文件虚拟成块设备
- sudo losetup -f --show imx6ull.img
复制代码
这一步操作完成后,需要将/dev/loop0记录下来,后面的步骤需要使用
这里我们的 /dev/loop0 就是我们的镜像文件,可以进行操作,但是这里还看不到我们的分区信息,没法对里面的分区进行操作,所以还需要挂载虚拟文件系统
- sudo kpartx -va /dev/loop0
复制代码
格式化块设备并且挂载
- sudo mkfs.vfat /dev/mapper/loop0p1 #建立文件系统 存放 kernel dtb
- sudo mkfs.ext4 /dev/mapper/loop0p2 #建立文件系统 存放 rootfs
复制代码
mount 挂载
我们在之前已经创建了 boot 和 root 文件夹,将两个分区挂载到对应的文件夹
- sudo mount /dev/mapper/loop0p1 ./boot/
- sudo mount /dev/mapper/loop0p2 ./root/
复制代码 想退出的话,可以使用 kpartx -dv /dev/loopX 写卸载刚才挂接的东西。然后再使用losetup -d /dev/loopX断掉和映像文件的挂接关系。
挂载以后,我们可以直接操作对应的文件夹,直接将文件复制到对应的挂在文件夹即可
- sudo dd if=u-boot.imx of=/dev/loop0 bs=512 seek=2 conv=fsync #拷贝uboot
复制代码
文件复制过去后,一个完整的镜像基本实现了,接下来取消挂载后就有一个可用的镜像了- sudo umount ./boot ./root
- sudo kpartx -d /dev/loop0
- sudo losetup -d /dev/loop0
复制代码
这时候我们之前创建的imx6ull.img就是一个完整的镜像,我们将其复制到wim系统下面,将内存卡用读卡器连接到电脑,用Win32 Disk Imager 将其烧写进SD卡即可,烧写完成后换上新的SD卡到开发板,新的系统就可以开始运行了。
SD卡烧写在量产的时候非常有用,可以在SD卡内置系统,然后启动板子,将SD卡里面的镜像烧写到EMMC中,比USB烧写的效率会高很多。
|