記一次失敗的探索經歷,失敗不可怕,過程有價值
1、前言
熟悉我的朋友會知道,我是一個追求新奇而且做事情比較極致的人,我所追求的不是完美,而是探索過程那一種酣暢淋漓的快感,沉迷于那種思維的鍛煉,比如前面這篇:由一個編譯參數引發的gn構建依賴圖譜查詢,這次我又碰到一個感興趣的東西了,然后一發不可收拾,等研究結束一天就那么過去了。那么這次又是碰到什么讓我值得探索的東西,且看后文。
2、Hi3861的Flash讀寫
眾所周知,在Hi3861芯片里面是支持flash讀寫的,相應的api長這樣:
那么使用這樣的接口很容易就做出來一個簡單的存取flash的demo,比如這樣:
這樣的程序就能實現寫入flash和讀取flash內容,那么此時問題就出現了
- 這樣寫入的數據重新燒錄固件就不見了,在平時調試的時候,或者假如產品返廠維修的時候就會丟失數據,這顯然是不行的
- 在產品生產的時候,往往要些一些數據進行產測或者置入一些SN碼等等內容,或者單純就是有一份內容想要提前寫到flash里讓系統一開機就讀取應該怎么辦?
現在首先來解決這樣兩個問題。
3、嘗試利用Hiburn燒錄工具解決第一個問題
打開Hiburn軟件,仔細觀察Hiburn的界面,會發現這樣一些內容:
想起來有一個HiBurn軟件的使用手冊,結果在電腦里面翻箱倒柜的真的被我找出來到了,馬上查閱數據手冊(手冊放在下載附件內):
Burn Size就是管控擦除的flash長度的,所以一個問題的解決辦法就是:每次燒錄的自己指定一個BurnSize比如可以跟固件的FileSize一致,如下:
但是實際效果發現此種方法卻不行,及時手動改了BurnSize,最后在燒錄的時候還會被強制恢復成,2097152,這個值其實就是Hi3861的Flash大小(2M),所以此方法失敗。
最后經過一番摸索,也沒找到有什么辦法,所以第一個問題暫時就先放一邊吧。
4.嘗試利用Hiburn燒錄工具解決第二個問題
設想如下一個場景:我的設備開機的時候,需要讀取一傳SN碼,然后利用SN碼去物聯網平臺去注冊或者登錄設備。
那么要實現這樣的功能,有一種方法就是提前在產線燒錄階段將SN等信息燒錄到芯片內部,這里我們再次使用官方的HiBurn工具,在手冊中有這樣一句話:
這里的參數文件暫時還不知道是什么意思,根據以往個嵌入式開發經驗,這里我暫且理解成一個文本文件吧,所以這里制作一個測試文件:
將這樣的文件跟固件文件一起放在Biburn軟件里,固件端的代碼如下:
然后需要設置test.txt文件燒錄地址和大小,另外設置燒錄文件類型為2,如下(注意此種方法需要兩次點擊Select File按鈕):
這樣執行燒錄的時候最后可以看到這樣的日志:
這樣就完成了,串口日志看一下:
因為是按%02x方式打印的,所以是ascii的二進制形式,對比一下源文件就可以知道讀出的就是剛剛寫入的內容。
到這里第二個問題算是解決成功。
5、事情并沒有完結
這里如果只想解決第二個問題,問題就已經完事了,然而這里我又產生了新的思考,用這樣的方式燒錄固件太繁瑣,有沒有一種自動化的方式呢?
這里我就回想起來,Devco Tools可以使用命令行的方式來下載固件,看一看是怎么實現的,然后下載了新版的Devco Tools,按照以往經驗不去執行安裝,直接解壓出來,卻沒有發現HiBurn.exe軟件,然后沒有思考為何沒有HiBurn軟件了,直接去下載舊版的Devco Tools,找到了那個Birun的腳本文件,大概這樣:
這里是用命令行執行Hiburn.exe,然后這里有一些參數,查看文檔:
這里,用一個Demo的指令下載一次固件看看,結果不出意外的成功了。
但是有一個問題,這樣確實可以自動化下載固件,但是額外的文件呢?
可以看到Hiburn.exe文檔里面沒有說有燒錄額外的文件的說明,此時有一種想法:有沒有可能是軟件里面實現了但是沒在文檔里寫出來呢?
6、查看Hiburn的"源碼"
因為Hiburn軟件是直接發布的一個exe文件,所以我們是沒有源碼的,但是用一些技術手段可以看到源碼,那就是用16進制編輯器查看,比如我用的Sublime Txt 4安裝Hex Viewer,把HiBurn.exe文件導入進來,是這樣的界面:
這東西看起來沒有用啊?
那只是你的誤解,在我這里,哪怕是一個逗號,一個字母都是有用的.根據手冊得知,指令用了com.bin等這樣的字段,那么搜索到這個地方就可以查看到是不是有相關提示,一樣還真搜到了:
結果比較失望,發現竟然沒有額外的指令支持了,所以這種方失敗。
7、新版的Devco Tools為什么沒有Hiburn軟件了
回到前面那里,在新版的Devco Tools并沒有發現HiBurn.exe這個程序了,但是依然能夠實現下載Hi3861的固件燒錄,這是怎么回事了,一起來探索這件事.
一番探索,結果發現,新版的Devco Tools使用一個新的方式來下載固件,就是這個hiburn.jar:
點擊了這個連接之后,下載得到一個壓縮包,經過層層解壓,終于得到hiburn.jar文件,然后找到一個文檔:
jar文件需要一個java環境才能執行,所幸的是壓縮包內自帶了一個jre環境,所以制作一個這樣的指令就可以燒錄固件了:
8、使用Hiburn.jar如何下載附加的文件?
使用hiburn.jar --help查看一下所支持的指令:
看了一下,還是沒有找到如何下載額外flash文件的方式,這時候突然想到,會不會仍然是文檔和手冊沒寫,而實際上產品實現了呢,看了這里你可能會想,再用16進制編輯器看內容唄,哈哈,錯啦!
因為我們這次是用的jar文件,我們就需要反編譯jar文件,這里教大家一個簡單的方式,把jar文件用解壓軟件解壓,然后再用vscode來打開文件夾,安裝Decompile擴展:
在打開的.class文件上右鍵,選擇decompile,就可以出現反編譯的java文件了:
打開這個文件一看,有一個指令寫了:
看來是支持按地址下載的方式的,看起來好像跟之前的hiburn.exe里面下載文件的方式比較像,就試試看:
直接就成功了,這肯定有問題,然后一邊查看源碼,一邊又試了很多方法:
可以看到,這種方式都不行。
所以,結論就是這種方式也是失敗。
9、總結
寫了這么多,總結起來就是:一次失敗的探索經歷,但是經過這次失敗的經歷我想到了幾點:
- 都說要國產芯片崛起,真正要國產崛起不只是把芯片做出來,而是也要用心做出好用的腳手架和上下游工具,包括要設想到各種量產啊,測試的場景。
- 根據之前的探索Hi3861芯片只能做一點無狀態的產品,或者當一個無線網絡使用,這樣的flash管理做不了什么高級的產品了。
- 希望官方看到這個帖子之后能夠思考一下看能否把我的這幾個需求解決掉,可以選擇性燒錄固件的地址和提供額外燒錄flash文件的自動化方式。
好了,今天的分享就到這里,希望能對大家有用。
文章相關附件可以點擊下面的原文鏈接前往下載: