文章目录
uboot图像化配置
uboot 或 Linux 内核可以通过输入
“make menuconfig”
来打开图形化配置界面,menuconfig
是一套图形化的配置工具,需要 ncurses 库支持
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
menuconfig
重点会用到两个文件:.config
和 Kconfig
- config
文件保存着 uboot 的配置项,使用 menuconfig 配置完 uboot 以后会更新.config 文件
- Kconfig
Kconfig 文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有 Kconfig 文件
在打开图形化配置界面之前,要先使用“make xxx_defconfig”
对 uboot
进行一次默认配置。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- XXX_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
操作方法
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>:帮助按钮,查看选中菜单的帮助信息。
<Save>:保存按钮,保存修改后的配置文件。
<Load>:加载按钮,加载指定的配置文件。
- 键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。
- 菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应菜单。
- 选中子菜单以后按下“Y”键就会将相应的代码编译进 Uboot 中,菜单前面变为“< * >”
- 按下“N”键不编译相应的代码
- 按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。
- 按两下“Esc”键退出,也就是返回到上一级
- 按下“?”键查看此菜单的帮助信息
- 按下“/”打开搜索框,可以在搜索框输入要搜索的内容
配置uboot
“Command line interface --->”
这个配置项,此配置项用于配置 uboot 的命令
在里面就可以进行配置。
保存完后,使用命令编译uboot
bear make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
不要清理工程,会删除掉.config
文件!通过图形化界面配置所有配置项都会被删除
DNS设置
搜索 /DNS,得到路径。退出,进入DNS路径。状态改为Y,括号内为星号。退出并保存图形化配置,打开.configs文件 ,ubuntu终端输入vim .configs
。搜索DNS
,VIM命令行输入/DNS
。发现是Y,就是打开DNS
配置也可以在uboot中可以输入“?”查看是否有“dns”命令
setenv dnsip 114.114.114.114 --> 设置服务器ip地址
saveenv
dns www.baidu.com --> 测试dns命令
menuconfig 图形化配置原理
当输入 make menuconfig
以后会匹配到顶层 Makefile
中的如下代码:
在scripts/kconfig/Makefile
中有如下:
目标 menuconfig
依赖 scripts/kconfig/mconf
,因此 scripts/kconfig/mconf.c
这个文件会被编
译,生成 mconf
这个可执行文件。目标 menuconfig
对应的规则为 scripts/kconfig/mconf Kconfig
,
也就是说 mconf
会调用 uboot
根目录下的 Kconfig
文件开始构建图形配置界面
Kconfig 语法简介
可以参考linux内核源码中的Documentation/kbuild/kconfig-language.txt
mainmenu
mainmenu "U-Boot $UBOOTVERSION Configuration"
# 也就是主目录的主标题是 U-Boot 2016.3 Configuration
$UBOOTVERSION 就是uboot的版本号
调用其他目录下的 Kconfig 文件
和 makefile 一样,Kconfig 也可以调用其他子目录中的 Kconfig 文件
source "xxx/Kconfig" # 其中XXX为具体的路径名
# 在顶层Kconfig文件的最后有这样的代码
source "common/Kconfig"
source "cmd/Kconfig"
source "dts/Kconfig"
source "net/Kconfig"
source "drivers/Kconfig"
source "fs/Kconfig"
source "lib/Kconfig"
source "test/Kconfig"
menu/endmenu 条目
menu 用于 生 成 菜单 , endmenu 就是 菜 单 结束 标 志,这 两 个一般是成对出现的
# 在顶层文件是这样的
menu "General setup"
config LOCALVERSION
string "Local version - append to U-Boot release"
help
Append an extra string to the end of your U-Boot version.
This will show up on your boot log, for example.
The string you set here will be appended after the contents of
any files with a filename matching localversion* in your
object and source tree, in that order. Your total string can
be a maximum of 64 characters.
# .......
endmenu # General setup
menu "Boot images"
# .......
config SYS_CLK_FREQ
depends on ARC || ARCH_SUNXI
int "CPU clock frequency"
help
TODO: Move CONFIG_SYS_CLK_FREQ for all the architecture
endmenu # Boot images
上面就显示了两种子菜单,General setup
和Boot images
其他子菜单是arch/Kconfig
文件生成的或者由顶层 Kconfig
所调用的 common/Kconfig
、cmd/Kconfig
等这些子 Kconfig 文件来创建的
config 条目
在menu -- endmenu
中间会有很对个config条目,其中就是该子菜单中的配置项。
.config
文件中的“CONFIG_xxx”
就是 Kconfig 文件中 config 关键字后面的配置项名字加上“CONFIG_”前缀
config ARCH_AIROHA
bool "选项名"
depends on ARCH_MULTI_V7
select ARM_AMBA
default n
help
Support for Airoha EN7523 SoCs
config —> 选项。
ARCH_AIROHA —> 句柄,可用于控制Makefile,选择编译方式。
bool —> 选择可能:TRUE选中、FALSE不选;选中则编译,不选中则不编译。如果后面选项名字串为空,则表示其不会出现在选择软件列表中。
depends on —> 依赖,后面的选择被选择后,这个选项才能被选。
select —> 当前选项选中后,则select后指定的选项自动被选择。
default—> 缺省配置项。
help—> 帮助信息。
变量类型
- bool
config BSP_USING_WDT
bool "Enable Watchdog Timer"
select RT_USING_WDT
default n
# bool 类型有两种值:y 和 n,
# 当为 y 的时候表示使能这个配置项,
# 当为 n 的时候就禁止这个配置项
- string
config RT_CONSOLE_DEVICE_NAME
string "the device name for console"
default "uart1"
# string 为字符串类型,所以RT_CONSOLE_DEVICE_NAME 是个字符串变量,
# 用来存储字符串,默认是uart1
- int
config BSP_I2C1_SCL_PIN
int "I2C1 scl pin number"
range 1 176
default 116
# 整型变量的取值范围是一个整型的数,range表示范围在1--176
- hex
# 十六进制类型变量的取值范围是一个十六进制的数
# 其使用方法和整型变量用法一致
# 整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。
- tristate
# 三态类型变量的取值范围是 y、n 和 m。
# tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动
# 而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。
depends on 和 select
config ARCH_AIROHA
bool "选项名"
depends on ARCH_MULTI_V7
select ARM_AMBA
default n
help
Support for Airoha EN7523 SoCs
# depends on 说明“ARCH_MULTI_V7”项是依赖“ARCH_AIROHA”项的。
# 也就是说“ARCH_AIROHA”项被选中以后,“ARCH_MULTI_V7”项才能被选中
# select表示的是方向依赖。
# 也就是说“ARCH_AIROHA”项被选中以后,那么“ARM_AMBA”项也就是会被自动的选中
choice/endchoice
# choice语句中定义的变量只有bool和tristate。
# choice/endchoice 代码段定义了一组可选择项,将多个类似的配置项组合在一起。只能选择其中的一个。
choice
prompt "Select clock source"
default BSP_RTC_USING_LSE
config BSP_RTC_USING_LSE
bool "RTC USING LSE"
config BSP_RTC_USING_LSI
bool "RTC USING LSI"
endchoice
# 也就是默认是“BSP_RTC_USING_LSE”,只能在“BSP_RTC_USING_LSE”和“BSP_RTC_USING_LSI”中选中一个
- menuconfig
menu "Hardware Drivers Config"
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART1
bool "Enable UART1"
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
default n
endif
endmenu
# menuconfig:表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)
# config表示菜单中的一个配置项(本身并没有子菜单下的项目)。
# 一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。
- comment
# comment用于注释,也就是在图形化界面中显示一行注释
menu "Hardware Drivers Config"
comment "uart2 pin conflict with Ethernet and PWM"
config BSP_USING_COM2
bool "Enable COM2"
select BSP_USING_UART
select BSP_USING_UART2
default n
endmenu
# 在图形化中就会显示为
*** uart2 pin conflict with Ethernet and PWM
[] Enable COM2
添加自定义菜单
①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。
②、配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
③、配置项的为变量类型为 bool,默认值为 y。
④、配置项菜单名字为“This is my test config”
# 在顶层的Kconfig中的最后endmenu的后面添加代码
menu "My test menu"
comment "this is my test menu"
config MY_TESTCONFIG
bool "This is my test config"
default y
help
This is a empty config, just for test!
endemun #My test menu