U-Boot源码目录分析(VScode工程创建及文件夹过滤)
參考:U-Boot工程目錄介紹
作者:一只青木呀
發(fā)布時(shí)間: 2020-10-21 14:47:30
網(wǎng)址:https://blog.csdn.net/weixin_45309916/article/details/109199081
目錄
- 0、Uboot下載編譯
- VScode工程創(chuàng)建及文件夾過濾
- 2、重要文件
- 2.1、arch文件夾(架構(gòu))
- 2.2、 board 文件夾(板子)
- 2.3、 configs 文件夾(defconfig樹莓派內(nèi)核移植學(xué)過)
- 2.4、 .u-boot.xxx_cmd 文件
- 2.5、 Makefile 文件
- 2.6、 u-boot.xxx 文件
- 2.7、 .config 文件(make xxx_defconfig生成)
- 2.8、 net文件
- 2.9、 README
上一章我們?cè)敿?xì)的講解了uboot 的使用方法,其實(shí)就是各種命令的使用,學(xué)會(huì)uboot 使用以后就可以嘗試 移植uboot 到自己的開發(fā)板上了,但是在移植之前需要我們得 ①先分析一遍uboot的啟動(dòng)流程源碼,②捋一下uboot 的啟動(dòng)流程,否則移植的時(shí)候都不知道該修改那些文件。本章我們就來分析一下正點(diǎn)原子提供的uboot 源碼,重點(diǎn)是分析uboot 啟動(dòng)流程,而不是整個(gè)uboot
源碼,uboot 整個(gè)源碼非常大,我們只看跟我們關(guān)心的部分即可。
0、Uboot下載編譯
首先得下載好uboot文件,并進(jìn)行編譯。
uboot下載:https://blog.csdn.net/weixin_45309916/article/details/109176510
進(jìn)行編譯后再進(jìn)行分析
編譯后的文件:
編譯后的文件夾及其文件含義:
| 文件夾 | api | 與硬件無關(guān)的API函數(shù) | uboot自帶 |
| 文件夾 | arch(架構(gòu)) | 與架構(gòu)有關(guān)的代碼 | uboot自帶 |
| 文件夾 | board | 不同板子(開發(fā)板)的定制代碼 | uboot自帶 |
| 文件夾 | cmd | 命令相關(guān)代碼 | uboot自帶 |
| 文件夾 | common | 通用代碼 | uboot自帶 |
| 文件夾 | config | 配置文件 | uboot自帶 |
| 文件夾 | disk | 與磁盤分區(qū)相關(guān)代碼 | uboot自帶 |
| 文件夾 | doc | 文檔 | uboot自帶 |
| 文件夾 | drivers | 驅(qū)動(dòng)代碼 | uboot自帶 |
| 文件夾 | dts | 設(shè)備樹 | uboot自帶 |
| 文件夾 | example | 示例代碼 | uboot自帶 |
| 文件夾 | fs | 文件系統(tǒng) | uboot自帶 |
| 文件夾 | include | 頭文件數(shù) | uboot自帶 |
| 文件夾 | lib | 與庫(kù)文件 | uboot自帶 |
| 文件夾 | Licenses | 許可證相關(guān)文件 | uboot自帶 |
| 文件夾 | net | 網(wǎng)絡(luò)相關(guān)文件 | uboot自帶 |
| 文件夾 | post | 上電自檢程序 | uboot自帶 |
| 文件夾 | scripts | 腳本文件 | uboot自帶 |
| 文件夾 | test | 測(cè)試代碼 | uboot自帶 |
| 文件夾 | tools | 工具文件夾 | uboot自帶 |
| 文件 | .config | 配置文件,重要的文件 | 編譯成成的文件 |
| 文件 | .gitignore | git工具相關(guān)文件 | uboot自帶 |
| 文件 | .mailmap | 郵件列表 | uboot自帶 |
| 文件 | .u-boot.xxx.cmd(一系列) | 這是一系列的文件,用于保存著一些命令 | 編譯生成的文件 |
| 文件 | config.mk | 某個(gè)Makefile會(huì)調(diào)用此文件 | uboot自帶 |
| 文件 | Kbuild | 用于生成一些和匯編有關(guān)的文件。 | uboot自帶 |
| 文件 | Kconfig | 圖形配置界面描述文件 | uboot自帶 |
| 文件 | MAINTAINERS | 維護(hù)者聯(lián)系方式文件 | uboot自帶 |
| 文件 | MAKEALL | 一個(gè)shell腳本,幫助生成uboot的 | uboot自帶 |
| 文件 | Makefile | 主 Makefile,重要文件! | uboot自帶 |
| 文件 | README | 相當(dāng)于幫助文檔。 | uboot自帶 |
| 文件 | System.map | 系統(tǒng)映射文件 | 編譯成成的文件 |
| 文件 | u-boot | 系統(tǒng)映射文件 | 編譯成成的文件 |
| 文件 | u-boot.xxx(一系列) | 生成的一些 u-boot 相關(guān)文件,包括u-boot.bin、 u-boot.imx.等 | 編譯成成的文件 |
上表中的很多文件夾和文件我們都不需要去關(guān)心,我們要關(guān)注的文件夾或文件如下:
VScode工程創(chuàng)建及文件夾過濾
先在Ubuntu 下編譯一下uboot,然后將編譯后的uboot 文件夾復(fù)制到windows 下,并創(chuàng)建VScode 工程。打開VScode,選擇:文件->打開文件夾…,選中uboot 文件夾,如圖31.2.1 所示:
打開uboot 目錄以后,VSCode 界面如圖31.2.2 所示:
點(diǎn)擊“文件->將工作區(qū)另存為…”,打開保存工作區(qū)對(duì)話框,將工作區(qū)保存到uboot 源碼根目錄下,設(shè)置文件名為“uboot”,如圖31.2.3 所示:
保存成功以后就會(huì)在uboot 源碼根目錄下存在一個(gè)名為uboot.code-workspace 的文件。這樣一個(gè)完整的VSCode 工程就建立起來了。但是這個(gè)VSCode 工程包含了uboot 的所有文件,uboot中有些文件是不需要的,比如arch 目錄下是各種架構(gòu)的文件夾,如圖31.2.4 所示:
在arch 目錄下,我們只需要arm 文件夾,所以需要將其它的目錄從VSCode 中給屏蔽掉,比如將arch/avr32 這個(gè)目錄給屏蔽掉。
在VSCode 上建名為“.vscode”的文件夾,如圖31.2.5 所示:
輸入新建文件夾的名字,完成以后如圖31.2.6 所示。
在.vscode 文件夾中新建一個(gè)名為“settings.json”的文件,然后在settings.json 中輸入如下內(nèi)容:
1 { 2 "search.exclude": { 3 "**/node_modules": true, 4 "**/bower_components": true, 5 }, 6 "files.exclude": { 7 "**/.git": true, 8 "**/.svn": true, 9 "**/.hg": true, 10 "**/CVS": true, 11 "**/.DS_Store": true, 12 } 13 }結(jié)果如圖31.2.7 所示:
其中"search.exclude"里面是需要在搜索結(jié)果中排除的文件或者文件夾,"files.exclude"是左側(cè)工程目錄中需要排除的文件或者文件夾。我們需要將arch/avr32 文件夾下的所有文件從搜索結(jié)果和左側(cè)的工程目錄中都排除掉,因此在"search.exclude"和"files.exclude"中輸入如圖31.2.8 所示內(nèi)容:
保存一下settings.json 文件,然后再看一下左側(cè)的工程目錄,發(fā)現(xiàn)arch 目錄下沒有avr32 這個(gè)文件夾了,說明avr32 這個(gè)文件夾被排除掉了,如圖31.2.9 所示:
我們只是在"search.exclude"和"files.exclude"中加入了:“arch/avr32”: true,冒號(hào)前面的是要排除的文件或者文件夾,冒號(hào)后面為是否將文件排除,true 表示排除,false 表示不排除。用這種方法即可將不需要的文件,或者文件夾排除掉,對(duì)于本章我們分析uboot 而言,"search.exclude"和"files.exclude"中需要輸入的完成的內(nèi)容如下:
上述代碼用到了通配符“ * ”,比如 “ * * / * .o”表示所有.o 結(jié)尾的文件?!癱onfigs/[a-l] *”表示configs 目錄下所有以‘a(chǎn)’~‘l’開頭的文件或者文件夾。上述配置只是排除了一部分文件夾,大家在實(shí)際的使用中可以根據(jù)自己的實(shí)際需求來選擇將哪些文件或者文件夾排除掉。排除以后我們的工程就會(huì)清爽很多,搜索的時(shí)候也不會(huì)跳出很多文件了。
2、重要文件
2.1、arch文件夾(架構(gòu))
這個(gè)文件夾里面存放著和架構(gòu)有關(guān)的文件,如下圖所示:
從上圖可以看出有很多架構(gòu),比如 arm、 avr32、 m68k 等,我們現(xiàn)在用的是 ARM 芯片,所以只需要關(guān)心 arm 文件夾即可,打開 arm 文件夾里面內(nèi)容如下圖所示:
mach 開頭的文件夾是跟具體的設(shè)備有關(guān)的,比如“mach-exynos”就是跟三星的 exyons 系列 CPU 有關(guān)的文件、還有樹莓派使用的mach-bcm283x。我們使用的是 I.MX6ULL,所以要關(guān)注“imx-common”這個(gè)文件夾。另外“cpu”這個(gè)文件夾也是和 cpu 架構(gòu)有關(guān)的,打開以后如下圖所示:
從上圖可以看出有多種 ARM 架構(gòu)相關(guān)的文件夾, I.MX6ULL 使用的 Cortex-A7 內(nèi)核,Cortex-A7 屬于 armv7,所以我們要關(guān)心“armv7”這個(gè)文件夾。 cpu 文件夾里面有個(gè)名為“uboot.lds”的鏈接腳本文件,這個(gè)就是 ARM 芯所使用的 u-boot 鏈接腳本文件! armv7 這個(gè)文件夾里面的文件都是跟 ARMV7 架構(gòu)有關(guān)的,是我們分析 uboot 啟動(dòng)源碼的時(shí)候需要重點(diǎn)關(guān)注的,里面還有一些dts設(shè)備樹文件信息。
2.2、 board 文件夾(板子)
board 文件夾就是和具體的板子有關(guān)的,打開此文件夾,里面全是不同的板子,毫無疑問正點(diǎn)原子的開發(fā)板肯定也在里面(正點(diǎn)原子添加的), borad 文件夾里面有個(gè)名為“freescale”的文件夾(恩智浦里找不到,I.MX6ull以前是屬于飛思卡爾的),如下圖所示:
所有使用 freescale 芯片的板子都放到此文件夾中, I.MX 系列以前屬于 freescale,只是freescale 后來被 NXP 收購(gòu)了。打開此 freescale 文件夾,在里面找到和 mx6u(I.MX6UL/ULL)有關(guān)的文件夾,如下圖所示:
上圖中有 5 個(gè)文件夾,這 5 個(gè)文件夾對(duì)應(yīng) 5 種板子,以“mx6ul”開頭的表示使用I.MX6UL 芯片的板子,以 mx6ull 開頭的表示使用 I.MX6ULL 芯片的板子。 mx6ullevk 是 NXP官方的I.MX6ULL開發(fā)板,正點(diǎn)原子的ALPHA開發(fā)板就是在這個(gè)基礎(chǔ)上開發(fā)的,因此mx6ullevk也是正點(diǎn)原子的開發(fā)板。我們后面移植 uboot 到時(shí)候就是參考 NXP 官方的開發(fā)板,也就是要參考 mx6ullevk 這個(gè)文件夾來定義我們的板子。
2.3、 configs 文件夾(defconfig樹莓派內(nèi)核移植學(xué)過)
此文件夾為 uboot 配置文件, uboot 是可配置的,但是你要是自己從頭開始一個(gè)一個(gè)項(xiàng)目的配置,那就太麻煩了,因此一般半導(dǎo)體或者開發(fā)板廠商都會(huì)制作好一個(gè)配置文件。我們可以在這個(gè)做好的配置文件基礎(chǔ)上來添加自己想要的功能,這些半導(dǎo)體廠商或者開發(fā)板廠商制作好的配置文件統(tǒng)一命名為“xxx_defconfig”, xxx 表示開發(fā)板名字,這些 defconfig 文件都存放在 configs文件夾,因此, NXP 官方開發(fā)板和正點(diǎn)原子的開發(fā)板配置文件肯定也在這個(gè)文件夾中,如下圖所示:
上圖中文件就是正點(diǎn)原子 I.MX6U-ALPHA 開發(fā)板所對(duì)應(yīng)的 uboot 默認(rèn)配置文件。我們只關(guān)心 mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig這兩個(gè)文件,分別是正點(diǎn)原子 I.MX6ULL EMMC 核心板和 NAND 核心板的配置文件。使用“make xxx_defconfig”命令即可配置 uboot,比如:
上述命令就是配置正點(diǎn)原子的 I.MX6ULL EMMC 核心板所使用的 uboot。
在編譯 uboot 之前一定要使用 defconfig 來配置 uboot!
在 mx6ull_alientek_emmc.sh 中就有下面這一句:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig這個(gè)就是調(diào)用 mx6ull_14x14_ddr512_emmc_defconfig 來配置 uboot,只是這個(gè)命令還帶了一些其它參數(shù)而已。
2.4、 .u-boot.xxx_cmd 文件
.u-boot.xxx_cmd 是一系列的文件,這些文件都是編譯生成的,都是一些命令文件,比如文件.u-boot.bin.cmd,看名字應(yīng)該是和 u-boot.bin 有關(guān)的,此文件的內(nèi)容如下:
cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin.u-boot.bin.cmd 里面定義了一個(gè)變量: cmd_u-boot.bin,此變量的值為“cp u-boot-nodtb.binu-boot.bin”,也就是拷貝一份 u-boot-nodtb.bin 文件,并且重命名為 u-boot.bin,這個(gè)就是 u-boot.bin的來源,來自于文件 u-boot-nodtb.bin。
那 么 u-boot-nodtb.bin 是 怎 么 來 的 呢 ? 文 件 .u-boot-nodtb.bin.cmd 就 是 用 于 生 成 uboot.nodtb.bin 的,此文件內(nèi)容如下:
cmd_u-boot-nodtb.bin := arm-linux-gnueabihf-objcopy --gap-fill=0xff -j .text -j .secure_text -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn -O binary u-boot u-bootnodtb.bin這里用到了 arm-linux-gnueabihf-objcopy,使用 objcopy 將 ELF 格式的 u-boot 文件轉(zhuǎn)換為二進(jìn)制的 u-boot-nodtb.bin 文件。
文件 u-boot 是 ELF 格式的文件,文件.u-boot.cmd 用于生成 u-boot,文件內(nèi)容如下:
cmd_u-boot := arm-linux-gnueabihf-ld.bfd -pie --gc-sections - Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o --start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o arch/arm/imx-common/built-in.o arch/arm/lib/built-in.o board/freescale/common/built-in.o board/freescale/mx6ull_alientek_emmc/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/builtin.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/builtin.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o -- end-group arch/arm/lib/eabi_compat.o -L /usr/local/arm/gcc-linaro- 4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linuxgnueabihf/4.9.4 -lgcc -Map u-boot.map.u-boot.cmd 使用到了 arm-linux-gnueabihf-ld.bfd,也就是鏈接工具,使用 ld.bfd 將各個(gè) builtin.o 文件鏈接在一就形成了 u-boot 文件。 uboot 在編譯的時(shí)候會(huì)將同一個(gè)目錄中的所有.c 文件都編譯在一起,并命名為 built-in.o,相當(dāng)于將眾多的.c 文件對(duì)應(yīng)的.o 文件集合在一起,這個(gè)就是 u-boot 文件的來源。
如果我們要用 NXP 提供的 MFGTools 工具向開發(fā)板燒寫 uboot,此時(shí)燒寫的是 u-boot.imx文件,而不是 u-boot.bin 文件。 u-boot.imx 是在 u-boot.bin 文件的頭部添加了 IVT、 DCD 等信息。這個(gè)工作是由文件.u-boot.imx.cmd 來完成的,此文件內(nèi)容如下:
cmd_u-boot.imx := ./tools/mkimage -n board/freescale/mx6ull_alientek_emmc/imximage.cfg.cfgtmp -T imximage - e 0x87800000 -d u-boot.bin u-boot.imx可以看出,這里用到了工具 tools/mkimage,而 IVT、 DCD 等數(shù)據(jù)保存在了文件board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp 中 ( 如 果 是 NAND 核 心 板 的 話 就 是imximage-ddr256.cfg.cfgtmp),工具 mkimage 就是讀取文件 imximage-ddr512.cfg.cfgtmp 里面的信息,然后將其添加到文件 u-boot.bin 的頭部,最終生成 u-boot.imx。
文件.u-boot.lds.cmd 就是用于生成 u-boot.lds 鏈接腳本的
2.5、 Makefile 文件
這個(gè)是頂層 Makefile 文件, Makefile 是支持嵌套的,也就是頂層 Makefile 可以調(diào)用子目錄中的 Makefile 文件。 Makefile 嵌套在大項(xiàng)目中很常見,一般大項(xiàng)目里面所有的源代碼都不會(huì)放到同一個(gè)目錄中,各個(gè)功能模塊的源代碼都是分開的,各自存放在各自的目錄中。每個(gè)功能模塊目錄下都有一個(gè) Makefile,這個(gè) Makefile 只處理本模塊的編譯鏈接工作,這樣所有的編譯鏈接工作就不用全部放到一個(gè) Makefile 中,可以使得 Makefile 變得簡(jiǎn)潔明了。uboot 源碼根目錄下的 Makefile 是頂層 Makefile,他會(huì)調(diào)用其它的模塊的 Makefile 文件,比如 drivers/adc/Makefile。當(dāng)然了,頂層 Makefile 要做的工作可遠(yuǎn)不止調(diào)用子目錄 Makefile 這么簡(jiǎn)單。
2.6、 u-boot.xxx 文件
u-boot.xxx 同樣也是一系列文件,包括 u-boot、 u-boot.bin、 u-boot.cfg、 u-boot.imx、 u-boot.lds、u-boot.map、 u-boot.srec、 u-boot.sym 和 u-boot-nodtb.bin,這些文件的含義如下:
| u-boot | 編譯出來的 ELF 格式的 uboot 鏡像文件。 |
| u-boot.bin | 編譯出來的二進(jìn)制格式的 uboot 可執(zhí)行鏡像文件。 |
| u-boot.cfg | uboot 的另外一種配置文件。 |
| u-boot.imx | u-boot.bin 添加頭部信息以后的文件, NXP 的 CPU 專用文件。 |
| u-boot.lds | 鏈接腳本。 |
| u-boot.map | uboot 映射文件,通過查看此文件可以知道某個(gè)函數(shù)被鏈接到了哪個(gè)地址上。 |
| u-boot.srec | S-Record 格式的鏡像文件。 |
| u-boot.sym | uboot 符號(hào)文件。 |
| u-boot-nodtb.bin | 和 u-boot.bin 一樣, u-boot.bin 就是 u-boot-nodtb.bin 的復(fù)制文件。 |
2.7、 .config 文件(make xxx_defconfig生成)
uboot 配置文件, 使用命令“make xxx_defconfig”配置 uboot 以后就會(huì)自動(dòng)生成, .config 內(nèi)容如下:
可以看出.config 文件中都是以“CONFIG_”開始的配置項(xiàng),這些配置項(xiàng)就是 Makefile 中的變量,因此后面都跟有相應(yīng)的值, uboot 的頂層 Makefile 或子 Makefile 會(huì)調(diào)用這些變量值(前面樹莓派的時(shí)候?qū)W過,.config文件引導(dǎo)Makefile把有用的東西組織成內(nèi)核)。在.config 中會(huì)有大量的變量值為‘y’,這些為‘y’的變量一般用于控制某項(xiàng)功能是否使能,為‘y’的話就表示功能使能,比如:
如果使能了 bootd 這個(gè)命令的話, CONFIG_CMD_BOOTM 就為‘y’。在 cmd/Makefile 中有如下代碼:
ifndef CONFIG_SPL_BUILD# core commandobj-y += boot.oobj-$(CONFIG_CMD_BOOTM) += bootm.oobj-y += help.oobj-y += version.o在示例代碼中,有如下所示一行代碼:
obj-$(CONFIG_CMD_BOOTM) += bootm.oCONFIG_CMD_BOOTM=y,將其展開就是:
obj-y += bootm.o也就是給 obj-y 追加了一個(gè)“bootm.o”, obj-y 包含著所有要編譯的文件對(duì)應(yīng)的.o 文件,這里表示需要編譯文件 cmd/bootm.c。相當(dāng)于通過“CONFIG_CMD_BOOTD=y”來使能 bootm 這個(gè)命令,進(jìn)而編譯 cmd/bootm.c 這個(gè)文件,這個(gè)文件實(shí)現(xiàn)了命令 bootm。在 uboot 和 Linux 內(nèi)核中都是采用這種方法來選擇使能某個(gè)功能,編譯對(duì)應(yīng)的源碼文件
2.8、 net文件
之前u-boot網(wǎng)絡(luò)命令的實(shí)現(xiàn)在這里
2.9、 README
README 文件描述了 uboot 的詳細(xì)信息,包括 uboot 該如何編譯、 uboot 中各文件夾的含義、相應(yīng)的命令等等。建議大家詳細(xì)的閱讀此文件,可以進(jìn)一步增加對(duì) uboot 的認(rèn)識(shí)。
總結(jié)
以上是生活随笔為你收集整理的U-Boot源码目录分析(VScode工程创建及文件夹过滤)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存数据库和关系数据库之间的数据同步原理
- 下一篇: c语言写俄罗斯方块(源码)