日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

U-Boot源码目录分析(VScode工程创建及文件夹过滤)

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 U-Boot源码目录分析(VScode工程创建及文件夹过滤) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:U-Boot工程目錄介紹
作者:一只青木呀
發布時間: 2020-10-21 14:47:30
網址:https://blog.csdn.net/weixin_45309916/article/details/109199081

目錄

  • 0、Uboot下載編譯
  • VScode工程創建及文件夾過濾
  • 2、重要文件
    • 2.1、arch文件夾(架構)
    • 2.2、 board 文件夾(板子)
    • 2.3、 configs 文件夾(defconfig樹莓派內核移植學過)
    • 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

上一章我們詳細的講解了uboot 的使用方法,其實就是各種命令的使用,學會uboot 使用以后就可以嘗試 移植uboot 到自己的開發板上了,但是在移植之前需要我們得 ①先分析一遍uboot的啟動流程源碼,②捋一下uboot 的啟動流程,否則移植的時候都不知道該修改那些文件。本章我們就來分析一下正點原子提供的uboot 源碼,重點是分析uboot 啟動流程,而不是整個uboot
源碼,uboot 整個源碼非常大,我們只看跟我們關心的部分即可。

0、Uboot下載編譯

首先得下載好uboot文件,并進行編譯。

uboot下載:https://blog.csdn.net/weixin_45309916/article/details/109176510

進行編譯后再進行分析

編譯后的文件

編譯后的文件夾及其文件含義:

類型名字描述備注
文件夾api與硬件無關的API函數uboot自帶
文件夾arch(架構)與架構有關的代碼uboot自帶
文件夾board不同板子(開發板)的定制代碼uboot自帶
文件夾cmd命令相關代碼uboot自帶
文件夾common通用代碼uboot自帶
文件夾config配置文件uboot自帶
文件夾disk與磁盤分區相關代碼uboot自帶
文件夾doc文檔uboot自帶
文件夾drivers驅動代碼uboot自帶
文件夾dts設備樹uboot自帶
文件夾example示例代碼uboot自帶
文件夾fs文件系統uboot自帶
文件夾include頭文件數uboot自帶
文件夾lib與庫文件uboot自帶
文件夾Licenses許可證相關文件uboot自帶
文件夾net網絡相關文件uboot自帶
文件夾post上電自檢程序uboot自帶
文件夾scripts腳本文件uboot自帶
文件夾test測試代碼uboot自帶
文件夾tools工具文件夾uboot自帶
文件.config配置文件,重要的文件編譯成成的文件
文件.gitignoregit工具相關文件uboot自帶
文件.mailmap郵件列表uboot自帶
文件.u-boot.xxx.cmd(一系列)這是一系列的文件,用于保存著一些命令編譯生成的文件
文件config.mk某個Makefile會調用此文件uboot自帶
文件Kbuild用于生成一些和匯編有關的文件。uboot自帶
文件Kconfig圖形配置界面描述文件uboot自帶
文件MAINTAINERS維護者聯系方式文件uboot自帶
文件MAKEALL一個shell腳本,幫助生成uboot的uboot自帶
文件Makefile主 Makefile,重要文件!uboot自帶
文件README相當于幫助文檔。uboot自帶
文件System.map系統映射文件編譯成成的文件
文件u-boot系統映射文件編譯成成的文件
文件u-boot.xxx(一系列)生成的一些 u-boot 相關文件,包括u-boot.bin、 u-boot.imx.等編譯成成的文件

上表中的很多文件夾和文件我們都不需要去關心,我們要關注的文件夾或文件如下:

VScode工程創建及文件夾過濾

先在Ubuntu 下編譯一下uboot,然后將編譯后的uboot 文件夾復制到windows 下,并創建VScode 工程。打開VScode,選擇:文件->打開文件夾…,選中uboot 文件夾,如圖31.2.1 所示:

打開uboot 目錄以后,VSCode 界面如圖31.2.2 所示:


點擊“文件->將工作區另存為…”,打開保存工作區對話框,將工作區保存到uboot 源碼根目錄下,設置文件名為“uboot”,如圖31.2.3 所示:

保存成功以后就會在uboot 源碼根目錄下存在一個名為uboot.code-workspace 的文件。這樣一個完整的VSCode 工程就建立起來了。但是這個VSCode 工程包含了uboot 的所有文件,uboot中有些文件是不需要的,比如arch 目錄下是各種架構的文件夾,如圖31.2.4 所示:

在arch 目錄下,我們只需要arm 文件夾,所以需要將其它的目錄從VSCode 中給屏蔽掉,比如將arch/avr32 這個目錄給屏蔽掉。
在VSCode 上建名為“.vscode”的文件夾,如圖31.2.5 所示:


輸入新建文件夾的名字,完成以后如圖31.2.6 所示。

在.vscode 文件夾中新建一個名為“settings.json”的文件,然后在settings.json 中輸入如下內容:

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 }

結果如圖31.2.7 所示:


其中"search.exclude"里面是需要在搜索結果中排除的文件或者文件夾,"files.exclude"是左側工程目錄中需要排除的文件或者文件夾。我們需要將arch/avr32 文件夾下的所有文件從搜索結果和左側的工程目錄中都排除掉,因此在"search.exclude"和"files.exclude"中輸入如圖31.2.8 所示內容:


保存一下settings.json 文件,然后再看一下左側的工程目錄,發現arch 目錄下沒有avr32 這個文件夾了,說明avr32 這個文件夾被排除掉了,如圖31.2.9 所示:

我們只是在"search.exclude"和"files.exclude"中加入了:“arch/avr32”: true,冒號前面的是要排除的文件或者文件夾,冒號后面為是否將文件排除,true 表示排除,false 表示不排除。用這種方法即可將不需要的文件,或者文件夾排除掉,對于本章我們分析uboot 而言,"search.exclude"和"files.exclude"中需要輸入的完成的內容如下:

1 "**/*.o":true, 2 "**/*.su":true, 3 "**/*.cmd":true, 4 "arch/arc":true, 5 "arch/avr32":true, 6 "arch/blackfin":true, 7 "arch/m68k":true, 8 "arch/microblaze":true, 9 "arch/mips":true, 10 "arch/nds32":true, 11 "arch/nios2":true, 12 "arch/openrisc":true, 13 "arch/powerpc":true, 14 "arch/sandbox":true, 15 "arch/sh":true, 16 "arch/sparc":true, 17 "arch/x86":true, 18 "arch/arm/mach*":true, 19 "arch/arm/cpu/arm11*":true, 20 "arch/arm/cpu/arm720t":true, 21 "arch/arm/cpu/arm9*":true, 22 "arch/arm/cpu/armv7m":true, 23 "arch/arm/cpu/armv8":true, 24 "arch/arm/cpu/pxa":true, 25 "arch/arm/cpu/sa1100":true, 26 "board/[a-e]*":true, 27 "board/[g-z]*":true, 28 "board/[0-9]*":true, 29 "board/[A-Z]*":true, 30 "board/fir*":true, 31 "board/freescale/b*":true, 32 "board/freescale/l*":true, 33 "board/freescale/m5*":true, 34 "board/freescale/mp*":true, 35 "board/freescale/c29*":true, 36 "board/freescale/cor*":true, 37 "board/freescale/mx7*":true, 38 "board/freescale/mx2*":true, 39 "board/freescale/mx3*":true, 40 "board/freescale/mx5*":true, 41 "board/freescale/p*":true, 42 "board/freescale/q*":true, 43 "board/freescale/t*":true, 44 "board/freescale/v*":true, 45 "configs/[a-l]*":true, 46 "configs/[n-z]*":true, 47 "configs/[A-Z]*":true, 48 "configs/M[a-z]*":true, 49 "configs/M[A-Z]*":true, 50 "configs/M[0-9]*":true, 51 "configs/m[a-w]*":true, 52 "configs/m[0-9]*":true, 53 "configs/[0-9]*":true, 54 "include/configs/[a-l]*":true, 55 "include/configs/[n-z]*":true, 56 "include/configs/[A-Z]*":true, 57 "include/configs/m[a-w]*":true,

上述代碼用到了通配符“ * ”,比如 “ * * / * .o”表示所有.o 結尾的文件。“configs/[a-l] *”表示configs 目錄下所有以‘a’~‘l’開頭的文件或者文件夾。上述配置只是排除了一部分文件夾,大家在實際的使用中可以根據自己的實際需求來選擇將哪些文件或者文件夾排除掉。排除以后我們的工程就會清爽很多,搜索的時候也不會跳出很多文件了。

2、重要文件

2.1、arch文件夾(架構)

這個文件夾里面存放著和架構有關的文件,如下圖所示:

從上圖可以看出有很多架構,比如 arm、 avr32、 m68k 等,我們現在用的是 ARM 芯片,所以只需要關心 arm 文件夾即可,打開 arm 文件夾里面內容如下圖所示:


mach 開頭的文件夾是跟具體的設備有關的,比如“mach-exynos”就是跟三星的 exyons 系列 CPU 有關的文件、還有樹莓派使用的mach-bcm283x。我們使用的是 I.MX6ULL,所以要關注“imx-common”這個文件夾。另外“cpu”這個文件夾也是和 cpu 架構有關的,打開以后如下圖所示:


從上圖可以看出有多種 ARM 架構相關的文件夾, I.MX6ULL 使用的 Cortex-A7 內核,Cortex-A7 屬于 armv7,所以我們要關心“armv7”這個文件夾。 cpu 文件夾里面有個名為“uboot.lds”的鏈接腳本文件,這個就是 ARM 芯所使用的 u-boot 鏈接腳本文件! armv7 這個文件夾里面的文件都是跟 ARMV7 架構有關的,是我們分析 uboot 啟動源碼的時候需要重點關注的,里面還有一些dts設備樹文件信息。

2.2、 board 文件夾(板子)

board 文件夾就是和具體的板子有關的,打開此文件夾,里面全是不同的板子,毫無疑問正點原子的開發板肯定也在里面(正點原子添加的), borad 文件夾里面有個名為“freescale”的文件夾(恩智浦里找不到,I.MX6ull以前是屬于飛思卡爾的),如下圖所示:

所有使用 freescale 芯片的板子都放到此文件夾中, I.MX 系列以前屬于 freescale,只是freescale 后來被 NXP 收購了。打開此 freescale 文件夾,在里面找到和 mx6u(I.MX6UL/ULL)有關的文件夾,如下圖所示:

上圖中有 5 個文件夾,這 5 個文件夾對應 5 種板子,以“mx6ul”開頭的表示使用I.MX6UL 芯片的板子,以 mx6ull 開頭的表示使用 I.MX6ULL 芯片的板子。 mx6ullevk 是 NXP官方的I.MX6ULL開發板,正點原子的ALPHA開發板就是在這個基礎上開發的,因此mx6ullevk也是正點原子的開發板。我們后面移植 uboot 到時候就是參考 NXP 官方的開發板,也就是要參考 mx6ullevk 這個文件夾來定義我們的板子。

2.3、 configs 文件夾(defconfig樹莓派內核移植學過)

此文件夾為 uboot 配置文件, uboot 是可配置的,但是你要是自己從頭開始一個一個項目的配置,那就太麻煩了,因此一般半導體或者開發板廠商都會制作好一個配置文件。我們可以在這個做好的配置文件基礎上來添加自己想要的功能,這些半導體廠商或者開發板廠商制作好的配置文件統一命名為“xxx_defconfig”, xxx 表示開發板名字,這些 defconfig 文件都存放在 configs文件夾,因此, NXP 官方開發板和正點原子的開發板配置文件肯定也在這個文件夾中,如下圖所示:

上圖中文件就是正點原子 I.MX6U-ALPHA 開發板所對應的 uboot 默認配置文件。我們只關心 mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig這兩個文件,分別是正點原子 I.MX6ULL EMMC 核心板和 NAND 核心板的配置文件。使用“make xxx_defconfig”命令即可配置 uboot,比如:

make mx6ull_14x14_ddr512_emmc_defconfig

上述命令就是配置正點原子的 I.MX6ULL EMMC 核心板所使用的 uboot。

在編譯 uboot 之前一定要使用 defconfig 來配置 uboot!

在 mx6ull_alientek_emmc.sh 中就有下面這一句:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig

這個就是調用 mx6ull_14x14_ddr512_emmc_defconfig 來配置 uboot,只是這個命令還帶了一些其它參數而已。

2.4、 .u-boot.xxx_cmd 文件

.u-boot.xxx_cmd 是一系列的文件,這些文件都是編譯生成的,都是一些命令文件,比如文件.u-boot.bin.cmd,看名字應該是和 u-boot.bin 有關的,此文件的內容如下:

cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin

.u-boot.bin.cmd 里面定義了一個變量: cmd_u-boot.bin,此變量的值為“cp u-boot-nodtb.binu-boot.bin”,也就是拷貝一份 u-boot-nodtb.bin 文件,并且重命名為 u-boot.bin,這個就是 u-boot.bin的來源,來自于文件 u-boot-nodtb.bin。

那 么 u-boot-nodtb.bin 是 怎 么 來 的 呢 ? 文 件 .u-boot-nodtb.bin.cmd 就 是 用 于 生 成 uboot.nodtb.bin 的,此文件內容如下:

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 文件轉換為二進制的 u-boot-nodtb.bin 文件。

文件 u-boot 是 ELF 格式的文件,文件.u-boot.cmd 用于生成 u-boot,文件內容如下:

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 將各個 builtin.o 文件鏈接在一就形成了 u-boot 文件。 uboot 在編譯的時候會將同一個目錄中的所有.c 文件都編譯在一起,并命名為 built-in.o,相當于將眾多的.c 文件對應的.o 文件集合在一起,這個就是 u-boot 文件的來源。

如果我們要用 NXP 提供的 MFGTools 工具向開發板燒寫 uboot,此時燒寫的是 u-boot.imx文件,而不是 u-boot.bin 文件。 u-boot.imx 是在 u-boot.bin 文件的頭部添加了 IVT、 DCD 等信息。這個工作是由文件.u-boot.imx.cmd 來完成的,此文件內容如下:

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 等數據保存在了文件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 文件

這個是頂層 Makefile 文件, Makefile 是支持嵌套的,也就是頂層 Makefile 可以調用子目錄中的 Makefile 文件。 Makefile 嵌套在大項目中很常見,一般大項目里面所有的源代碼都不會放到同一個目錄中,各個功能模塊的源代碼都是分開的,各自存放在各自的目錄中。每個功能模塊目錄下都有一個 Makefile,這個 Makefile 只處理本模塊的編譯鏈接工作,這樣所有的編譯鏈接工作就不用全部放到一個 Makefile 中,可以使得 Makefile 變得簡潔明了。uboot 源碼根目錄下的 Makefile 是頂層 Makefile,他會調用其它的模塊的 Makefile 文件,比如 drivers/adc/Makefile。當然了,頂層 Makefile 要做的工作可遠不止調用子目錄 Makefile 這么簡單。

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編譯出來的二進制格式的 uboot 可執行鏡像文件。
u-boot.cfguboot 的另外一種配置文件。
u-boot.imxu-boot.bin 添加頭部信息以后的文件, NXP 的 CPU 專用文件。
u-boot.lds鏈接腳本。
u-boot.mapuboot 映射文件,通過查看此文件可以知道某個函數被鏈接到了哪個地址上。
u-boot.srecS-Record 格式的鏡像文件。
u-boot.symuboot 符號文件。
u-boot-nodtb.bin和 u-boot.bin 一樣, u-boot.bin 就是 u-boot-nodtb.bin 的復制文件。

2.7、 .config 文件(make xxx_defconfig生成)

uboot 配置文件, 使用命令“make xxx_defconfig”配置 uboot 以后就會自動生成, .config 內容如下:

可以看出.config 文件中都是以“CONFIG_”開始的配置項,這些配置項就是 Makefile 中的變量,因此后面都跟有相應的值, uboot 的頂層 Makefile 或子 Makefile 會調用這些變量值(前面樹莓派的時候學過,.config文件引導Makefile把有用的東西組織成內核)。在.config 中會有大量的變量值為‘y’,這些為‘y’的變量一般用于控制某項功能是否使能,為‘y’的話就表示功能使能,比如:

CONFIG_CMD_BOOTD=y

如果使能了 bootd 這個命令的話, 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.o

CONFIG_CMD_BOOTM=y,將其展開就是:

obj-y += bootm.o

也就是給 obj-y 追加了一個“bootm.o”, obj-y 包含著所有要編譯的文件對應的.o 文件,這里表示需要編譯文件 cmd/bootm.c。相當于通過“CONFIG_CMD_BOOTD=y”來使能 bootm 這個命令,進而編譯 cmd/bootm.c 這個文件,這個文件實現了命令 bootm。在 uboot 和 Linux 內核中都是采用這種方法來選擇使能某個功能,編譯對應的源碼文件

2.8、 net文件

之前u-boot網絡命令的實現在這里

2.9、 README

README 文件描述了 uboot 的詳細信息,包括 uboot 該如何編譯、 uboot 中各文件夾的含義、相應的命令等等。建議大家詳細的閱讀此文件,可以進一步增加對 uboot 的認識。

總結

以上是生活随笔為你收集整理的U-Boot源码目录分析(VScode工程创建及文件夹过滤)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。