系统烧写实操

在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文件:改为如下所示内容

<!-- 修改后的 ucl2.xml 文件 -->
<UCL><CFG><STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/><STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/><STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/></CFG><!-- 向 EMMC 烧写系统 --><LIST name="eMMC" desc="Choose eMMC as media"><CMD state="BootStrap" type="boot" body="BootStrap" file="firmware/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD><CMD state="BootStrap" type="load" file="firmware/zImage-andyxi-emmc" address="0x80800000"loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD><CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD><CMD state="BootStrap" type="load" file="firmware/imx6ull-andyxi-emmc.dtb" address="0x83000000"loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"ifdev="MX6ULL">Loading device tree.</CMD><CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD><!-- create partition --><CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD><CMD state="Updater" type="push" body="$ tar xf $FILE ">Partitioning...</CMD><CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD><!-- burn uboot --><CMD state="Updater" type="push" body="$ dd if=/dev/zeroof=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD><!-- access boot partition --><CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD><CMD state="Updater" type="push" body="send" file="files/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD><CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD><CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access</CMD><CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD><!-- create fat partition --><CMD state="Updater" type="push" body="$ while [ ! -e/dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD><CMD state="Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD><CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/><CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/><!-- burn zImage --><CMD state="Updater" type="push" body="send" file="files/zImage-andyxi-emmc">Sending kernel zImage</CMD><CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD><!-- burn dtb --><CMD state="Updater" type="push" body="send" file="files/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD><CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">write device tree to sd card</CMD><CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD><!-- burn rootfs --><CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD><CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/><CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/><CMD state="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 rootfs</CMD><CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD><CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD><CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD></LIST>
</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 83000000imx6ull-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烧写到开发板后重启测试,内核启动正常。至此自制系统烧写完成,并测试成功,开发板可以在没有网络的情况下正常启动

关注公众号,发送 “mfgtool”,即可获取 mfgtool相关资料

Linux 系统烧写实操相关推荐

  1. (网络编程)linux系统的远程操做

    目录 一.配置Ubantu 1.打开vmware,在对应的虚拟机选择桥接模式 2.在虚拟机内进行配置 3.打开ubantu的ssh服务 二.使用远程控制操作虚拟机 1.使用ftp连接虚拟机 (1).U ...

  2. tiny4412安装Linux系统,FriendlyARM Tiny 4412开发板烧写Linux系统步骤

    一.制做用于安装系统的SD卡 通常Tiny4412出厂时已经安装好Android4.2.2系统,之后要从新烧写系统,则须要SD卡来烧写系统,不管是经过USB烧写,仍是SD卡脱机烧写,都须要使用SD卡启 ...

  3. 一、烧写最小linux系统

    一.概述 开发板不仅可以运行Android和Qt,还可以运行最简单的Linux最小文件系统,最小系统有一下特点: "麻雀虽小五脏俱全",便于学习 不能够实现图形界面 二.搭建准备 ...

  4. X210烧写linux系统

    准备: x210开发板 USB OTG线 串口线 一张SD卡 windows PC 说明: 开发板里面已经有系统,为wince系统,wince系统的调试串口是UART0 准备烧写为linux系统,调试 ...

  5. Linux比windows生态好,试装国产统一系统UOS:操作比Windows更简便,但生态依然是缺点,...

    试装国产统一系统UOS:操作比Windows更简便,但生态依然是缺点, 众所周知,前段时间网上传出了一则好消息,那就是国产操作系统厂商们似乎联合起来了,不再各自为战,而是力往一处使,推出统一的操作系统 ...

  6. 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410

    作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...

  7. tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)

    硬件平台:tiny4412 系统:linux-3.5-20151029 文件系统:busybox-1.22.1.tar.bz2 编译器: arm-linux-gcc-4.5.1 目的: 使用uboot ...

  8. 使用dd命令烧写linux系统到sd卡

    基于S3c2416 http://www.industech.com.cn (uboot-1.3.4) 一:明白uboot怎么到sd卡的原理概述: 1:首先明白开发板从sd卡的什么部分读取引导安装程序 ...

  9. tq210 定制linux内核,TQ210 烧写Linux系统

    硬件平台:TQ210v6开发板 把SD卡插到PC机上,对SD卡进行快速格式化. 在虚拟机的右下角,有个类似u盘或者硬盘的图标,点击它选择连接,这样就可以把SD卡连接到虚拟机的Linux系统中. 在虚拟 ...

最新文章

  1. python列表按值排序_json的python排序列表(按值)
  2. 深度 | AI掘金,非富即亡
  3. 帝豪gs车机系统wince_有了帝豪GS,生活变得越来越好,很不错
  4. javascript 之----eval的用法
  5. 【测试点5】1007 Maximum Subsequence Sum (25 分)
  6. SQLServer学习笔记系列4
  7. python中list index out of range_Python知识精解:str split()方法
  8. Android深度探索第五章总结
  9. 自助出版风靡美国的7个理由(转载)
  10. 计算机制图的简称市什么,计算机地的图制图复习题.doc
  11. VM安装rhel或linux后,声音很响,如何关闭
  12. 03.学习笔记-Linux下根目录介绍
  13. openDrive has Free Direct Linking !
  14. 腾讯地图api php经纬度转换地址,腾讯地图经纬度转换为百度地图经纬度PHP类
  15. 算法 - 差分进化(DE)算法
  16. 最大流 Ford-Fulkerson 算法
  17. 超声波测距原理与实现
  18. 《剑指Offer》之“平衡二叉树”
  19. (145)光线追踪距离场柔和阴影
  20. android 仿微信选取相册_Android--选择图片(仿微信发朋友圈)第一篇

热门文章

  1. Android宫格动态列,在Android app中实现九(n)宫格图片连续滑动效果
  2. java毕业设计在线家教预约系统Mybatis+系统+数据库+调试部署
  3. HM-3210:创建一个六边形网格使用表面
  4. 工作面试:工作交接(5)
  5. buuctf-ZJCTF,不过如此
  6. SR-ITM--融合超分辨率和逆色调映射(二)
  7. Paper简读 - ProGen: Language Modeling for Protein Generation
  8. Hive从入门到放弃——HiveQL表级别DDL设计的艺术性(五)
  9. 基础007_FIFO原理
  10. VS Code 插件 在线/离线 下载安装VUE