首页 > 其他分享 >【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考

时间:2023-07-04 11:38:59浏览次数:54  
标签:bin uuu boot 烧写 FB 易用 imx6ull 固件

论  坛:http://bbs.100ask.net/(学术答疑)
公 众 号:百问科技


版本

日期

作者

说明

V1

2020

韦东山

技术文档


【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传

公布完好消息,接下来重点谈谈开源烧写工具100ask_imx6ull_Flashing tool。

100ask_imx6ull_Flashing tool由深圳百问网科技有限公司(下称:百问网) 独立开发,版权归百问网所有,并保留对本手册的一切权力。以下内容来自【100ask_imx6ull烧写工具设计与使用说明.docx】。该文档以及100ask_imx6ull_Flashing tool全部源代码都可以从以下网站获取(1或者2均可,内容一样):

  1. https://github.com/100askTeam/gui_for_nxp_uuu
  2. https://weidongshan.coding.net/p/gui_for_nxp_uuu/git (若github下载较慢,可以从国内的coding网站下载)

下面是本文目录,大概5000字,可以收藏再看。

目录

1.为什么要重新开发烧写工具

2.实现原理

3.uuu使用示例

3.1 下载运行裸机程序(uboot也是裸机)

3.2 烧写led.imx到EMMC

4.特制的Uboot

5.EXT4文件系统制作注意事项

5.1 使用Buildroot制作映像文件时

5.2 使用mkfs.ext4制作映像文件时

6.100ASK_IMX6ULL_Flashing_tool使用说明

6.1 基础版:专用于100ASK_IMX6ULL

6.2 专业版:更强大、更灵活、适合所有开发板

7.100ASK_IMX6ULL_Flashing_tool设计前的思考

7.1 基础版

7.1.1 判断设备是否连接:应该全程监测

7.1.2 判断设备的固件是否已经在运行

7.1.3 烧写整个系统

7.1.4 更新内核

7.1.5 更新设备树

7.1.6 更新Uboot

7.1.7 烧写裸机

7.1.8 上传用户文件到根目录

7.2 专业版

7.2.1 判断设备是否连接:应该全程监测

7.2.2 判断设备的固件是否已经在运行

7.2.3 运行固件/裸机

7.2.4 烧写boot/裸机

7.2.5 烧写整个系统

7.2.6 上传任意文件

8.GUI的其他版本

1.为什么要重新开发烧写工具

NXP公司给IMX6ULL开发板提供了烧写工具:mfgtools。它的使用界面如下:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_开发板_02

操作很简单,一键烧写整个映象文件。

但是,缺点也很多:

a. 不能单独烧写bootloader、内核、设备树

或者说,可以实现这些功能,但是需要你去修改xml配置文件,对初学者不友善,对老手也显得麻烦。

b. 烧写速度慢

烧写500M的系统,耗时5分钟(我们的工具可以在1分钟内烧完)。

基于上述缺点,我们决定自己开发烧写工具100ask_imx6ull_flashing_tool,并且完全开源。它有如下特点:

a. 可以烧写整个系统,也可以单独烧写bootloader、内核、设备树

b. 可以上传用户文件到开发板系统中任意目录里

c. 快,烧写速度是原厂工具mfgtools的5倍

d. 支持所有厂家的开发板烧写,注意:不只是支持100ask_imx6ull

它的界面如下,有基础版、专业版两个页面:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_固件_03

2.实现原理

IMX6ULL本身支持USB启动,即PC通过USB线向开发板下载、运行程序。那么我们可以下载一个特殊的程序,这个程序支持:

a. 通过USB线接收PC文件

b. 通过USB线接收PC的命令

c. 根据这些命令烧写板子

所以我们需要2个软件:PC软件、特制的程序。如下图所示(imx6ull boot ROM程序是固化在芯片内部的,设置为USB模式时它就会自动运行):

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_04

一开始,PC软件通过SDP协议向IMX6ULL芯片下载、运行特制的程序,SDP协议是IMX6ULL厂家自己的协议。

特制的程序支持Fastboot协议,这是安卓系统常用的刷机协议。这程序运行起来后,PC软件就通过FB协议与它通信,可以下载文件、发送命令。

特制的程序接收到命令后,就可以去烧写系统。

幸运的是,NXP公司已经提供了PC软件,名为uuu:UniversalUpdate Utility(又名mfgtools 3.0)。

支持Fastboot协议的u-boot也有源码,可惜跟uuu不太适配,需要做很多修改。

我们还实现了通过uuu向u-boot下载文件,通过u-boot烧写FAT、EXT4分区。可惜u-boot并未支持EXT4的某些新特性,所以制作EXT4文件系统时也需要做些修改。

所以我们要做的就是:

a. 修改u-boot,让它跟uuu的配合更顺畅。

b. 修改制作EXT4文件系统的方法,去掉u-boot未支持的特性

c. 编写GUI 界面,使用更方便。

3.uuu使用示例

要给uuu修改配套的u-boot,要给它写GUI,第一件事当然就是熟悉uuu的使用:先用命令行。

uuu的GITHUB地址为:

https://github.com/NXPmicro/mfgtools

里面也有编译好的可执行程序:uuu.exe(Windows用)、uuu(Linux用),还有一个uuu.pdf。

3.1 下载运行裸机程序(uboot也是裸机)

我们在GITHUB中已经有现成的LED裸机程序和uboot,可以直接运行。

首先开发板设置为USB启动模式,不插SD/TF卡,并上电:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_05

然后,按下图操作:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_06

上图中的命令“.\bin\uuu.exe .\files\led.imx”将会执行内嵌的脚本,类似如下命令:

.\bin\uuu.exe SDP: boot -f ".\files\led.imx"

SDP是协议,uuu通过SDP协议跟板子上的bootROM通信;

boot是命令,表示要启动,后面的“-f”表示要启动哪个文件。

你还可以把它写入一个脚本文件,比如led.clst (后缀含义clst:commandlist):

uuu_version 1.2.39

SDP: boot -f “.\files\led.imx”

SDP: done

clst文件中第1行必须写uuu_version,表明它适用的最低版本号。

然后在命令行中执行如下命令,也可以达到同样的效果:

.\bin\uuu.exe led.clst

3.2 烧写led.imx到EMMC

uuu本身没有烧写功能,所以需要借助特制的程序:支持Fastboot协议的uboot。

在GITHUB中我们也提供了该uboot。

开发板设置为USB模式启动,并打开命令行后,可以如下操作把led.imx烧写到EMMC:

.\bin\uuu.exe -b emmc .\firmware\u-boot-dtb_fastboot_100ask.imx .\files\led.imx

命令解析:

a. “-b emmc”:burnemmc,烧写EMMC

b. 需要借助特制的程序:.\firmware\u-boot-dtb_fastboot_100ask.imx

c. 烧写谁?.\files\led.imx

这个命令其实会使用内嵌的脚本来烧写,可以执行“.\bin\uuu.exe -bshow emmc”查看脚本,结果如下:

uuu_version 1.2.39

#@_flash.bin | bootloader

#@_image [_flash.bin] | image burn to emmc, default is the same as bootloader

#This command will be run when i.MX6/7i.MX8MM, i.MX8MQ

SDP: boot -f _flash.bin

#This command will be run when ROM support streammode

#i.MX8QXP, i.MX8QM

SDPS: boot -f _flash.bin

#These commands will be run when use SPL andwill be skipped if no spl

#SDPU will be deprecated. please use SDPVinstead of SDPU

#{

SDPU: delay 1000

SDPU: write -f _flash.bin -offset 0x57c00

SDPU: jump

#}

#These commands will be run when use SPL andwill be skipped if no spl

#if (SPL support SDPV)

#{

SDPV: delay 1000

SDPV: write -f _flash.bin -skipspl

SDPV: jump

#}

FB: ucmd setenv fastboot_dev mmc

FB: ucmd setenv mmcdev ${emmc_dev}

FB: ucmd mmc dev ${emmc_dev}

FB: flash bootloader _image

FB: ucmd if env exists emmc_ack; then ; elsesetenv emmc_ack 0; fi;

FB: ucmd mmc partconf ${emmc_dev} ${emmc_ack} 10

FB: Done

这个脚本支持IMX6、IMX7、IMX8MM、IMX8Q,我们只关心IMX6ULL的话,脚本可以精简为burn_led.clst,内容如下:

uuu_version 1.2.39

SDP: boot -f .\firmware\u-boot-dtb_fastboot_100ask.imx

FB: ucmd setenv fastboot_dev mmc

FB: ucmd setenv mmcdev ${emmc_dev}

FB: ucmd mmc dev ${emmc_dev}

FB: flash bootloader .\files\led.imx

FB: ucmd if env exists emmc_ack; then ; else setenvemmc_ack 0; fi;

FB: ucmd mmc partconf ${emmc_dev} ${emmc_ack} 10

FB: Done

可以看到除了使用SDP协议启动特制的Uboot之外,就是使用FB协议跟这个Uboot通信了。这些FB命令举个例子来讲解:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_固件_07

从这些脚本可知, uuu更多的时候是通过FB协议向Uboot下载文件、发送命令;核心都是Uboot,苦活累活是Uboot做的。

4.特制的Uboot

修改说明有时间再补,主要参考uuu.pdf,还有根据uuu内嵌的脚本添加环境变量。

在GITHU中已经有改好的源码,编译方法如下(你的工具链的PATH可能跟我们的不同,请自行修改):

export ARCH=arm

export CROSS_COMPILE=arm-linux-gnueabihf-

exportPATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

cd uboot-imx_fastboot

cp config_ok .config

make

cp u-boot-dtb.imx u-boot-dtb_fastboot_100ask.imx

所得到的u-boot-dtb_fastboot_100ask.imx文件就是特制的Uboot,我们的烧写工具中已经在firmware目录里放置了该文件。

5.EXT4文件系统制作注意事项

我们的GUI功能强大,可以把PC上的任意文件发给Uboot,再借助它的ext4write命令烧写到板子上的任意目录中。

但是Uboot对EXT4的支持并没有跟得上Linux,比如它不支持新特性:metadata_csum。所以在PC上制作EXT4映像文件时,要去除这个特性。

5.1 使用Buildroot制作映像文件时

在Buildroot源码目录下执行make menuconfig,如下图添加选项即可:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_固件_08

5.2 使用mkfs.ext4制作映像文件时

我们有时候使用mkfs.ext4来制作EXT4映像,有些Linux系统的mkfs.ext4版本比较低,它本来就不支持metadata_csum特性,所以不需要加上特别的选项。经测试:1.43及以下版本的mkfs.ext4不需要做特别设置。

对于高于1.43的mkfs.ext4,制作映像文件时要加上参数“-O ^metadata_csum”,它是禁止metadata_csum的意思,比如:

dd if=/dev/zero of=rootfs.ext4 bs=1024 count=409600

mkfs.ext4 -O ^metadata_csum rootfs.ext4

sudo mount-t ext4 rootfs.ext4 /mnt

sudo tarxjf rootfs.tar.bz2 -C /mnt

sudo umount tmp

6.100ASK_IMX6ULL_Flashing_tool使用说明

100ASK_IMX6ULL_Flashing_tool是uuu工具的GUI前端,操作更便利。从GITHUB下载工具后,在“100ask_imx6ull烧写工具”目录下双击运行“100ask_imx6ull_flashing_tool.exe”。

它有“基础版”、“专业版”两个页面。

“基础版”是专为100ASK_IMX6ULL设计的,点击一下即可完成某项烧写。

“专业版”功能更强大,特别是它可以上传文件到某个分区、某个目录。有些厂家的开发板,zImage和设备树是在第1个分区里的,而100ASK_IMX6ULL的zImage和设备树是在第2个分区里,所以这些厂家的开发板就无法使用基础版来烧写,需要使用专业版,指定分区、指定分区格式、指定路径,然后再上传文件。

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_开发板_09

注意:开发板必须设置为USB模式,如果要用SD/TF卡,必须先上电再插卡;

不能先插卡再上电,不能先插卡再上电,不能先插卡再上电!

6.1 基础版:专用于100ASK_IMX6ULL

接线、设置USB启动的方式如下:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_10

注意:USB串口线可接可不接,接上只是为了观察烧写过程。
注意:设置为USB启动时,先不要接TF卡

板子复位或重新上电后,在APP里操作即可,一个图就可以列清楚所有步骤:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_11

各按钮作用如下:

a. 烧写整个系统:把emmc.img烧到EMMC上,或是把sdcard.img烧到SD/TF卡上;

b. 更新内核:把zImage上传到根文件系统的/boot目录

c. 更新设备树:把100ask_imx6ull-14x14.dtb上传到根文件系统的/boot目录

d. 更新Uboot:把u-boot-dtb.imx烧写到EMMC或SD/TF卡;

e. 烧写裸机:把所选裸机文件,烧写到EMMC或SD/TF卡;

f. 上传文件:把所选用户文件,上传到根文件系统的/目录

6.2 专业版:更强大、更灵活、适合所有imx6ull开发板

专业版的强大在于烧写文件时可以选择任意文件,上传文件时可以指定分区、分区格式、目标路径。用法也很简单,一图足以说明:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_固件_12

有些开发板厂家把内核zImage、设备树放在第1个分区里,它通常是FAT分区。那么可以使用专业版来更新内核、更新设备树。

比如:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_上传_13

几乎所有的开发板的第2个分区都是EXT4格式,我们可以上传文件到它的任意目录下,比如:

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_固件_14

7.100ASK_IMX6ULL_Flashing_tool设计前的思考

7.1 基础版
7.1.1 判断设备是否连接:应该全程监测

执行命令:

./bin/uuu -lsusb

结果中有"SDP" 或 “FB”

7.1.2 判断设备的固件是否已经在运行

执行命令:

./bin/uuu -lsusb

结果中有"FB"

7.1.3 烧写整个系统

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

执行脚本

./bin/uuu scripts/basic/<emmc|sd|...>/write_all.clst

7.1.4 更新内核

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

执行脚本

./bin/uuu scripts/basic/<emmc|sd|...>/write_kernel.clst

7.1.5 更新设备树

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

执行脚本

./bin/uuu scripts/basic/<emmc|sd|...>/write_dtb.clst

7.1.6 更新Uboot

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

执行脚本

./bin/uuu scripts/basic/<emmc|sd|...>/write_boot.clst

7.1.7 烧写裸机

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

a. 根据用户选择,修改脚本,把要烧写的文件名替换进脚本里:

scripts/basic/<emmc|sd|...>/write_noos.clst

b. 执行脚本

./bin/uuu scripts/basic/<emmc|sd|...>/write_noos.clst

7.1.8 上传用户文件到根目录

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

上传方法:

a. 先下载文件:

./bin/uuu FB: download -f <file>

b. 然后设置环境变量:

./bin/uuu FB: ucmd setenv TARGET_FILE <路径> // 根据用户选择设置目标路径

c. 最后执行脚本

./bin/uuu scripts/pro/<emmc|sd|...>/write_user_file.clst

7.2 专业版
7.2.1 判断设备是否连接:应该全程监测

执行命令:

./bin/uuu -lsusb

结果中有"SDP" 或 “FB”

7.2.2 判断设备的固件是否已经在运行

执行命令:

./bin/uuu -lsusb

结果中有"FB"

7.2.3 运行固件/裸机

执行命令 :

./bin/uuu -t 1 <file>

file: 默认是 firmware/u-boot-dtb_fastboot_100ask.imx;用户可选择。

7.2.4 烧写boot/裸机

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

a. 根据用户选择修改脚本

scripts/pro/<emmc|sd|...>/write_boot.clst

b. 执行脚本:

./bin/uuu scripts/pro/<emmc|sd|...>/write_boot.clst

7.2.5 烧写整个系统

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

烧写方法:

a. 根据用户选择修改脚本

scripts/pro/<emmc|sd|...>/write_all.clst

b. 执行脚本:

./bin/uuu scripts/pro/<emmc|sd|...>/write_all.clst

7.2.6 上传任意文件

如果设备的固件未运行: 帮用户运行固件,然后再烧写。

如果设备的固件已经运行: 则可以直接烧写。

上传方法:

a. 先下载:

./bin/uuu FB: download -f <file>

b. 然后设置环境变量:

./bin/uuu FB: ucmd setenv SEL_DEV <EMMC | SD | NAND>

./bin/uuu FB: ucmd setenv PART <1|2|...> // 根据用户选择设置分区

./bin/uuu FB: ucmd setenv FSTYPE <FAT/EXT4> // 根据用户选择设置分区格式

c. 最后执行脚本

./bin/uuu scripts/pro/<emmc|sd|...>/write_user_file.clst

8. GUI的其他版本

我们的学员很厉害,我们刚发布第1版时,功能很简单,不能选择文件。是学员做出了QT版本的GUI,可以选择文件。

【开源共享】全网最简单易用的imx6ull烧写工具设计初衷&工作原理&设计前的思考_开发板_15

受此启发,我们才做出了专业版。

这位学员说,他正在Ubuntu下调试GUI,搞定后也会公开源码。

敬请期待。

-END-


标签:bin,uuu,boot,烧写,FB,易用,imx6ull,固件
From: https://blog.51cto.com/weidongshan/6618379

相关文章

  • 万事开头难 - 介绍IMX6ULL启动方式
    交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)交流群二:QQ群:536785813(单片机-嵌入式)公 众 号:百问科技版本日期作者说明V12020韦东山技术文档不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要。若不了解清楚启动方式,后面的所有开发工作便......
  • Linux系统驱动之编程_配置LCD控制器_基于IMX6ULL
    资料下载coding无法使用浏览器打开,必须用git工具下载:gitclonehttps://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git视频观看百问网驱动大全编程_配置LCD控制器_基于IMX6ULL参考资料,GIT仓库里:芯片资料IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULL......
  • Linux系统驱动之编程_配置引脚_基于IMX6ULL
    资料下载coding无法使用浏览器打开,必须用git工具下载:gitclonehttps://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git视频观看百问网驱动大全编程_配置引脚_基于IMX6ULL参考资料,GIT仓库里:芯片资料IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULLRM.pd......
  • Linux系统驱动之分析内核自带的LCD驱动程序_基于IMX6ULL
    资料下载coding无法使用浏览器打开,必须用git工具下载:gitclonehttps://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git视频观看百问网驱动大全分析内核自带的LCD驱动程序_基于IMX6ULL参考资料,GIT仓库里:IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULLR......
  • 【调试笔记】韦东山:在100ASK_IMX6ULL板子上支持其他型号的屏幕
    论  坛:http://bbs.100ask.net/(学术答疑)公 众 号:百问科技版本日期作者说明V12020韦东山技术文档在100ASK_IMX6ULL板子上支持其他型号的屏幕1.在100ASK_IMX6ULL底板上如何接其他厂家的屏幕很多学员有过STM32的学习经验,他们手上的开发板很多,LCD也很多。一个LCD还挺贵的,不能浪......
  • 让开源项目从易用到好用 | 亚马逊的开源文化
    亚马逊的领导力准则是亚马逊文化的核心,它如同亚马逊的DNA融入贯穿每一个重要决策,深深影响着每一位亚麻人、影响着每一位亚马逊的客户、合作伙伴以及每一位亚马逊云科技的构建者。同时,亚马逊的领导力准则对亚马逊与开源的互动方式也产生着深远的影响。亚马逊云科技开发者社区......
  • 烧写文件系统——韦东山嵌入式Linux学习笔记11
    原文:https://blog.csdn.net/longintchar/article/details/71319513本文实验环境:1.windows7(64bit)2.JZ2440(V2)使用u-boot烧写文件系统,一般有两种方法。1.通过USB下载功能2.通过TFTP功能通过USB下载功能烧写文件系统这种方法比较简单。操作步骤:(1)连接板子和PC(串口+USB)(2)进入u-......
  • SeaTunnel 发布成为 Apache 顶级项目后首个版本 2.3.2,进一步提高 Zeta 引擎稳定性和易
    近日,ApacheSeaTunnel正式发布2.3.2版本。此时距离上一版本2.3.1发布已有两个多月,期间我们收集并根据用户和开发者的反馈,在2.3.2版本中对SeaTunnelZetaEngine进行了Bug修复,提高了引擎的稳定性和使用效率。此外,新版本还对Connector-V2中的连接器进行了功能和性......
  • c# MODBUS协议源码 上/下位机源码烧写Flash工具 资料包含:
    c#MODBUS协议源码上/下位机源码烧写Flash工具资料包含:1、C#上位机源码2、上位机源码包含MODBUS协议源码3、下位机......
  • ESXI的备份,备份虚拟机以防万一,简单易用版(还原篇)
    继上篇的备份完虚拟机的基础之上,这篇说说如何还原esxi虚拟机一、打开备份管理 新建还原 选择来源 选择对应的虚拟机 点确定就进入还原阶段。......