Linux系统移植:U-Boot 工程创建

Linux系统移植:U-Boot 工程创建

本章用于分析 U-Boot 的工程文件目录功能,以及创建一个 U-Boot 工程做开发,此处的 U-Boot 以正点原子修改的 U-Boot 作为示例

一、U-Boot 文件目录

解压正点原子的 uboot 工程文件(工程下载链接 0 积分),目录如下:

20211127165830

我们在 linux 下编译一遍源码,然后把编译后结果放到 win 下,方便观看,编译后文件目录如下:

20211127170324

编译后比编译前多了许多文件,对文件和文件夹做一个梳理:

关键文件夹:

20211127171742

关键文件:

20211127171951

以上就是其关键文件,第二节对他其中 主要文件功能进行一个仔细的分析

二、U-Boot 目录解析

2.1 arch文件夹

文件夹存放着和各种芯片架构的有关文件

20211127201013

imx6ull 是 arm 架构的芯片,所以看一下 arm 文件夹

20211127201238

arm 文件夹内和 imx 有关的是 imx-common 文件夹;同时 cpu 文件夹下有个名为 uboot.lds 的链接脚本文件,这个就是 ARM 芯片所使用的 u-boot 链接脚本文件

20211127201748

cpu 文件夹下存放着各种具体内核架构的配置信息,比如 armv7 就是和 ARM-V7 架构有关的配置信息!

2.2 board 文件夹

该文件夹存放具体型号板子的适配 uboot

20211127202859

imx6ull 在飞思卡尔的板子内,进入可以看到

20211127203040

后面移植修改到原子的板子上,就是在这个基础上进行修改

2.3 config 文件夹

因为 uboot 是可配置的,所以此文件夹为 uboot 配置文件

20211127203545

我们修改时直接基于厂商的配置文件进行修改就行,此处对于原子的开发板来说,我们基于 mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig 这两个文件中的一个进行修改就行(一个是 NAND ,一个是 EMMC),编译 uboot 前使用如下指令根据配置文件配置 uboot

make mx6ull_14x14_ddr512_emmc_defconfig

2.4 .u-boot.xxx_cmd 文件

u-boot.xxx_cmd 是由一系列编译生成的文件,包含一些执行命令,方便调用

比如 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

这条命令使用工具 mkimage 就是读取文件 imximage-ddr512.cfg.cfgtmp 里面的信息,然后将其添加到文件 u-boot.bin 的头部,最终生成 u-boot.imx

2.5 顶层Makefile 文件

图中是顶层 Makefile 文件,Makefile 支持嵌套的(顶层 Makefile 可以调用子目录中的 Makefile 文件)

20211127204912

一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个 Makefile 只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个 Makefile 中,可以使得 Makefile 变得简洁明了

2.6 u-boot.xxx 文件

u-boot.xxx 是一系列编译前后的文件,如下:

20211127205119

文件含义如下

文件 用途
u-boot: 编译出来的 ELF 格式的 uboot 镜像文件。
u-boot.bin: 编译出来的二进制格式的 uboot 可执行镜像文件。
u-boot.cfg: uboot 的另外一种配置文件。
u-boot.imx: u-boot.bin 添加头部信息以后的文件,NXP 的 CPU 专用文件。
u-boot.lds: 链接脚本。
u-boot.map: uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
u-boot.srec: S-Record 格式的镜像文件。
u-boot.sym: uboot 符号文件。
u-boot-nodtb.bin: 和 u-boot.bin 一样,u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。

2.7 .config文件

uboot 配置文件, make xxx_defconfig 命令配置 uboot 以后就会自动生成,该文件中都是以 CONFIG_ 开头的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值和使能标志,用于 Makefile 调用

2.8 README 文件

README 文件是官方或者厂商提供的描述了 uboot 的详细信息,包括 uboot 该如何编译、uboot 中各文件夹的含 义、相应的命令等等,把它当说明书看就行

三、U-Boot 过程创建

我们将前几章编译后的 uboot 源码在 Ubuntu 下面用 vscode 创建一个工程,方便进行二次开发,创建工程步骤如下:

3.1 打开工程文件夹

vscode 打开工程文件夹:

20211128094412

打开后可以看到一堆文件,其中我们有很多文件不需要,所以要建立构建关系,排除一些不需要的文件,不加入工程构建中去

20211128094517

3.2 保存工作区

将工程保存为一个工作区

20211128095657

命名工作区,保存在源码文件根目录下

20211128095738

3.3 建立构建关系

在 VSCode IDE上建名为 .vscode 的文件夹,同时在 .vscode 文件夹中新建一个名为 settings.json 的文件,文件输入如下代码:

{
    
    
    "search.exclude": {
    
    
        "**/node_modules": true,
        "**/bower_components": true,
    },
    "files.exclude": {
    
    
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
    }
}

search.exclude 里面是需要在搜索结果中排除的文件或者文件夹,files.exclude 是左侧工程目录中需要排除的文件或者文件夹,本章要排除的文件如下:

{
    
    
    "search.exclude": {
    
    
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.o":true,
        "**/*.su":true, 
        "**/*.cmd":true,
        "arch/arc":true,
        "arch/avr32":true,
        "arch/blackfin":true,
        "arch/m68k":true,
        "arch/microblaze":true,
        "arch/mips":true,
        "arch/nds32":true,
        "arch/nios2":true,
        "arch/openrisc":true,
        "arch/powerpc":true,
        "arch/sandbox":true,
        "arch/sh":true,
        "arch/sparc":true,
        "arch/x86":true,
        "arch/arm/mach*":true,   
        "arch/arm/cpu/arm11*":true, 
        "arch/arm/cpu/arm720t":true, 
        "arch/arm/cpu/arm9*":true, 
        "arch/arm/cpu/armv7m":true, 
        "arch/arm/cpu/armv8":true, 
        "arch/arm/cpu/pxa":true,
        "arch/arm/cpu/sa1100":true, 
        "board/[a-e]*":true,
        "board/[g-z]*":true,
        "board/[0-9]*":true,
        "board/[A-Z]*":true,
        "board/fir*":true,
        "board/freescale/b*":true,
        "board/freescale/l*":true,
        "board/freescale/m5*":true,
        "board/freescale/mp*":true, 
        "board/freescale/c29*":true, 
        "board/freescale/cor*":true, 
        "board/freescale/mx7*":true, 
        "board/freescale/mx2*":true, 
        "board/freescale/mx3*":true, 
        "board/freescale/mx5*":true, 
        "board/freescale/p*":true, 
        "board/freescale/q*":true, 
        "board/freescale/t*":true, 
        "board/freescale/v*":true, 
        "configs/[a-l]*":true, 
        "configs/[n-z]*":true, 
        "configs/[A-Z]*":true, 
        "configs/M[a-z]*":true, 
        "configs/M[A-Z]*":true, 
        "configs/M[0-9]*":true, 
        "configs/m[a-w]*":true, 
        "configs/m[0-9]*":true, 
        "configs/[0-9]*":true, 
        "include/configs/[a-l]*":true, 
        "include/configs/[n-z]*":true, 
        "include/configs/[A-Z]*":true, 
        "include/configs/m[a-w]*":true, 
        "include/configs/[0-9]*":true, 
    },
    "files.exclude": {
    
    
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,  
        "**/*.o":true,
        "**/*.su":true, 
        "**/*.cmd":true,
        "arch/arc":true,
        "arch/avr32":true,
        "arch/blackfin":true,
        "arch/m68k":true,
        "arch/microblaze":true,
        "arch/mips":true,
        "arch/nds32":true,
        "arch/nios2":true,
        "arch/openrisc":true,
        "arch/powerpc":true,
        "arch/sandbox":true,
        "arch/sh":true,
        "arch/sparc":true,
        "arch/x86":true,
        "arch/arm/mach*":true,   
        "arch/arm/cpu/arm11*":true, 
        "arch/arm/cpu/arm720t":true, 
        "arch/arm/cpu/arm9*":true, 
        "arch/arm/cpu/armv7m":true, 
        "arch/arm/cpu/armv8":true, 
        "arch/arm/cpu/pxa":true,
        "arch/arm/cpu/sa1100":true, 
        "board/[a-e]*":true,
        "board/[g-z]*":true,
        "board/[0-9]*":true,
        "board/[A-Z]*":true,
        "board/fir*":true,
        "board/freescale/b*":true,
        "board/freescale/l*":true,
        "board/freescale/m5*":true,
        "board/freescale/mp*":true, 
        "board/freescale/c29*":true, 
        "board/freescale/cor*":true, 
        "board/freescale/mx7*":true, 
        "board/freescale/mx2*":true, 
        "board/freescale/mx3*":true, 
        "board/freescale/mx5*":true, 
        "board/freescale/p*":true, 
        "board/freescale/q*":true, 
        "board/freescale/t*":true, 
        "board/freescale/v*":true, 
        "configs/[a-l]*":true, 
        "configs/[n-z]*":true, 
        "configs/[A-Z]*":true, 
        "configs/M[a-z]*":true, 
        "configs/M[A-Z]*":true, 
        "configs/M[0-9]*":true, 
        "configs/m[a-w]*":true, 
        "configs/m[0-9]*":true, 
        "configs/[0-9]*":true, 
        "include/configs/[a-l]*":true, 
        "include/configs/[n-z]*":true, 
        "include/configs/[A-Z]*":true, 
        "include/configs/m[a-w]*":true, 
        "include/configs/[0-9]*":true, 
    }
}

保存 json 文件排除完成,我们刷新一下 vscode 工作区看看,可以看到不需要的文件和文件夹已经排除出工作区

20211128100056

猜你喜欢

转载自blog.csdn.net/qq_45396672/article/details/121587664