【開源共享】全網最簡單易用的imx6ull燒寫工具設計初衷&工作原理&設計前的思考

在開源燒寫工具之前,有件事必須溫馨提示一下:

1. 感謝衆多學員的支持,年前生產的100ASK_IMX6ULL開發板全部售完。預計3月15日有現貨。

100ASK_IMX6ULL開發板質量槓槓的,一個硬件BUG都沒有。

受疫情影響,生產受阻。

爲答謝願意等待的客戶,預售期間, 提質不提價: CPU主頻由528MHZ提升爲792MHZ

預售結束後提價20元。

現在購買仍然可以享受【發朋友圈減20】的優惠:349元可以買到792MHZ主頻的imx6ull板子。物美價廉。

如果不是疫情影響,我們也不想推792MHZ的版本,畢竟還要貴20元,因爲我們要做的是物美價廉的精品。

528MHZ對於學習沒有任何差別,

工作時肯定優先選擇528MHZ的:供應足,價格低,隨時有貨。

對於老客戶:

CPU主頻由528MHZ提升爲792MHZ,效果並沒有很大差別,

有這時間您都可以學完很多內容了。

對於新客戶:

3月15日左右發的開發板CPU主頻由528MHZ提升爲792MHZ,預售期間不加價;

預售結束後提價20元。

2.IMX6ULL芯片從2017年發佈,已經3年了。

各廠家用的還是原廠配的mfgtools,燒寫500M的映象文件至少5分鐘,太慢了

升級內核、升級設備樹時,需要給開發板接網線、開Ubuntu,步驟太複雜。

誰能改進?這要對GUI、Uboot、文件系統製作都有深入研究。

我們推出的“100ask_imx6ull_flashing_tool”,

不管是操作方面還是下載速度都秒殺mfgtools, 燒寫500M映像文件只需要1分鐘,快了5倍!

有傻瓜化操作的基礎版,簡單易用,一鍵燒寫、更新,

有專業版,支持所有同行IMX6ULL板子,支持更多操作:運行裸機、上傳任意文件。

重點:完全開源

請問誰家有此實力?

3.你以爲只有這些?遠遠不止…

近30多個裸機實驗即將發佈,EMMC裸機編程、SD卡裸機編程....

看完這些裸機源碼/文檔,您肯定可以掌握複雜的EMMC、SD卡協議。

100ask_imx6ull預售購買鏈接&產品介紹:

http://100ask.taobao.com (點開店鋪首頁的第一張海報即可進入購買頁面)

在這裏插入圖片描述

公佈完好消息,接下來重點談談開源燒寫工具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。它的使用界面如下:

在這裏插入圖片描述

操作很簡單,一鍵燒寫整個映象文件。

但是,缺點也很多:

a. 不能單獨燒寫bootloader、內核、設備樹

或者說,可以實現這些功能,但是需要你去修改xml配置文件,對初學者不友善,對老手也顯得麻煩。

b. 燒寫速度慢

燒寫500M的系統,耗時5分鐘(我們的工具可以在1分鐘內燒完)。

基於上述缺點,我們決定自己開發燒寫工具100ask_imx6ull_flashing_tool,並且完全開源。它有如下特點:

a. 可以燒寫整個系統,也可以單獨燒寫bootloader、內核、設備樹

b. 可以上傳用戶文件到開發板系統中任意目錄裏

c. 快,燒寫速度是原廠工具mfgtools的5倍

d. 支持所有廠家的開發板燒寫,注意:不只是支持100ask_imx6ull

它的界面如下,有基礎版、專業版兩個頁面:
在這裏插入圖片描述

2.實現原理

IMX6ULL本身支持USB啓動,即PC通過USB線向開發板下載、運行程序。那麼我們可以下載一個特殊的程序,這個程序支持:

a. 通過USB線接收PC文件

b. 通過USB線接收PC的命令

c. 根據這些命令燒寫板子

所以我們需要2個軟件:PC軟件、特製的程序。如下圖所示(imx6ull boot ROM程序是固化在芯片內部的,設置爲USB模式時它就會自動運行):
在這裏插入圖片描述

一開始,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卡,並上電:
在這裏插入圖片描述

然後,按下圖操作:
在這裏插入圖片描述

上圖中的命令“.\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命令舉個例子來講解:
在這裏插入圖片描述

從這些腳本可知, 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,如下圖添加選項即可:
在這裏插入圖片描述

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個分區裏,所以這些廠家的開發板就無法使用基礎版來燒寫,需要使用專業版,指定分區、指定分區格式、指定路徑,然後再上傳文件。
在這裏插入圖片描述

注意:開發板必須設置爲USB模式,如果要用SD/TF卡,必須先上電再插卡;

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

6.1 基礎版:專用於100ASK_IMX6ULL

接線、設置USB啓動的方式如下:

在這裏插入圖片描述

注意:USB串口線可接可不接,接上只是爲了觀察燒寫過程。
注意:設置爲USB啓動時,先不要接TF卡

板子復位或重新上電後,在APP裏操作即可,一個圖就可以列清楚所有步驟:
在這裏插入圖片描述

各按鈕作用如下:

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開發板

專業版的強大在於燒寫文件時可以選擇任意文件,上傳文件時可以指定分區、分區格式、目標路徑。用法也很簡單,一圖足以說明:
在這裏插入圖片描述

有些開發板廠家把內核zImage、設備樹放在第1個分區裏,它通常是FAT分區。那麼可以使用專業版來更新內核、更新設備樹。

比如:
在這裏插入圖片描述

幾乎所有的開發板的第2個分區都是EXT4格式,我們可以上傳文件到它的任意目錄下,比如:
在這裏插入圖片描述

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,可以選擇文件。
在這裏插入圖片描述

受此啓發,我們才做出了專業版。

這位學員說,他正在Ubuntu下調試GUI,搞定後也會公開源碼。

敬請期待。

-END-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章