1. 名詞說明

1.1 什麼是韌體

韌體,也成為firmware。下面引用百度的定義:

韌體(firmware)一般儲存於裝置中的電可擦除只讀儲存器EEPROM(Electrically Erasable Programmable ROM)或FLASH晶片中,一般可由使用者透過特定的重新整理程式進行升級的程式。一般來說,擔任著一個數碼產品最基礎、最底層工作的軟體才可以稱之為韌體,比如計算機主機板上的基本輸入/輸出系統BIOS(Basic Input/output System),在以前其實更多的專業人士叫它韌體。

我的理解為:韌體其實就是放在儲存介質上的資料,當嵌入式板子啟動時,能夠從特定的位置找到這些檔案,使得板子能夠跑起來,這些檔案就是韌體。那麼在嵌入式linux系統中,經常用到的檔案如下:

uboot:如uboot。bin

kernel:如uImage

rootfs:如system。yaffs2檔案

嵌入式板子上電後,會去特定的位置尋找uboot,uboot初始化記憶體,初始化串列埠,設定linux啟動引數以後,會將核心從flash中載入到記憶體。然後核心會去掛載根檔案系統並啟動init。所以上面所說的三種檔案可以理解為韌體。

1.2 什麼是燒錄?

燒錄的意思是將一些嵌入式啟動所必須的硬體下載到嵌入式的儲存裝置中,這可能是norflash, 有可能是nandflash,也有可能是SD卡。當這些韌體燒錄到儲存器中,板子下次啟動的時候,直接從這些儲存器中找到這些檔案,嵌入式系統就能夠直接跑起來。

2. 燒錄哪幾個韌體

2.1. 開發過程中韌體的燒寫

2.1.1 只燒錄uboot,其他的韌體不用燒錄?

答案是可以的 。當我們只燒錄uboot後,進入uboot模式下,我們可以透過uboot模式下的命令來載入kernel和rootfs。在uboot模式下,我們使用tftp mem_addr kernel_file來載入核心,然後透過nfs來載入rootfs。這樣做的前提是你的PC機提供tftp和nfs服務,並且你的開發板需要和PC機在同一網路下。這樣做有一個缺點,每次板子上電時都需要去敲命令來載入核心以及nfs。

2.1.2 燒錄uboot和核心,rootfs以nfs的形式掛載到PC機上

在開發過程中經常用到的是這種方案。只燒錄uboot和kernel,在板子啟動時,核心會透過nfs去PC機上尋找檔案系統。這種方式有的時候可能會導致系統起來比較慢,可能是因為網路狀況不好,這樣可能會影響你的體驗。

2.1.3 燒錄uboot、kernel、rootfs

在常見的燒錄方式是將這三個檔案全部燒錄到板子裡,且核心需要支援nfs協議。板子能夠從自己的儲存器中將系統啟動起來而不需要依賴網路。板子啟動後,可以利用mount命令,將某一目錄掛載到PC機上。當應用程式更新後,只需要將可執行檔案複製到nfs目錄下,板子就可以進行除錯了。之前做個某創的FreeRtos專案,除錯非常的麻煩,每次程式更新後就需要燒錄系統,燒錄一次需要5分鐘,把脾氣都磨沒了。linux的除錯還是很人性化的。

2.2. 產品釋出後的韌體升級方式

產品釋出後升級韌體一般有下面兩種方式

對於Nand Flash或者Nor Flash,透過MTD的工具,即mtd-util中的nandwrite等,操作/dev/mtdN將新的韌體寫入進去

對於SD/MMC,透過操作/dev/mmc裝置,將新的韌體寫入進去

這個部分等後面會專門講到mtd升級韌體的方法。

3. 將韌體燒錄到儲存介質張得方式

3.1 透過uboot燒錄(兩步到位)

有這麼幾種情形可以使用uboot進行燒錄

核心損壞

檔案系統載入不了

儲存介質的uboot損壞

就一句話:只要你的uboot起來,你就可以用這種方式來燒錄系統。uboot起來就可以透過儲存器起來,也可以透過SD卡起來。比如你之前的儲存在inand裡面的uboot被擦除了,那麼此時你的系統是鐵定跑步起來的,那麼怎麼辦呢?你可以透過製作一張SD 卡,卡里面放油可以執行的uboot,將嵌入式板子的啟動方式打到外部的SD卡啟動,那麼此時只要你的SD裡的uboot啟動了,你就可以透過uboot下的工具將核心映象和檔案系統燒錄到儲存器中。比如使用工具fastboot。(當然你也可以只用一步到位的方式進行燒錄)

3.2 透過USB燒錄(一步到位)

在工廠量產的環境下,使用USB燒錄是做有效也是最簡潔的方式。將三個映象檔案準備好,使用特定的燒錄工具,將三個檔案直接燒錄到儲存器中。如君正的clone工具。

註釋:

linux啟動和燒錄的區別:linux啟動是指linux以哪種方式啟動,如從norflash中啟動,從inand中啟動,從SD卡啟動等,可以理解為從哪個地方啟動表明uboot放在哪個儲存器中。這個是啟動而已,但是並不代表啟動就一定能夠成功。有可能啟動到uboot階段,發現kernel被破壞了。系統起不起來。這個時候就需要重現燒錄系統。而l燒錄是指將這些韌體下載到嵌入式的儲存器中。這個兩個概念。但是在linux啟動uboot後,我們可以透過uboot的命令來燒錄系統。