0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux系统烧写实操

CHANBAEK 来源:嵌入式攻城狮 作者:嵌入式攻城狮 2023-04-18 15:20 次阅读

系统烧写实操

Linux系统烧写初探一文中介绍了mfgtool烧写工具及其工作原理,下面以 I.MX6U-ALPHA EMMC开发板为平台,分别介绍如何烧写 NXP官方系统,以及烧写自制系统

1. 烧写NXP官方系统

烧写 NXP官方的系统到 I.MX6U-ALPHA EMMC开发板(512MB DDR3 + 8G EMMC)中,具体步骤如下:

  • 连接好USB,拨码开关拨到USB下载模式
  • 弹出TF卡,然后按下开发板复位按键
  • 打开MobaXterm串口助手终端
  • 双击mfgtool2-yocto-mx-evk-emmc.vbs
  • 点击Start按钮烧写 NXP 官方系统

烧写过程如下示

图片

MobaXterm串口助手终端上显示的烧写过程

图片

烧写完成后点击Stop按钮停止烧写,点击Exit键退出

图片

拔出USB线,将拨码开关拨到EMMC启动模式,重启后就会从EMMC启动

图片

此时启动后的系统是 NXP给 I.MX6ULL EVK开发板制作的,需要输入用户名,用户名为“root”,没有密码

2. 烧写自制系统

烧写自制系统到 I.MX6U-ALPHA EMMC开发板(512MB DDR3 + 8G EMMC)中。 准备好自制的 uboot、kernel、. dtb 和 rootfs(压缩包)这四个烧写文件,对其进行重命名

##根文件系统 rootfs 打包
cd rootfs/ 
tar -vcjf rootfs.tar.bz2 *

图片

将改名后的uboot、kernel、. dtb 这三个文件拷贝到firmware目录中,替换掉原来的文件

将改名后的所有四个文件拷贝到files目录中

双击mfgtool2-yocto-mx-evk-emmc.vbs文件,打开烧写软件,点击Start按钮即可烧写

图片

烧写完成后从EMMC启动系统,如下图示可见自制系统已经烧写成功

图片

3. 改造烧写工具

3.1 改造Mfgtool

上面是将 NXP官方的系统更换成自制的系统来完成烧写,下面将介绍如何改造 MfgTool工具,让其支持自己的开发板。 改造MfgTool,主要从以下三方面着手

确定系统文件名字:确定系统文件名字是为了兼容不同的产品

图片

新建.vbs文件:复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件,重新按需要命令,比如命名成 mfgtool2-andyxi-emmc.vbs

修改OS Firmware文件夹里的 ucl2.xml文件:改为如下所示内容



    "BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
    "BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
    "Updater" dev="MSC" vid="066F" pid="37FF"/>
class="hljs-name"CFG>
	
  
  <LIST name="eMMC" desc="Choose eMMC as media">
    "BootStrap" type="boot" body="BootStrap" file
    ="firmware/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Loading Ubootclass="hljs-name"CMD>
    "BootStrap" type="load" file="firmware/zImage-andyxi-emmc" address="0x80800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" 
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.class="hljs-name"CMD>
    "BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.class="hljs-name"CMD>
    "BootStrap" type="load" file="firmware/imx6ull-andyxi-emmc.dtb" address="0x83000000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6ULL">Loading device tree.class="hljs-name"CMD>
    "BootStrap" type="jump" > Jumping to OS image. class="hljs-name"CMD>

    
    "Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shellclass="hljs-name"CMD>
    "Updater" type="push" body="$ tar xf $FILE ">Partitioning...class="hljs-name"CMD>
    "Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...class="hljs-name"CMD>

    
    "Updater" type="push" body="$ dd if=/dev/zero
    of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg

    
    "Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">
    access boot partition 1class="hljs-name"CMD>
    "Updater" type="push" body="send" file="files/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">
    Sending u-boot.binclass="hljs-name"CMD>
    "Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">
    write U-Boot to sd cardclass="hljs-name"CMD>
    "Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro">
    re-enable read-only accessclass="hljs-name"CMD>
    "Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">
    enable boot partion 1 to bootclass="hljs-name"CMD>

    
    "Updater" type="push" body="$ while [ ! -e
    /dev/mmcblk%mmc%p1 ]; do sleep 1; echo \\"waiting...\"; done ">Waiting for the partition ready
    "Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">
    Formatting rootfs partitionclass="hljs-name"CMD>
    "Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/>
    "Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>

    
    "Updater" type="push" body="send" file="files/zImage-andyxi-emmc">
    Sending kernel zImageclass="hljs-name"CMD>
    "Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">
    write kernel image to sd cardclass="hljs-name"CMD>

    
    "Updater" type="push" body="send" file="files/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    Sending Device Tree fileclass="hljs-name"CMD>
    "Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
    write device tree to sd cardclass="hljs-name"CMD>
    "Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">
    Unmounting vfat partitionclass="hljs-name"CMD>

    
    "Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">
    Formatting rootfs partitionclass="hljs-name"CMD>
    "Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/>
    "Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
    "Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2" 
    file="files/rootfs-andyxi-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfsclass="hljs-name"CMD>
    "Updater" type="push" body="frf">Finishing rootfs writeclass="hljs-name"CMD>
    "Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partitionclass="hljs-name"CMD>
    "Updater" type="push" body="$ echo Update Complete!">Doneclass="hljs-name"CMD>
class="hljs-name"LIST>
class="hljs-name"UCL>

3.2 烧写测试

MfgTool 工具修改好后就可以进行烧写测试了,将自制的 uboot、linux kernel、和 .dtb 这三个文件拷贝到firmware目录中,替换掉原来的文件; 将所有四个文件拷贝到files目录中

双击 mfgtool2-andyxi-emmc.vbs文件,打开烧写软件,点击“Start”按钮即可烧写。 烧写完成,设置拨码开关为 EMMC 启动,重启开发板,系统启动信息如下图示:

图片

开发板最终卡在 “Starting kernel …”,内核启动失败。 下面介绍如何解决内核启动失败的问题

3.3 解决内核启动失败

仔细观察 uboot 输出的 log 信息,会发现如下图所示的两行信息:

图片

可见在读取设备树文件时就出错了。 重启 uboot,进入到命令行模式,输入如下命令查看 EMMC 的分区 1 里面有没有设备树文件

mmc dev 1 	//切换到EMMC
ls mmc 1:1 	//输出EMMC1分区1中的所有文件

图片

可见此时 EMMC的分区1中是存在设备树文件的,只是名字不同,因此读取 imx6ull-14x14-evk.dtb肯定会出错。 出现这个错误的原因是 uboot里默认的设备树名字是imx6ull-14x14-evk.dtb,解决方法有以下两种:

重新设置 bootcmd环境变量值:在 uboot的命令行模式下,重设 bootcmd 和 bootargs 这两个环境变量的值

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000
			    imx6ull-andyxi-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

修改 uboot源码:上面方法每次重新烧写都要再设置,以下方法只需设置一次,uboot源码 include/configs/mx6ull_andyxi_emmc.h文件里,在宏 CONFIG_EXTRA_ENV_SETTINGS中找到如下所示内容:

"findfdt="\\
"if test $fdt_file = undefined; then " \\
    "if test $board_name = EVK && test $board_rev = 9X9; then " \\
	"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \\
    "if test $board_name = EVK && test $board_rev = 14X14; then " \\
	"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \\
    "if test $fdt_file = undefined; then " \\
	"echo WARNING: Could not determine dtb to use; fi; " \\
"fi;\\0" \\

findfdt 是用于确定设备树文件名字的环境变量, fdt_file环境变量保存着设备树文件名。 上面代码中的两个设备树都是 NXP官方开发板使用的。 因此将 findfdt 值改为如下内容:

"findfdt="\\
"if test $fdt_file = undefined; then " \\
    "setenv fdt_file imx6ull-andyxi-emmc.dtb; " \\
"fi;\\0" \\

修改后重新编译 uboot,然后将新的 uboot烧写到开发板后重启测试,内核启动正常。 至此自制系统烧写完成,并测试成功,开发板可以在没有网络的情况下正常启动

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7438

    浏览量

    258264
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26923
  • 开发板
    +关注

    关注

    25

    文章

    4437

    浏览量

    94084
  • 烧写
    +关注

    关注

    0

    文章

    55

    浏览量

    14119
收藏 人收藏

    评论

    相关推荐

    ok2440linux系统

    用u***linux系统的时候,linux操作系统zImage成功,但是
    发表于 04-27 18:34

    【OK210试用体验】之(二)——Linux系统写和Android HDMI显示

    ` 本帖最后由 郎中令2000年 于 2015-7-21 01:47 编辑 在开箱贴之后,今天帖子的主要内容是对OK210测试板进行Linux系统和Android系统写,并在
    发表于 07-09 14:46

    【OK210试用体验】SDLinux系统

    的。WinPM.EXE在我win7 64位上打开失败,后来在虚拟机中用xp系统写成功。搞开发还是得用xp啊!写过程中可以使用串口查看写过程的。
    发表于 07-26 08:36

    imx287有linux系统有几种方式?

    imx287有linux系统有几种方式
    发表于 10-14 09:44

    TQ210 Linux系统

    :  使用以下命令把linux文件系统镜像下载到开发板的内存中,然后程序会把linux文件系统镜像写到NAND FLASH中。   ./d
    发表于 10-30 16:53

    TQ210 Linux系统

    下命令把linux文件系统镜像下载到开发板的内存中,然后程序会把linux文件系统镜像写到NAND FLASH中。  ./dnw root
    发表于 11-09 10:48

    IMX6开发板学习Linux-QT系统步骤做个笔记

    `平台:迅为-Imx6开发板系统Linux-QT Qt系统写,是使用 MfgTool2 工具,只需要简单的配置下。 打开
    发表于 05-10 14:31

    3399 开发板Linux 系统

    `` Linux 镜像写 平台:iTOP-3399开发板系统Linux 系统 1 RKTool 驱动安装 解 压 光 盘 02 工 具
    发表于 02-14 15:22

    [充电桩计费控制单元主板]如何一键写启动Linux系统

    飞凌嵌入式于日前推出CDZ-335xD充电桩计费控制单元主板,完全符合国网充电桩标准,下面简单的介绍一下如何通过SD卡一键Linux系统。所谓的一键
    发表于 04-13 16:46

    如何编译出一个完整的可以直接写到机器上运行的Linux系统软件?

    如何编译出一个完整的可以直接写到机器上运行的Linux系统软件?
    发表于 12-29 07:03

    Linux系统写DNW报错这是什么问题

    按照Linux 3.0.1用户手册“一键Linux系统”相关内容,在最后一步写时DNW报错:** Unable to read "u-
    发表于 01-13 06:41

    如何linux镜像

    使用tftp下载方式进行镜像的验证,以及使用scp方式来更新linux内核与设备树。STM32CubeProgrammer写方式STM32CubeProgrammer工具已经在前面的章节进行了安装,现在我们可以通过使用这个工具来烧录
    发表于 02-16 06:18

    开发板中装有Linux系统,使用SD卡启动写安卓系统时没有反应怎么解决?

    开发板中装有Linux系统,使用SD卡启动写安卓系统时,没有反应,还是Linux正常启动是怎么回事?
    发表于 11-22 07:50

    元宇宙超写实数字人有哪些用途?

    随着虚拟现实技术的不断发展,元宇宙的概念逐渐走入人们的视野。元宇宙是指一个虚拟的、基于人工智能技术和虚拟现实技术构建的数字世界,其中的超写实数字人是指通过最新的虚拟人物建模技术和摄影技术,制作
    的头像 发表于 04-13 14:33 895次阅读

    数位板的手写实现原理

    数位板的手写实现原理
    的头像 发表于 05-26 11:48 790次阅读