查看: 2547|回复: 4

【我心中的i.MX6ULL】+制作SD卡启动镜像

[复制链接]
  • TA的每日心情

    2021-2-4 09:24
  • 签到天数: 190 天

    [LV.7]常住居民III

    38

    主题

    591

    帖子

    28

    金牌会员

    Rank: 6Rank: 6

    积分
    2193
    最后登录
    2023-12-1
    发表于 2022-3-11 22:57:52 | 显示全部楼层 |阅读模式
    本帖最后由 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镜像
    安装必要的软件
    1. sudo apt-get install dosfstools dump parted kpartx
    复制代码

    建立工作目录
    1. mkdir myimg
    2. cd myimg
    3. mkdir boot #这个文件夹用于挂载内核的分区
    4. mkdir root #这个文件夹用于挂载文件系统分区
    复制代码
    复制需要的文件
    1. <blockquote>u-boot.imx  #uboot文件
    复制代码

    复制文件完成后工作目录下面的内容


    创建空白的img镜像文件首先要知道系统固件的大小,计算方式为 600M+rootfs大小,如果我们的文件系统是压缩包的话,需要先知道文件系统的大小,可以先解压到一个文件夹,然后使用 du rootfs_dir -s -h 命令查看文件夹大小。

    文件系统大小为243M,所以整个系统需要大于600+243M,我们为了方便直接创建一个1G大小的镜像
    1. 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文件进行分区
    1. sudo parted imx6ull.img --script -- mklabel msdos
    2. sudo parted imx6ull.img --script -- mkpart primary fat32 20480s 1044479s
    3. 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
    文件系统的结束地址不填


    将镜像文件虚拟成块设备
    1. sudo losetup -f --show imx6ull.img
    复制代码

    这一步操作完成后,需要将/dev/loop0记录下来,后面的步骤需要使用
    这里我们的 /dev/loop0 就是我们的镜像文件,可以进行操作,但是这里还看不到我们的分区信息,没法对里面的分区进行操作,所以还需要挂载虚拟文件系统
    1. sudo kpartx -va /dev/loop0
    复制代码


    格式化块设备并且挂载
    1. sudo mkfs.vfat /dev/mapper/loop0p1        #建立文件系统 存放 kernel dtb
    2. sudo mkfs.ext4 /dev/mapper/loop0p2        #建立文件系统 存放 rootfs
    复制代码


    无标题.png
    mount 挂载
    我们在之前已经创建了 boot 和 root 文件夹,将两个分区挂载到对应的文件夹
    1. sudo mount /dev/mapper/loop0p1 ./boot/
    2. sudo mount /dev/mapper/loop0p2 ./root/
    复制代码
    想退出的话,可以使用 kpartx -dv /dev/loopX 写卸载刚才挂接的东西。然后再使用losetup -d /dev/loopX断掉和映像文件的挂接关系。


    挂载以后,我们可以直接操作对应的文件夹,直接将文件复制到对应的挂在文件夹即可
    1. sudo dd if=u-boot.imx of=/dev/loop0 bs=512 seek=2 conv=fsync       #拷贝uboot
    复制代码

    文件复制过去后,一个完整的镜像基本实现了,接下来取消挂载后就有一个可用的镜像了
    1. sudo umount ./boot ./root
    2. sudo kpartx -d /dev/loop0
    3. sudo losetup -d /dev/loop0
    复制代码


    这时候我们之前创建的imx6ull.img就是一个完整的镜像,我们将其复制到wim系统下面,将内存卡用读卡器连接到电脑,用Win32 Disk Imager 将其烧写进SD卡即可,烧写完成后换上新的SD卡到开发板,新的系统就可以开始运行了。


    SD卡烧写在量产的时候非常有用,可以在SD卡内置系统,然后启动板子,将SD卡里面的镜像烧写到EMMC中,比USB烧写的效率会高很多。

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    45

    帖子

    0

    注册会员

    Rank: 2

    积分
    51
    最后登录
    2024-3-13
    发表于 2022-3-11 23:18:13 | 显示全部楼层
    支持一下,大佬这么晚还在分享干货。i.MX6ULL这个真的是个小钢炮啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2022-3-14 09:29:30 | 显示全部楼层
    支持下支持下
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-2-13 20:26
  • 签到天数: 178 天

    [LV.7]常住居民III

    0

    主题

    216

    帖子

    0

    高级会员

    Rank: 4

    积分
    728
    最后登录
    2023-9-7
    发表于 2022-3-14 12:42:27 | 显示全部楼层
    请问那官方wic文件怎么使用呢,我用dd命令写进SD卡,运行起来一直重启
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 22:46
  • 签到天数: 1211 天

    [LV.10]以坛为家III

    22

    主题

    4765

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8085

    活跃会员

    最后登录
    2024-4-26
    发表于 2022-3-17 11:11:20 | 显示全部楼层
    很详细,学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 12:50 , Processed in 0.123507 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表