燒寫(xiě)AC506-SOC核心板/AC540-SOC開(kāi)發(fā)板系統(tǒng)到板載EMMC存儲(chǔ)器目前總共總結(jié)出了3種切實(shí)可行的方法,這三種方法各有利弊,分別適用于不同的應(yīng)用場(chǎng)景。本應(yīng)用筆記將針對(duì)這三種方法,分別進(jìn)行詳細(xì)的實(shí)現(xiàn)步驟介紹,力爭(zhēng)讓讀者跟著本應(yīng)用筆記按步驟操作,就能成功的實(shí)現(xiàn)EMMC的燒寫(xiě)。
要給Intel Cyclone V SoCFPGA核心板上的EMMC燒寫(xiě)系統(tǒng),面臨的核心問(wèn)題如下所述。
該芯片只有一個(gè)SDIO接口,接EMMC 的時(shí)候不能接SD卡,接SD卡的時(shí)候不能接EMMC,或者,換一種說(shuō)法,SD卡和EMMC不能同時(shí)工作。所以想通過(guò)SD卡啟動(dòng)Linux系統(tǒng)之后,再在Linux系統(tǒng)下燒寫(xiě)EMMC存儲(chǔ)器是行不通的,這一點(diǎn),與Xilinx的Zynq、以及各種常見(jiàn)的ARM 芯片不一樣。Xilinx的Zynq以及各種常見(jiàn)的ARM芯片例如IMX6ULL都有兩個(gè)SDIO接口,可以一個(gè)接EMMC存儲(chǔ)器,一個(gè)接SDIO控制器,實(shí)現(xiàn)從SD卡啟動(dòng)燒寫(xiě)EMMC的功能。
該芯片僅支持從SDIO、QSPI、NAND Flash、FPGA啟動(dòng),不支持從USB啟動(dòng)。無(wú)法像IMX6一樣直接用USB燒寫(xiě)系統(tǒng)。所以想通過(guò)電腦上弄個(gè)小軟件來(lái)用USB燒寫(xiě)也是有難度的。
不管上面所講述的難點(diǎn)在哪里,難度如何,燒寫(xiě)EMMC存儲(chǔ)器的思路有且僅有2個(gè):
讓SOC FPGA進(jìn)入UBOOT,在UBOOT下使用UBOOT提供的EMMC燒寫(xiě)命令來(lái)燒寫(xiě)EMMC。
讓SOC FPGA進(jìn)入Linux系統(tǒng),在Linux系統(tǒng)中使用可用的命令來(lái)燒寫(xiě)EMMC,例如dd命令。
不管是在UBOOT下燒寫(xiě)還是在Linux系統(tǒng)下燒寫(xiě),都有一個(gè)大前提,就是要先進(jìn)入UBOOT,畢竟Linux的啟動(dòng)也是需要UBOOT引導(dǎo),因此,解決UBOOT的加載是第一步工作。
要進(jìn)入UBOOT,其實(shí)方法非常多,比如,使用SD卡啟動(dòng),或者將UBOOT燒寫(xiě)在QSPI FLASH中,然后從QSPI啟動(dòng),更有甚者,可以使用USB Blaster直接將UBOOT燒寫(xiě)進(jìn)SOC的RAM中。
所以UBOOT的啟動(dòng)不是問(wèn)題,問(wèn)題是硬件的沖突,QSPI的倒還好說(shuō),獨(dú)立硬件信號(hào)接口,也不存在多個(gè)器件共享兼容的問(wèn)題。難點(diǎn)在于使用SD卡啟動(dòng)會(huì)存在的與EMMC沖突的情況。
然而該問(wèn)題雖然難,但也不是不能解決。SD卡和EMMC雖然不能同時(shí)工作,但是可以通過(guò)巧妙設(shè)計(jì),讓他們分時(shí)工作。比如先從SD卡啟動(dòng)UBOOT,然后在UBOOT下拔出SD卡,把EMMC掛上。所以可以先使用SD卡啟動(dòng),加載preloader和UBOOT,然后再在UBOOT下把SD卡拔掉,讓EMMC掛載,在UBOOT下對(duì)EMMC實(shí)行燒寫(xiě)操作。這樣,使用SD卡啟動(dòng)UBOOT就不耽誤EMMC的燒寫(xiě)過(guò)程了。
實(shí)現(xiàn)該方法的關(guān)鍵點(diǎn)就在于實(shí)現(xiàn)SD卡和EMMC的分時(shí)工作,事實(shí)上這也不難。我們只需要在SDIO接口上同時(shí)接上SD卡槽和EMMC存儲(chǔ)器,并設(shè)計(jì)好互斥電路,讓SD卡插入時(shí)候,EMMC能立即停止工作(比如斷電),而當(dāng)SD卡拔出時(shí)候,EMMC能夠開(kāi)始正常工作。由于SDIO接口設(shè)計(jì)之初就對(duì)熱插拔提供了良好的支持,所以這種在線插拔切換并不會(huì)有任何的風(fēng)險(xiǎn)與問(wèn)題。
對(duì)于切換電路,我們參考英貝特的LarkBoard開(kāi)發(fā)板圖紙?jiān)O(shè)計(jì)并進(jìn)行了驗(yàn)證,確定可以使用下述電路來(lái)實(shí)現(xiàn)該功能。該電路通過(guò)SD卡的卡檢測(cè)信號(hào)(SD_CD)作為給EMMC 存儲(chǔ)器供電的使能開(kāi)關(guān)。可以實(shí)現(xiàn)SD卡插入時(shí)自動(dòng)切斷EMMC供電,拔出SD卡后立即恢復(fù)對(duì)EMMC供電的功能,
SD卡可以在PC上使用專門(mén)的燒錄工具燒錄,非常方便。而且SD卡槽成本很低,不到2塊錢,所以該方案性價(jià)比很高。
使用QSPI啟動(dòng)方案需要使用一片QSPIFlash來(lái)作為UBOOT存儲(chǔ)固件,QSPI可以使用Quartus實(shí)現(xiàn)UBOOT鏡像的燒寫(xiě)。而且QSPI的成本也不是很高,128Mbit的QSPI FLASH大概12元左右。一次燒好,以后每次都可以用,但是缺點(diǎn)是每次從QSPI切換回EMMC啟動(dòng)需要修改啟動(dòng)設(shè)置管腳(如果是設(shè)計(jì)了有排針或者撥碼開(kāi)關(guān)來(lái)進(jìn)行切換倒也不復(fù)雜,但是如果是用板載電阻就比較麻煩了)。所以QSPI啟動(dòng)的方案只能放在SD卡啟動(dòng)方案之后考慮。
解決了UBOOT啟動(dòng)的問(wèn)題,只是解決了在UBOOT下燒寫(xiě)EMMC的第一道難題,第二道難題隨之而來(lái),那就是,用來(lái)燒寫(xiě)EMMC的文件存放在哪里,又如何將其燒寫(xiě)到EMMC中去呢?一個(gè)Linux系統(tǒng)鏡像,小則幾十兆,多則幾個(gè)G,這些文件在燒寫(xiě)的時(shí)候,必然存在了從一種存儲(chǔ)介質(zhì)中讀出,然后燒寫(xiě)入EMMC的過(guò)程,所以,燒寫(xiě)時(shí)候,從哪里獲取鏡像文件呢?目前個(gè)人總結(jié)的比較常用的方案有3種。
從SD卡中獲取。我們制作的啟動(dòng)SD卡,其FAT分區(qū)中是可以存放各種文件的,我們可以將需要用來(lái)燒錄的鏡像文件存儲(chǔ)在SD卡的FAT分區(qū)中,在UBOOT啟動(dòng)后,先將該固件鏡像讀取到內(nèi)存中,然后再卸載SD卡,掛載上EMMC存儲(chǔ)器,再將內(nèi)存中讀好的固件鏡像燒寫(xiě)進(jìn)EMMC。此燒寫(xiě)方案最大的瓶頸在于,要將固件先讀取到內(nèi)存,然后卸載SD卡,所以固件鏡像的大小不能大于板上DDR3的存儲(chǔ)空間大小(還得減去UBOOT運(yùn)行所占用的16MB存儲(chǔ)空間)。當(dāng)然,也不是一定不可以燒寫(xiě)比板載內(nèi)存大的鏡像,比如我們可以將鏡像文件切割成多個(gè)小于板載內(nèi)存空間的小塊之后,分多次燒寫(xiě),只不過(guò)這樣的話,每燒寫(xiě)一個(gè)文件都要插拔一次SD卡,還是蠻麻煩的。但是理論上實(shí)現(xiàn)并沒(méi)有問(wèn)題。此種方案所需要的外部硬件電路條件最少。
從USB存儲(chǔ)設(shè)備中獲取,例如從U盤(pán)中讀取。UBOOT下是支持從U盤(pán)中讀取文件的,所以理論上可以在UBOOT下從U 盤(pán)中讀取所需燒錄的鏡像文件,然后寫(xiě)入EMMC中。不過(guò)該方案和前面的SD卡存儲(chǔ)方案一樣,同樣存在著文件大小的限制,要燒錄大文件也只能使用切割成小塊多次燒寫(xiě)的方式,不過(guò)好的是,不用每次換文件都重新插拔SD卡了,要方便不少。而且可以使用腳本的方式,自動(dòng)執(zhí)行,減少人為干預(yù)的過(guò)程。
我也就此方案進(jìn)行了測(cè)試,發(fā)現(xiàn)了幾個(gè)問(wèn)題,一是這種方案要求電路板必須支持USB Host接口,能夠連接U盤(pán)。二是目前使用的UBOOT中,對(duì)于USB的支持僅限于usb1.1 對(duì)應(yīng)的ohci規(guī)范,讀寫(xiě)速度很慢,只有1.3MB/S,這個(gè)速度,用來(lái)燒寫(xiě)較大的系統(tǒng)鏡像,耗費(fèi)的時(shí)間就實(shí)在是太久了。而且在實(shí)際實(shí)驗(yàn)時(shí)發(fā)現(xiàn),如果每次拷貝的文件大小超過(guò)40M,就無(wú)響應(yīng)了,暫不知道問(wèn)題出在電路上還是程序上,如果是這樣的話,那得將文件切割到40M以內(nèi),這樣的話就更麻煩了。所以此方案雖然理論可行,但是實(shí)際操作起來(lái)實(shí)用價(jià)值不大。
通過(guò)網(wǎng)絡(luò),使用TFTP協(xié)議從遠(yuǎn)端TFTP服務(wù)器下載。這種方法,如果使用百兆網(wǎng)絡(luò)連接的話,速度可能比U盤(pán)下的1.3MB/S還要慢不少,使用千兆以太網(wǎng)速度,應(yīng)該會(huì)快一些。
通過(guò)對(duì)此方案進(jìn)行實(shí)驗(yàn),發(fā)現(xiàn)傳輸速度大概在3MB/S左右。另外,該方案需要有遠(yuǎn)程TFTP服務(wù)器的支持,比如Ubuntu虛擬機(jī),或者在Windows系統(tǒng)上運(yùn)行TFTP工具。電路板也必須要支持千兆網(wǎng)口。而且,此方案同樣受限開(kāi)發(fā)板上內(nèi)存容量,對(duì)于較大的鏡像文件,需要分多次傳輸。不過(guò)好的是不需要像SD卡那樣頻繁插拔,相對(duì)來(lái)說(shuō)要方便那么一點(diǎn)點(diǎn),而且可以使用腳本的方式,自動(dòng)執(zhí)行,減少人為干預(yù)的過(guò)程。
上述三種方案,都是在UBOOT下進(jìn)行的,由于使用的UBOOT版本問(wèn)題,以及電路板上DDR3存儲(chǔ)器容量的問(wèn)題,燒寫(xiě)較大的系統(tǒng)鏡像都比較麻煩。所以我又嘗試了基于Linux系統(tǒng)的MMC燒寫(xiě)方案。
既然是基于Linux系統(tǒng)的燒寫(xiě)方案,那么必然要先讓SOC FPGA能夠運(yùn)行起Linux系統(tǒng)。而如果從SD卡中加載Linux的文件系統(tǒng)的話,那么在系統(tǒng)開(kāi)始加載之后,SD卡就不能拆卸了,這樣就無(wú)法掛上EMMC,也就無(wú)法進(jìn)行燒寫(xiě)了。所以,要想能夠在Linux系統(tǒng)下燒寫(xiě)EMMC,需要解決的核心問(wèn)題就是如何在沒(méi)有SD卡的情況下讓SOC FPGA運(yùn)行上Linux系統(tǒng)。這個(gè)需求有以下幾種方案能夠?qū)崿F(xiàn):
使用QSPI FLASH存儲(chǔ)Linux的文件系統(tǒng),這樣就不關(guān)SDIO啥事了,就可以在Linux系統(tǒng)跑起來(lái)后,在Linux系統(tǒng)下燒寫(xiě)EMMC。但是此種方案存在的問(wèn)題是,Linux系統(tǒng)雖然可裁剪性很強(qiáng),但是怎么的也得幾十上百兆,而QSPI FLASH的存儲(chǔ)容量一般都不會(huì)太大,要能夠存儲(chǔ)上百兆字節(jié)的文件系統(tǒng),且不說(shuō)這樣的QSPI FLASH好不好買,就是能買到,其性價(jià)比必然也是極低的。所以這套方案從可行性上來(lái)說(shuō)存在很大的挑戰(zhàn)。
使用NAND FLASH存儲(chǔ)Linux的文件系統(tǒng),這樣呢,也確實(shí)同樣不關(guān)SDIO啥事,理論上實(shí)現(xiàn)沒(méi)有任何問(wèn)題,但是這樣就需要電路板上有NAND FLASH存儲(chǔ)器,而一般使用EMMC存儲(chǔ)器的電路板,不會(huì)再設(shè)計(jì)NAND FLASH存儲(chǔ)器。所以這種方案并不適合用戶自己使用過(guò)程中燒寫(xiě)EMMC。但是這個(gè)方案非常適合批量燒錄場(chǎng)景,針對(duì)AC506-SOC核心板,可以設(shè)計(jì)一個(gè)底板,底板上帶有NAND FLASH存儲(chǔ)器,里面安裝Linux系統(tǒng),批量燒錄時(shí),只需要將核心板插上去,運(yùn)行燒錄腳本就能進(jìn)行燒錄。關(guān)于文件存儲(chǔ)的問(wèn)題,也可以將代燒錄的文件存儲(chǔ)在U盤(pán)中,在Linux系統(tǒng)下讀取U盤(pán)并燒寫(xiě)EMMC,Linux系統(tǒng)下讀取U盤(pán)燒寫(xiě)EMMC,達(dá)到5MB/S每秒還是很容易的。
使用網(wǎng)絡(luò)文件系統(tǒng)(NFS),這種方案,只需要電路板上有網(wǎng)絡(luò)接口就可以,通過(guò)網(wǎng)絡(luò),掛載網(wǎng)絡(luò)上的文件系統(tǒng)。由于文件系統(tǒng)都存儲(chǔ)在網(wǎng)絡(luò)遠(yuǎn)端服務(wù)器上,所以不需要電路板本身?yè)碛卸啻蟮?/span>FLASH存儲(chǔ)容量,而且,待燒寫(xiě)的系統(tǒng)鏡像也可以存儲(chǔ)在網(wǎng)絡(luò)服務(wù)器上,這樣就不用再考慮鏡像文件存儲(chǔ)在哪里的問(wèn)題。此種方案,只需要有一個(gè)能聯(lián)網(wǎng)的遠(yuǎn)端服務(wù)器即可,這個(gè)服務(wù)器既可以是電腦的虛擬機(jī),也可以是另一個(gè)嵌入式電路板,如樹(shù)莓派,香橙派,或者其他的各種常見(jiàn)的ARM開(kāi)發(fā)板。
綜合考慮,可行性最好,兼容性最強(qiáng)的方案就是Linux系統(tǒng)下燒寫(xiě)的方案2和方案3.其中方案2需要專用的硬件底板,所以不適合終端用戶使用,但適合批量燒寫(xiě)場(chǎng)景。方案3只需要有網(wǎng)口就能完成燒寫(xiě),適合終端用戶。
介紹了各種燒寫(xiě)方法存在的利弊、挑戰(zhàn)和解決方案,接下來(lái)就一一介紹各種燒寫(xiě)方法的具體實(shí)現(xiàn)步驟。受篇幅所限,該內(nèi)容在接下來(lái)的文章發(fā)出。