進入6月的這一個星期以來,由于自己的心態(tài)原因,做了一些錯事,釀成了很大的遺憾,也因如此,自己消沉了很久,身體和內心都承受了較大的痛苦。一度都想放棄手頭的一切,找一個深山老廟敲木魚去了。今天,在秋姐姐的開導下,我終于明白了自己該去做什么,該讓自己成為怎樣的人。只有這樣,也才是大家真正愿意看到,愿意認識的我。我依舊應是那個瀟灑走世界,快樂闖神州的小梅哥。相信一切都會好起來,相信一切自有天意。
2018年8月,我完成了《SoCFPGA嵌入式設計和開發(fā)教程》一書初稿編寫。這是一個值得紀念的日子。如今,2年時間快要過去了,隨著開發(fā)和學習的深入,很多之前書中沒有寫到,或者寫的不太詳細的地方也逐漸凸顯出來。從2018年7月AC501-SoC開發(fā)板開售,到今年4月份停產,時間也是差不多2個月,期間共售出該開發(fā)板310套左右。這是一個比較糟糕的成績,但是我依然認為這份經歷非常的值得。AC501-SoC開發(fā)板不同于目前網上備受好評的AC620開發(fā)板,AC620開發(fā)板是一個市場上非常成熟的FPGA系列產品,其內容只涉及到單純的FPGA開發(fā)。而AC501-SoC不一樣,AC501-SoC采用的基于Intel Cyclone V SoC FPGA系列的器件,由于架構新穎,上市時間不長,而且由于技術壁壘較高,涉及到了arm嵌入式和fpga開發(fā)的雙重技術,所以開發(fā)和使用起來難度都比單純的fpga或者arm linux要大一些。參考資料只有官方提供的一些。很多問題網友也沒有遇到,網絡上也不好找解決資源,所以我做的也是比較的艱難和緩慢。
2年的時間就這樣過去了,對于SoC FPGA這個產品,我到目前為止,做的依然非常的有限,不過在開發(fā)調試的過程中,積累了一些調試的經驗和心得。所以,希望借這次改版升級的機會,把之前內容中的不足都補上,把調試開發(fā)過程中的經驗也都分享出來。
首先在這里更正兩個書中已知的錯誤:
書本9.4節(jié),編寫I2C控制器設備節(jié)點中最后一段內容(211頁),輸入的命令寫錯了,
原本為:dtc -I dts -o dtb -fo soc_system.dtb socfpga.dts
更正為:dtc -I dts -o dtb -fo socfpga.dtb soc_system.dts
該命令功能是使用dts文件生成Linux內核啟動時直接讀取的設備樹二進制文件(dtb)。書中錯誤的寫法把dts和dtb文件的名字寫反了,導致命令無法執(zhí)行。這里就對該命令再次做個解釋。
第一個字段“dtc”是一個命令,是用來編譯和反編譯設備樹,我們在開發(fā)的時候,用的較多的是編譯功能,所謂編譯,就是將文本形式的dts文件編譯得到二進制格式的dtb文件。該命令還可以執(zhí)行反編譯功能,將已有的dtb文件反編譯得到我們很容易閱讀的文本文件。具體的命令使用方法,大家可以自行學習,本文最后也會給出該功能的使用例子。
第二個字段“-I”是一個參數,表示的是輸入的意思,I是input的簡寫。
第三個字段“dts”是對第二個字段,也就是輸入文件格式的限定,表示輸入用來參與編譯的源文件是dts格式的。
第四個字段“-O”是一個參數,表示的是輸出的意思,O是output的簡寫。
第五個字段“dtb”是對第四個字段,也就是輸出文件格式的限定,表示輸編譯結果以dtb格式輸出。
第六個字段“-fo”是操作,指定輸出文件的名稱。o依舊表示output,f表示強制輸出,因為dts文件中有時候會有一些錯誤,這些錯誤是由于信息不完善導致的,尤其是對于socfpga這種,在qsys中添加的一些fpga側的IP是沒有對應的自動生成dts信息的屬性的,所以就會出現這種錯誤,這種錯誤不會導致生成的dtb文件無法使用,但是默認編譯遇到這些錯誤會退出,所使用-f可以讓編譯器忽略這些錯誤,強制生成dtb文件。
第七個字段“socfpga.dtb”指的是編譯輸出的文件名,是對第六個字段參數的進一步限定。文件名可以更改,但是格式必須是.dtb
第八個字段“soc_system.dts”是指定輸入文件的具體名稱,該文件必須要在當前目錄下存在,編譯器才能讀取并編譯輸出。
理解了命令中每個字段和參數的意義后,再來做實驗,即使遇到書中書寫的錯誤,也會很快找到問題所在并能夠自動改正了。
使用dtc命令可以將已經有的dtb文件反編譯為dts文件,以將socfpga.dtb反編譯為soc_system_back.dts為例,只需要使用下述命令即可。
dtc -I dtb -o dts -fo soc_system_back.dtssocfpga.dtb
反編譯在進行調試的時候非常有用,尤其是一些特殊的設備驅動,自己編寫的設備樹總是無法成功加載驅動的時候,找一個第三方能夠正常運行的板子的dtb文件反編譯一下作為參考,還是蠻有用的。我就反編譯過英貝特的SOCFPGA開發(fā)板的dtb文件來參考電阻觸摸屏的設備樹編寫方法。
第二個書中已知的錯誤就是,書中寫的編譯uboot和preloader是直接在quartus工程根目錄下直接執(zhí)行make uboot。這個操作對于大多數的開發(fā)板,無論是我們自己的AC501-SoC,還是友晶的一系列DE系列的開發(fā)板,都沒太大的問題,因為這些板其實用的都是大致相同的配置。使用相同的uboot也沒啥影響。但是一些自己定制的開發(fā)板,當對外設的配置,尤其是啟動方式和網卡不同時,這個問題就暴露出來了。例如對于我們和朋友公司一起開發(fā)的使用Nand Flash啟動的AC590-SoC核心板,使用這種方式編譯出來的UBOOT就會有問題,無法正常工作。因為這種方式在編譯時會重新從quartus軟件目錄下拷貝uboot的壓縮包來重新編譯,會覆蓋掉所有的工程配置設置,所以編譯多少次都是配不上的。正確的方法是,不管針對哪個目標板,都應在software/bsp_spl目錄下再執(zhí)行make uboot。
接下來,我將會對SoC FPGA開發(fā)板中的一些積累進行更多的分享,包括FPGA2SDRAM橋的使用和調試心得,HPS雙網口的調試心得,FPGA與HPS的IO口相互共享使用方法等。同時,也會記錄一些應用案例的開發(fā)過程。我不想再讓自己成為一個寫教程的人,我希望自己是一個有血有肉的工程師,在發(fā)文的過程中,更多的會記錄自己的調試過程,調試心路歷程,讓人看到文章,就能仿佛看到我的存在。也讓更多的工程師產生共鳴,讓自己沒那么孤單。希望大家看到文章后,如果恰好你有空,就給留個言,我能回復就回復。