在開源燒寫工具之前,有件事必須溫馨提示一下:
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均可,內容一樣):
- https://github.com/100askTeam/gui_for_nxp_uuu
- 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-