uboot的源碼目錄結構分析

uboot源碼可以有3種獲取途徑:uboot官網下載、SoC廠商官方的、具體開發板的官方
(1)uboot官網下載的。這個是源頭的源代碼,這種代碼對我們來說移植比較困難,因爲源代碼可能沒有匹配你當前使用的開發板,甚至找不到當前開發板使用的SoC對應的移植版本。
(2)SoC廠商在推出一款SoC後,爲了推廣自己的SoC芯片,廠商的工程師會根據自己的SoC進行第一步的移植(移植的uboot是根據他們自己的開發板移植的),最終推出的自己的開發板,這個開發板很大功能特別齊全。
(3)具體的開發板供應商首先購買SoC廠商開發板,然後根據自己的功能需要對其進行裁剪,配置移植得到自己的開發板的一個uboot移植。
我們買開發板時,廠商光盤中帶的BSP中的uboot源碼就是具體開發板廠商移植過的。所以市面上不同版本的uboot或者同一版本不同人移植的uboot,可能目錄結構和文件內容都有所不同。以我前年在淘寶買的一個開發板所附帶的光盤爲例來看一下uboot源碼的目錄結構。

先看一下文件夾目錄:
在這裏插入圖片描述
(1)api:硬件無關的功能函數的API,這些函數是uboot本身使用的。
(2)api_examples: API相關的測試事例代碼。
(3)board:board是開發板的意思,board文件夾下每一個文件都代表一個開發板或者一個SoC廠商(這是因爲隨着開發板數量的增多,board目錄下文件夾越來越多不方便管控,這個時候用具體廠商的名字作爲文件夾,然後各個SoC廠商所有芯片的開發各自放在各自目錄中,最開始時board目錄下就是開發板名字,後來才改成廠商名字的。但是因爲要向前兼容,同一個廠商原來還是外面的開發板並沒有挪移到廠商目錄下面去。這樣就造成後來的人不知道原委的感到很奇怪,感覺很混亂)就是用來描述這一個開發板的信息的。board目錄下有多少個最小文件夾,就表示當前這個uboot支持多少個開發板,這也是uboot具有可移植性的原因所在。
(4)common:與具體硬件無關的普遍適用的一些代碼,譬如控制檯實現、crc校驗的。但是更多的主要是兩類:一類是cmd開頭的,是用來實現uboot的命令系統的;另一類是env開頭的,是用來實現環境變量的。
(5)cpu:SoC相關初始化和控制代碼。譬如CPU的、中斷的、串口等SoC內部外設的,包括起始代碼start.S也在這裏。裏面的每一個子文件夾就是一個SoC系列。由於這個文件是嚴格和硬件相關的,因此移植時也是要注意的,但是對於同一個SoC的不同開發板,在實際移植時這個目錄幾乎不用動。
(6)disk:磁盤有關的。
(7)doc:文檔可以幫助我們理解uboot代碼。
(8)drivers:主要是開發板上必須用到的一些驅動從linux源代碼中扣出來的原封不動的linux設備驅動(uboot中的驅動其實是linux中的驅動的一部分。
(9)examples:示例代碼。
(10)fs:文件系統。這個也是從linux源代碼中移植過來的,用來管理Flash等資源。
(11)include:頭文件目錄(uboot和linux kernel在管理頭文件時都採用了同一個思路,就是把所有的頭文件全部集中存放在include目錄下,而不是頭文件跟着自己對應的c文件),所以在uboot中頭文件包含時路徑結構要在這裏去找。
(12)lib_arm:arm架構使用的一些庫文件,這類文件夾中的內容移植時基本不用管
(13)lib_generic:裏是所有架構通用的庫文件,這類文件夾中的內容移植時基本不用管。
(14)libfdt:設備樹有關的。linux內核在3.4左右的版本的時候更改了啓動傳參的機制,改用設備樹來進行啓動傳參,進行硬件信息的描述了。
(15)nand_spl:nand相關的。
(16)net:網絡相關的代碼,譬如uboot中的tftp nfs ping命令 都是在這裏實現的。
(17)onenand開頭的:是onenand相關的代碼,是三星加的,標準uboot中應該是沒有的。
(18)post:沒關注過,不知道幹嘛的。
(19)sd_fusing:實現了燒錄uboot鏡像到SD卡的代碼。
(20)tools:一些工具類的代碼。譬如mkimage。

再來看一下文件目錄:
在這裏插入圖片描述
(1).gitignore:這個文件和git有關,和uboot本身無關的,不用去管(Linux,Android,uboot等都是由git來管理的)。
(2)arm_config.mk:後綴是.mk,是一個Makefile文件(別人寫好的makefile文件,等着被調用呢),將來在某個Makefile中會去調用它。
(3)三個Changelog文件:記錄了該uboot項目的版本變遷和每個版本較上個版本修改的記錄。主要是給維護uboot的人用的。
(4)config.mk:和arm_config.mk差不多性質。
(5)COPYING:版權聲明,uboot本身是GPL許可證的。
(6)CREDITS:致謝,裏面記錄了對uboot有貢獻的人。
(7)image_split:一個腳本,應該是用來分割uboot.bin到BL1的。
(8)MAINTAINERS:當前在參與維護uboot源碼的社區工作者。
(9)MAKEALL:幫助編譯uboot的腳本。
(10)Makefile:主Makefile,將來整個uboot被編譯時就是用這個Makefile管理編譯的。
(11)mk:快速編譯的腳本,記錄了配置編譯的命令。直接用 ./mk就可以直接進行編譯了。
(12)mkconfig:uboot配置階段的主要配置腳本,uboot的可移植性很大程度就是靠這個配置腳本在維護的。
(13)mkmovi:一個腳本,和iNand/SD卡啓動有關
(14)README:所有的軟件都有README,一般拿到一個東西要先讀README,這個東西其實就是個簡單的使用說明書。
(15)rules.mk:Makefile使用的規則。

總結:文件夾裏面比較重要的有:board、common、cpu、drivers、include、lib_arm、lib_generic、sd_fusing;文件中,對我們比較重要,需要認真看的有2個:mkconfig和Makefile。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章