U-Boot重点源码详解

 其中imxdownload是烧录文件 u-boot*这些文件是编译产生的

 重点关心如下:

1、arch文件夹

此文件夹存放与架构相关的文件,如下图所示:

从图 31.1.3 可以看出有很多架构,比如 arm avr32 m68k 等,我们现在用的是 ARM
片,所以只需要关心 arm 文件夹即可,打开 arm 文件夹里面内容如图 31.1.4 所示:

 

armv7 这个文件夹里面的文件都是跟 ARMV7 架构有关的,是我们分析 uboot 启动源码的时候需要重点关注的
2 board 文件夹
board 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面( 正点原子添加的 ) borad 文件夹里面有个名为“ freescale ”的文件夹。
使用 freescale 芯片的板子都放到此文件夹中, I.MX 系列以前属于 freescale ,只是freescale 后来被 NXP 收购了。打开此 freescale 文件夹,在里面找到和 mx6u(I.MX6UL/ULL) 有关的文件夹。

 

mx6ullevk NXP官方的I.MX6ULL 开发板,正点原子的 ALPHA 开发板就是在这个基础上开发的,因此 mx6ullevk也是正点原子的开发板。我们后面移植 uboot 到时候就是参考 NXP 官方的开发板,也就是要参考 mx6ullevk 这个文件夹来定义我们的板子。
3 configs 文件夹
此文件夹为 uboot 配置文件, uboot 是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig ”, xxx 表示开发板名字,这些 defconfig 文件都存放在 configs文件夹,因此,NXP 官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中
6 个文件就是正点原子 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
4 .u-boot.xxx_cmd 文件
.u-boot.xxx_cmd 是一系列的文件,这些文件都是编译生成的,都是一些命令文件,比如文
.u-boot.bin.cmd ,看名字应该是和 u-boot.bin 有关的,此文件的内容如下:
.u-boot.bin.cmd 里面定义了一个变量: cmd_u-boot.bin ,此变量的值为“ cp u-boot-nodtb.bin
u-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 就是用于生成 u
boot.nodtb.bin 的,此文件内容如下:
这里用到了 arm-linux-gnueabihf-objcopy ,使用 objcopy ELF 格式的 u-boot 文件转换为二
进制的 u-boot-nodtb.bin 文件。
文件 u-boot ELF 格式的文件,文件 .u-boot.cmd 用于生成 u-boot ,文件内容如下:
.u-boot.cmd 使用到了 arm-linux-gnueabihf-ld.bfd ,也就是链接工具,使用 ld.bfd 将各个 built
in.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 文件的头部添加了 IVTDCD 等信息。 这个工作是由文件.u-boot.imx.cmd 来完成的,此文件内容如下:
可以看出,这里用到了工具 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 链接脚本的,由于 .u-boot.lds.cmd 文件内容太
多,这里就不列出来了。 uboot 根目录下的 u-boot.lds 链接脚本就是来源于 arch/arm/cpu/u-boot.lds文件。
还有一些其它的 .u-boot.lds.xxx.cmd 文件,大家自行分析一下,关于 .u-boot.lds.xxx.cmd 文件
就讲解到这里。
5 Makefile 文件
这个是顶层 Makefile 文件, Makefile 是支持嵌套的,也就是顶层 Makefile 可以调用子目录
中的 Makefile 文件 Makefile 嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放
到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模
块目录下都有一个 Makefile 这个 Makefile 只处理本模块的编译链接工作,这样所有的编译链
接工作就不用全部放到一个 Makefile 中,可以使得 Makefile 变得简洁明了。
uboot 源码根目录下的 Makefile 是顶层 Makefile ,他会调用其它的模块的 Makefile 文件,
比如 drivers/adc/Makefile 。当然了,顶层 Makefile 要做的工作可远不止调用子目录 Makefile
么简单,关于顶层 Makefile 的内容我们稍后会有详细的讲解。
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.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 的复制文件。
7 .config 文件
可以看出 .config 文件中都是以“ CONFIG_ ”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值,uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。
.config 中会有大量的变量值为‘ y ’,这些为‘ y ’的变量一般用于控制某项功能是否使能,为‘y ’的话就表示功能使能,比如:
CONFIG_CMD_BOOTM=y
如果使能了 bootd 这个命令的话, CONFIG_CMD_BOOTM 就为‘ y ’。在 cmd/Makefile 中有如下代码:
在示例代码 31.1.6 中,有如下所示一行代码:
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 内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。
8、README
文件描述了 uboot 的详细信息,包括 uboot 该如何编译、 uboot 中各文件夹的含义、相应的命令等等。建议大家详细的阅读此文件,可以进一步增加对 uboot 的认识。
关于 uboot 根目录中的文件和文件夹的含义就讲解到这里,接下来就要开始分析 uboot
启动流程了。
U-Boot 顶层 Makefile 分析
在阅读 uboot 源码之前,肯定是要先看一下顶层 Makefile ,分析 gcc 版本代码的时候一定是先从顶层 Makefile 开始的,然后再是子 Makefile ,这样通过层层分析 Makefile 即可了解整个工程的组织结构。顶层 Makefile 也就是 uboot 根目录下的 Makefile 文件,由于顶层 Makefile 文件内容比较多,所以我们将其分开来看。
1、 版本号
顶层 Makefile 一开始是版本号,内容如下 ( 为了方便分析,顶层 Makefile 代码段前段行号采用 Makefile 中的行号,因为 uboot 会更新,因此行号可能会与你所看的顶层 Makefile 有所不同)
VERSION 主版本号 PATCHLEVEL 补丁版本号 SUBLEVEL 次版本号,这三个一
起构成了 uboot 的版本号,比如当前的 uboot 版本号就是“ 2016.03 ”。 EXTRAVERSION 是附加
版本信息, NAME 是和名字有关的,一般不使用这两个。
2、 MAKEFLAGS 变量
        make 是支持递归调用的,也就是在 Makefile 使用“ make ”命令来执行其他的 Makefile
文件,一般都是子目录中的 Makefile 文件。假如在当前目录下存在一个“ subdir ”子目录,这个
子目录中又有其对应的 Makefile 文件,那么这个工程在编译的时候其主目录中的 Makefile 就可
以调用子目录中的 Makefile ,以此来完成所有子目录的编译。主目录的 Makefile 可以使用如下
代码来编译这个子目录:
$(MAKE) -C subdir
        $(MAKE) 就是调用“ make ”命令 -C 指定子目录。有时候我们需要向子 make 传递变量
这个时候使用“ export ”来导出要传递给子 make 的变量即可,如果不希望哪个变量传递给子
make 的话就使用“ unexport ”来声明不导出 :
export VARIABLE …… //导出变量给子 make
unexport VARIABLE…… //不导出变量给子 make
        有两个特殊的变量:“SHELL ”和“MAKEFLAGS ,这两个变量除非使用“ unexport ”声明,否则的话在整个make 的执行过程中,它们的值始终自动的传递给子 make 。在 uboot 的主 Makefile
中有如下代码:
上述代码使用“ += ”来给变量 MAKEFLAGS 追加了一些值,“ -rR ”表示禁止使用内置的隐含规则和变量定义,“--include-dir ”指明搜索路径, ”$(CURDIR)” 表示当前目录。
3、命令输出
        uboot 默认编译是不会在终端中显示完整的命令,都是短命令
在终端中输出短命令虽然看起来很清爽,但是不利于分析 uboot 的编译过程。可以通过设置变量“V=1 “来实现完整的命令输出,这个在调试 uboot 的时候很有用。
顶层 Makefile 中控制命令输出的代码如下:
上述代码中先使用 ifeq 来判断 "$(origin V)" "command line" 是否相等。这里用到了 Makefile中函数 origin origin 和其他的函数不一样,它不操作变量的值, origin 用于告诉你变量是哪来的,语法为:
$(origin <variable>)
variable 是变量名, origin 函数的返回值就是变量来源,因此 $(origin V) 就是变量 V 的来源
如果变量 V 是在命令行定义的那么它的来源就是 "command line" ,这样 "$(origin V)" "command
line" 就相等了。当这两个相等的时候变量 KBUILD_VERBOSE 就等于 V 的值,比如在命令行中
输 入 “ V=1 “ 的 话 那 么 KBUILD_VERBOSE=1 。 如 果 没 有 在 命 令 行 输 入 V 的 话
KBUILD_VERBOSE=0
80 行判断 KBUILD_VERBOSE 是否为 1 ,如果 KBUILD_VERBOSE 1 的话变量 quiet
Q 都为空,如果 KBUILD_VERBOSE=0 的话变量 quiet 为“ quiet_ “,变量 Q 为“ @ , 综上
所述:
        V=1 的话 :
        KBUILD_VERBOSE=1
        quiet= 空 。
        Q= 空
        V=0 或者命令行不定义 V 的话:
        KBUILD_VERBOSE=0
        quiet= quiet_。
        Q= @。
Makefile 中会用到变量 quiet Q 来控制编译的时候是否在终端输出完整的命令,在顶层
Makefile 中有很多如下所示的命令:
        $(Q)$(MAKE) $(build)=tools
        如果 V=0 的话上述命令展开就是“ @ make $(build)=tools ”, make 在执行的时候默认会在终
端输出命令,但是在命令前面加上“ @ ”就不会在终端输出命令了。当 V=1 的时候 Q 就为空,
上述命令就是“ make $(build)=tools ”,因此在 make 执行的过程,命令会被完整的输出在终端上。
有些命令会有两个版本,比如:
        quiet_cmd_sym ?= SYM $@
        cmd_sym ?= $(OBJDUMP) -t $< > $@
sym 命令分为“ quiet_cmd_sym ”和“ cmd_sym ”两个版本,这两个命令的功能都是一样的,
区别在于 make 执行的时候输出的命令不同。 quiet_cmd_xxx 命令输出信息少,也就是短命令,
cmd_xxx 命令输出信息多,也就是完整的命令。
如果变量 quiet 为空的话,整个命令都会输出。
如果变量 quiet 为“ quiet_ ”的话,仅输出短版本。
如果变量 quiet 为“ silent_ ”的话,整个命令都不会输出。
4、 静默输出
上一小节讲了,设置 V=0 或者在命令行中不定义 V 的话,编译 uboot 的时候终端中显示的短命令,但是还是会有命令输出,有时候我们在编译 uboot 的时候不需要输出命令,这个时候就可以使用 uboot 的静默输出功能。编译的时候使用“ make -s 即可实现静默输出,顶层 Makefile中相应的代码如下:
91 行判断当前正在使用的编译器版本号是否为 4.x ,判断 $(filter 4.%,$(MAKE_VERSION))
和“ ” ( ) 是否相等,如果不相等的话就成立,执行里面的语句。也就是说 $(filter
4.%,$(MAKE_VERSION)) 不为空的话条件就成立,这里用到了 Makefile 中的 filter 函数,这是
个过滤函数,函数格式如下:
$(filter <pattern...>,<text>)
filter 函数表示以 pattern 模式过滤 text 字符串中的单词,仅保留符合模式 pattern 的单词,
可以有多个模式。函数返回值就是符合 pattern 的字符串。因此 $(filter 4.%,$(MAKE_VERSION))
的含义就是在字符串“ MAKE_VERSION ”中找出符合“ 4.% ”的字符 (% 为通配符 )
MAKE_VERSION make 工具的版本号, ubuntu16.04 里面默认自带的 make 工具版本号为 4.1
大家可以输入“ make -v ”查看。因此 $(filter 4.%,$(MAKE_VERSION)) 不为空,条件成立,执行
92~94 行的语句。
92 行也是一个判断语句,如果 $(filter %s ,$(firstword x$(MAKEFLAGS))) 不为空的话条件
成立,变量 quiet 等于“ silent_ ”。这里也用到了函数 filter ,在 $(firstword x$(MAKEFLAGS)))
过滤出符合“ %s ”的单词。到了函数 firstword ,函数 firstword 是获取首单词,函数格式如下:
$(firstword <text>)
firstword 函数用于取出 text 字符串中的第一个单词,函数的返回值就是获取到的单词。当
使用“ make -s ”编译的时候,“ -s ”会作为 MAKEFLAGS 变量的一部分传递给 Makefile 。在顶
Makfile 中添加如图 所示的代码:
两行代码用于输出 $(firstword x$(MAKEFLAGS)) 的结果,最后修改文件 mx6ull_alientek_emmc.sh,在里面加入“ -s ”选项,结果如图
修改完成以后执行 mx6ull_alientek_emmc.sh ,结果如图
        从图 31.3.4.3 可以看出第一个单词是“ xrRs ”,将 $(filter %s ,$(firstword x$(MAKEFLAGS)))
展开就是 $(filter %s, xrRs) ,而 $(filter %s, xrRs) 的返回值肯定不为空,条件成立, quiet=silent_
101 行使用 export 导出变量 quiet Q KBUILD_VERBOSE
5、 设置编译结果输出目录
uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“ O ”来指定
输出目录,比如“ make O=out”就是设置目标文件输出到 out 目录中。这么做是为了将源文件
和编译产生的文件分开,当然也可以不指定 O 参数,不指定的话源文件和编译产生的文件都在
同一个目录内,一般我们不指定 O 参数。顶层 Makefile 中相关的代码如下:
        第 124 判断“ O ”是否来自于命令行,如果来自命令行的话条件成立, KBUILD_OUTPUT
就为 $(O) ,因此变量 KBUILD_OUTPUT 就是输出目录
        第 135 行判断 KBUILD_OUTPUT 是否为空。
        第 139 行调用 mkdir 命令,创建 KBUILD_OUTPUT 目录,并且将创建成功以后的绝对路
径赋值给 KBUILD_OUTPUT 。至此,通过 O 指定的输出目录就存在了。
6、代码检查
uboot 支持代码检查,使用命令“ make C=1 ”使能代码检查,检查那些需要重新编译的文件。“make C=2 ”用于检查所有的源码文件,顶层 Makefile 中的代码如下:
176 行判断 C 是否来源于命令行,如果 C 来源于命令行,那就将 C 赋值给变量
KBUILD_CHECKSRC ,如果命令行没有 C 的话 KBUILD_CHECKSRC 就为 0
7、模块编译
uboot 中允许单独编译某个模块,使用命令“ make M=dir ”即可,旧语法“ make SUBDIRS=dir”也是支持的。顶层 Makefile 中的代码如下:
        第 186 行 判 断 是 否 定 义 了 SUBDIRS , 如 果 定 义 了 SUBDIRS ,变量
KBUILD_EXTMOD=SUBDIRS ,这里是为了支持老语法“ make SUBIDRS=dir
        第 190 行判断是否在命令行定义了 M ,如果定义了的话 KBUILD_EXTMOD=$(M)
        第 197 行判断 KBUILD_EXTMOD 时为空,如果为空的话目标 _all 依赖 all ,因此要先编译
all 。否则的话默认目标 _all 依赖 modules ,要先编译出 modules ,也就是编译模块。一般情况
下我们不会在 uboot 中编译模块,所以此处会编译 all 这个目标。
        第 203 行判断 KBUILD_SRC 是否为空,如果为空的话就设置变量 srctree 为当前目录,即
srctree 为“ . ”,一般不设置 KBUILD_SRC
        第 214 行设置变量 objtree 为当前目录。
        第 215 216 行分别设置变量 src obj ,都为当前目录。
        第 218 行设置 VPATH
        第 220 行导出变量 scrtree objtree VPATH
8、  获取主机架构和系统
接下来顶层 Makefile 会获取主机架构和系统,也就是我们电脑的架构和系统,代码如下:
        第 227 行定义了一个变量 HOSTARCH ,用于保存主机架构,这里调用 shell 命令“uname -m ”获取架构名称,结果如图 31.3.8.1 所示:
9、 设置目标架构、交叉编译器和配置文件
编 译 uboot 的 时 候 需 要 设 置 目 标 板 架 构 和 交 叉 编 译 器 ,“ make ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf- ”就是用于设置 ARCH CROSS_COMPILE ,在顶层
Makefile 中代码如下:
245 行判断 HOSTARCH ARCH 这两个变量是否相等,主机架构 ( 变量 HOSTARCH)
x86_64 ,而我们编译的是 ARM 版本 uboot ,肯定不相等,所以 CROSS_COMPILE= arm-linux
gnueabihf- 。从示例代码 31.3.9.1 可以看出,每次编译 uboot 的时候都要在 make 命令后面设置
ARCH CROSS_COMPILE ,使用起来很麻烦,可以直接修改顶层 Makefile ,在里面加入 ARCH
CROSS_COMPILE 的定义
直接在顶层 Makefile 里面定义 ARCH CROSS_COMPILE ,这样就不用每次编译的时候都要在 make 命令后面定义 ARCH CROSS_COMPILE
继续回到示例代码 中,第 249 行定义变量 KCONFIG_CONFIG uboot 是可以配置的,这里设置配置文件为.config .config 默认是没有的,需要使用命令“ make xxx_defconfig ”对 uboot 进行配置,配置完成以后就会在 uboot 根目录下生成 .config 。默认情况下 .config 和xxx_defconfig 内容是一样的,因为 .config 就是从 xxx_defconfig 复制过来的。如果后续自行调整了 uboot 的一些配置参数,那么这些新的配置参数就添加到了 .config 中,而不是 xxx_defconfig
相当于 xxx_defconfig 只是一些初始配置,而 .config 里面的才是实时有效的配置。
10、调用 scripts/Kbuild.include
Makefile 会调用文件 scripts/Kbuild.include 这个文件,顶层 Makefile 中代码如下:
使用“ include ”包含了文件 scripts/Kbuild.include ,此文件里面定义了很多变量。
uboot 的编译过程中会用到 scripts/Kbuild.include 中的这些变量,后面用到的时候再分析。
11、交叉编译工具变量设置
上面我们只是设置了 CROSS_COMPILE 的名字,但是交叉编译器其他的工具还没有设置, 顶层 Makefile 中相关代码如下:
12、 导出其他变量
接下来在顶层 Makefile 会导出很多变量,代码如下:
这些变量中大部分都已经在前面定义了,我们重点来看一下下面这几个变量:
ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
7 个变量在顶层 Makefile 是找不到的,说明这 7 个变量是在其他文件里面定义的,先来
看一下这 7 个变量都是什么内容,在顶层 Makefile 中输入如图 所示的内容:
修改好顶层 Makefile 以后执行如下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mytest
可以看到这 7 个变量的值,这 7 个变量是从哪里来的呢?在 uboot 根目录下有个文件叫做 config.mk ,这 7 个变量就是在 config.mk 里面定义的,打开 config.mk 内容。
第 25 行 定 义 变 量 ARCH , 值 为 $(CONFIG_SYS_ARCH:"%"=%) , 也 就 是 提 取
CONFIG_SYS_ARCH 里面双引号“”之间的内容。比如 CONFIG_SYS_ARCH=“arm”的话,
ARCH=arm。
第 26 行定义变量 CPU,值为$(CONFIG_SYS_CPU:"%"=%)。
第 32 行定义变量 BOARD,值为(CONFIG_SYS_BOARD:"%"=%)。
第 34 行定义变量 VENDOR,值为$(CONFIG_SYS_VENDOR:"%"=%)。
第 37 行定义变量 SOC,值为$(CONFIG_SYS_SOC:"%"=%)。
第 44 行定义变量 CPUDIR,值为 arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)。
第 46 行 sinclude 和 include 的功能类似,在 Makefile 中都是读取指定文件内容,这里读取
文件$(srctree)/arch/$(ARCH)/config.mk 的内容。sinclude 读取的文件如果不存在的话不会报错。
第 47 行读取文件$(srctree)/$(CPUDIR)/config.mk 的内容。
第 50 行读取文件$(srctree)/$(CPUDIR)/$(SOC)/config.mk 的内容。
第 54 行定义变量 BOARDDIR ,如果定义了 VENDOR 那 么
BOARDDIR=$(VENDOR)/$(BOARD),否则的 BOARDDIR=$(BOARD)。
第 60 行读取文件$(srctree)/board/$(BOARDDIR)/config.mk。
接下来需要找到 CONFIG_SYS_ARCH、CONFIG_SYS_CPU、CONFIG_SYS_BOARD、
CONFIG_SYS_VENDOR 和 CONFIG_SYS_SOC 这 5 个变量的值。这 5 个变量在 uboot 根目录
下的.config 文件中有定义,定义如下:
 
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值