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