本文记录了在学习 i.MX6ULL 的 U-Boot 代码时关于环境变量和 U-Boot 命令的一些关键点。
1 环境变量的定义
在 U-Boot 中,使用 #define
和反斜杠 \
来定义多行字符串。
-
反斜杠
\
:- 反斜杠用于指示宏定义在下一行继续。这意味着所有的行将被视为一个连续的字符串。
-
字符串字面量:
- 每一行都是一个字符串字面量,
\0
表示字符串的结束符。这样可以确保每个键值对都是独立的。
- 每一行都是一个字符串字面量,
-
最终效果:
- 这个宏定义最终会被展开为一个长字符串,其中包含多个键值对,每个键值对之间用
\0
分隔。
- 这个宏定义最终会被展开为一个长字符串,其中包含多个键值对,每个键值对之间用
这种方式通常用于定义配置或环境设置,便于在程序中管理和使用。
2 带有 U-Boot 命令的环境变量
#define CONFIG_EXTRA_ENV_SETTINGS \
"findfdt=" \
"if test $fdt_file = undefined; then " \
"if test $board_name = EVK && test $board_rev = 9X9; then " \
"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
"if test $board_name = EVK && test $board_rev = 14X14; then " \
"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
"if test $fdt_file = undefined; then " \
"echo WARNING: Could not determine dtb to use; fi; " \
"fi;\0"
如上面的代码,也是使用 #define
和反斜杠 \
来定义多行字符串,效果就是多行的字符串被连接在一起了。
2.1 U-Boot 命令解析方式
U-Boot 是一个引导加载程序,它有自己的命令解释器,可以执行这些命令。
3 FDT
上文的代码用于查找开发板对应的设备树文件。
FDT是"Flattened Device Tree"(扁平化设备树)的缩写。它是一种用于描述硬件配置的数据结构,在Linux内核中被广泛使用。
扁平化设备树的主要特点包括:
-
它是一种树形结构,有一个名为"/"的根节点,每个节点可以有子节点和属性。
-
FDT用于描述处理器、内存大小和银行、中断配置以及外设等硬件信息。
-
它最初是为PowerPC架构引入的,目的是标准化固件接口。现在,FDT已成为PowerPC、Micro Blaze和SPARC架构中使用的配置方法。
-
使用FDT可以将板级硬件信息从Linux内核中分离出来,使得同一个SoC可以支持多种不同的板子,提高了系统的灵活性。
-
设备树源文件通常使用.dts扩展名,可以通过设备树编译器(DTC)编译成二进制的.dtb文件(设备树blob)。
在嵌入式系统开发中,特别是在使用ARM架构的处理器(如i.MX6ULL)时,理解和使用FDT是非常重要的,因为它已经成为Linux驱动开发中的一个关键概念。
3.1 findfdt 环境变量中的命令解释
findfdt
做的事情就是判断fdt_file
是否为 undefined。如果fdt_file
为 undefined,那么就需要根据板子信息得出所需的.dtb
文件名。此时
fdt_file
为 undefined,因此根据board_name
和board_rev
来判断实际所需的.dtb
文件:
- 如果
board_name
为 EVK 并且board_rev
为 9x9,则fdt_file
为imx6ull-9x9-evk.dtb
。- 如果
board_name
为 EVK 并且board_rev
为 14x14,则fdt_file
设置为imx6ull-14x14-evk.dtb
。因此,IMX6ULL EVK 板子的设备树文件就是
imx6ull-14x14-evk.dtb
。最终,运行findfdt
的结果就是将fdt_file
设置为imx6ull-14x14-evk.dtb
。