嵌入式linux應用的製作與韌體燒錄的概述

2021-10-09 10:34:20 字數 4370 閱讀 3389

僅概述, 不對細節進行過多描述(不同的晶元平台,細節也會略有不同,多說無益)。文章只有乙個目的,就是對於新接觸linux soc平台的人,幫助他們明確目標,清晰思路,以便更迅速的切入到工作中;

很明顯,為了讓乙個晶元工作起來,晶元需要程式。

韌體包含:  uboot、logo、dtb以及kernel檔案系統?

首先,針對第乙個問題,嵌入式linux的soc,整體架構,從操作的步驟上劃分,可以分為三大塊,也可以理解為,有三大塊程式需要固化(燒錄),

(雖然,linux核心也有引導**,但是u-boot可以提供更便利的debug與updata,所以犧牲一些啟動速度是值得的。市面上大多數的soc是有u-boot的);

作為新人,對u-boot有點陌生,是正常的。即使這樣,也不建議過多的去閱讀/了解u-boot。除非,工作的本身就是u-boot的維護及個性化公升級。為什麼不建議去深入研究u-boot呢,原因很簡單,通常廠商會提供適用的原始碼、編譯步驟、固化工具/步驟;所以,新平台,你需要做的,就是耐心的讀完廠家的操作指南;關於u-boot,在99%以上的應用場合裡,是乙個幾近於標準不需要使用者做出修改的。

對linux-kernel進行必要的裁剪或載入使用者自己的驅動;聽起來,好怕怕的樣子。事實上,廠商也提供了linux-kernel原始碼及工具。裡面還包含了平台本身硬體資源對應的驅動,譬如 spi,usb-host,otg,iic等等,傻瓜式的編譯,傻瓜式的勾選配置。裁剪就完成了。高大尚的說辭,瞬間被拉低了身價;所以,需要你做的是,有耐心的讀完廠商提供的操作指南,這個指南會告訴你,如何去編譯這個核心原碼,生成映象檔案,固化到晶元裡。

雖然,操作如此傻瓜,但是我們還應該稍稍了解點基本常識。linux是乙個一體化的核心(一體化核心也稱「單核心」相對於「微核心」-例如,ucos-ii,psos,vxwork);「一體化」三個字隱隱透露出這玩意,移植是相當"方便"的(至於如何從0開始移植,只有傻冒才會去做,除非你要幹的就是這個活兒。敲黑板,敲黑板,敲黑板,廠家已經提供了與晶元相匹配的 linux-kernel原始碼了,應該在這個原始碼的基礎上去繼續深耕才是正道兒)。

linux核心採用模組化設計,功能模組(驅動層)先編譯成模組,然後可以在核心執行中動態的載入/解除安裝而不需要重啟;

linux核心整合了完整的posix網路協議棧,網路功能完善;

其他的一些穩定性強,安全性好,支援裝置廣泛等等一些張嘴就來優點,就不再描述了。隨便說,反正不會錯就對了。

那麼linux-kernel有哪些作用呢?或者說有啥組成的呢?又或者說它能幹點嘛?

上個結構圖看一下。如下圖:

上圖里的所有的功能模組,基本就是字面意思,也沒啥深入要說的了。但是,有乙個叫 「檔案系統」的模組,敲黑板,敲黑板,上圖的 第二行,「檔案系統」。這個檔案系統,是使用者自製作的。也就是本段落開始的時候說的,「需要固化三大塊程式」中的乙個;詳述如下「 3.」。

從上圖看,linux核心裡有乙個單元叫「檔案系統」 ,linux啟動後期,會去尋找並掛載根檔案系統;然後,執行裡面指定的程式及其他等等。。。簡而言之這玩意很重要。需要執行的根檔案系統可以是固化在晶元內部的(作為產品,肯定要固化到晶元裡面),也可以是存在於晶元記憶體的映象(顯然掉電,重啟記憶體裡資料就丟失了。);根檔案系統它包含了linux正常執行所必須的程式、庫、各種配置引數等;

剛剛在第「2.」中提到的廠商提供的核心原始碼。是指,除了「檔案系統」以外的所有的東西。所以,開發者,需要自己製作乙個檔案系統;開發者編寫的應用程式(bin),驅動程式(.ko)也都存放在這個檔案系統裡的。

綜上述,製作乙個完整的linux soc需要 製作個u-boot映象( 這是容易的),製作個linux核的映象(也算不複雜),製作個根檔案系統映象(如何製作根檔案系統,需要了解linux根檔案系統的目錄結構(大多數時候,業內基本上是按照fhs--檔案層次標準--來執行的))這裡不做詳細描述;

其次,針對第二個問題,做如下描述:

值得強調的是「linux驅動程式」與「linux應用程式」是有區別的。驅動載入後執行在核心態,屬於核心部分,應用程式執行在使用者態;在程式設計時,它們的編寫格式/風格也是有區別的而且區別很大,這裡不贅述細節。

為了實現某個產品的功能,在乙個完整的應用中,有可能會需要用到「使用者自定義的驅動程式+使用者的應用程式+標準驅動模組」,也可能僅僅只需要「使用者應用程式+標準驅動模組」。

現在說的重點是,如果需要用到自定義的驅動程式時,那麼除錯好的驅動程式( .ko檔案),放在**,如何載入到核心中?換句話說,如何固化這個驅動程式呢?

驅動程式,與應用程式都是存放在根檔案系統下的。應用程式,通過配置檔案可以開機自啟動。驅動程式也可以通過指令碼來載入。顯然,應用程式,自定義的驅動,配置檔案,指令碼等等都可以在製作檔案體系生成映象檔案前,就存放在檔案體系中,生成映象時便包含在映象檔案裡。固化到晶元裡就可以了。

第三、關於debug

交叉編譯環境,宿主機開發; 我們可以把目標板上的檔案系統建立在主機上,通過tftp或其他方式,讓宿機掛載這個檔案系統;所以,修改主機上的這個檔案體系內容,實質上就是修改了目標機上的檔案體系內容;提供了相對便捷的debug的方式;除錯成功後,把這個檔案體系打包製作成映象檔案,固化到晶元中就可以了。(固化工具,方法,步驟,**商同樣也有指導說明。需要耐心閱讀).

附:soc基本概念

soc的定義多種多樣,由於其內涵豐富、應用範圍廣,很難給出準確定義。一般說來, soc稱為系統級晶元,也有稱片上系統,意指它是乙個產品,是乙個有專用目標的積體電路,其中包含完整系統並有嵌入軟體的全部內容。同時它又是一種技術,用以實現從確定系統功能開始,到軟/硬體劃分,並完成設計的整個過程。從狹義角度講,它是資訊系統核心的晶元整合,是將系統關鍵部件整合在一塊晶元上;從廣義角度講, soc是乙個微小型系統,如果說**處理器(cpu)是大腦,那麼soc就是包括大腦、心臟、眼睛和手的系統。國內外學術界一般傾向將soc定義為將微處理器、模擬ip核、數字ip核和儲存器(或片外儲存控制介面)整合在單一晶元上,它通常是客戶定製的,或是面向特定用途的標準產品。

soc定義的基本內容主要表現在兩方面:其一是它的構成,其二是它形成過程。系統級晶元的構成可以是系統級晶元控制邏輯模組、微處理器/微控制器cpu 核心模組、數字訊號處理器dsp模組、嵌入的儲存器模組、和外部進行通訊的介面模組、含有adc /dac 的模擬前端模組、電源提供和功耗管理模組,對於乙個無線soc還有射頻前端模組、使用者定義邏輯(它可以由fpga 或asic實現)以及微電子機械模組,更重要的是乙個soc 晶元內嵌有基本軟體(rdos或cos以及其他應用軟體)模組或可載入的使用者軟體等

linux驅動之soc內部和外設

從事嵌入式軟體的骨子裡總帶著那麼點硬體的影子,比如寫個程式會計較一下ram、rom占用,編譯結果等等。當然寫嵌入式應用軟體的可能不太在乎。

linux驅動開發是個既清晰有很模糊的事。清晰是指,linux系統核心和架構都是定型的,當你拿到乙份核心原始碼時,只要按照套路做就是了。很模糊是指很少人能講清楚這個套路是什麼,細節方面怎麼做。很多講linux驅動開發的書最後把自己也繞進去了。

linux驅動開發應該參照類似微控制器驅動開發的套路——微控制器驅動可以分為內部驅動和外設驅動:

1、內部驅動就是微控制器內部控制器驅動一般通過改微控制器的暫存器實現,所謂的驅動卻大部分都是對暫存器改動、打包、互相呼叫。當然這部分工作越來越依賴於半導體廠商了,當然這也是他們份內的事,微控制器是他們設計、製造的,要說寫內部驅動會有比他們寫的更好的嗎?現在廠家都按照意法半導體的模式了,直接提供內部驅動給你省事多了。

2、外設驅動套路就是通過上面寫好的內部驅動去讀寫外設的暫存器、互相呼叫等。這在微控制器領域很常見啊,比如esp8266外設驅動不就是通過微控制器內部串列埠驅動按照串列埠時序去讀寫esp8266暫存器嗎。在外設驅動裡我們都會發現裡面肯定有微控制器內部驅動,比如讀取esp8266某值的函式肯定有微控制器內部驅動uart_read。說個題外話,為什麼外設製造商不直接提供乙份驅動?「臣妾做不到啊!」,鬼才知道你用什麼微控制器!最多給你提供幾個應用廣的微控制器適配的驅動。微控制器**商更加不會考慮你用什麼外設。反正不就是乙個套路:外設驅動裡包含微控制器內部驅動,了事。

3、你真的掌握了這個套路了嗎?在微控制器沒有那麼深的套路裡內部驅動和外部驅動一目了然。可是扔到soc+linux裡呢?這就複雜了首先soc內部驅動在2.6-3版本核心時是platform(驅動裝置匯流排)套路;其次外設除了包含內部驅動這個套路,還有個更上層的套路就是驅動裝置匯流排模型;然後大傢伙就暈了。把兩套驅動裝置匯流排混在一起了,但其實它們的互動api是很直接的,也就是它們各自分別實現各自的驅動裝置匯流排模型,然後通過外設包藏內部驅動,搞定。

4、但外設驅動那有那麼簡單,還有很多子系統框架呢?但它們與platform其實沒有關係了。linux只是希望外設驅動在包藏和呼叫內部驅動時能更有套路罷了。

5、寫linux驅動書的人總是不願意太low的說套路這個詞,其實慢慢的都是套路,把套路講清楚了也是真本事!

嵌入式Linux核心製作

一.linux核心簡介 linux系統架構分為核心空間和使用者空間。它們之間切換條件 1.系統呼叫 2.硬體中斷。核心架構 1.系統呼叫介面 2.程序管理塊 3.記憶體管理 4.體系結構相關 4.虛擬檔案系統 5.網路棧 6.裝置驅動 二.製作linux核心 1.修改配置檔案 make config...

嵌入式linux應用的製作與韌體燒錄的概述

僅概述,不對細節進行過多描述 不同的晶元平台,細節也會略有不同,多說無益 文章只有乙個目的,就是對於新接觸linux soc平台的人,幫助他們明確目標,清晰思路,以便更迅速的切入到工作中 很明顯,為了讓乙個晶元工作起來,晶元需要程式。首先,針對第乙個問題,嵌入式linux的soc,整體架構,從操作的...

嵌入式核心製作

一.核心簡介 1.系統架構 1 linux是由使用者空間和核心空間構成的 2 使用者空間主要是使用者應用程式以及一些c庫檔案,配置檔案。一般是看得見的。3 核心空間主要是系統呼叫介面,狹義上的核心,處理器架構相關的 4 劃分兩個空間的理由 處理器有不同的工作模式,不同的模式許可權不一樣,可以執行的指...