1.配置体验
这里面我用的是mx6ull_szm_emmc_deconfig
写了一个脚本来一起配置
打开之后变成:
通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的代码编译进 Uboot 中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。在配置界面下方会有五个按钮,这五个按钮的功能如下:
< Select >:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
< Exit >:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
< Help >:帮助按钮,查看选中菜单的帮助信息。
< Save >:保存按钮,保存修改后的配置文件。
< Load >:加载按钮,加载指定的配置文件。
每个选项有 3 种编译选项:编译进 uboot 中(也就是编译进 u-boot.bin 中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进 uboot 中,此时“[ ]”变成了“[* ]”;按下“N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在 Linux 内核里面很常用,uboot 下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时“[ ]”就会变为“< M >”。
细心的朋友应该会发现,在 mx6ull_alientek_emmc.h 里面我们配置使能了 dhcp 和 ping 命令,但是在图 34.1.3 中 dhcp 和 ping 前面的“[ ]”并不是“[ * ]”,也就是说不编译 dhcp和 ping命令,这不是冲突了吗?实际情况是 dhcp 和 ping 命令是会编译的。之所以在图 34.1.3 中没有体现出来时因为我们是直接在 mx6ull_alientek_emmc.h 中定义的宏 CONFIG_CMD_PING 和CONFIG_CMD_DHCP,而 menuconfig 是通过读取.config 文件来判断能了哪些功能,.config里面并没有宏CONFIG_CMD_PING和CONFIG_CMD_DHCP,所以menuconfig就会识别出错。
使用如下命令编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
千万不能用./mx6ull_alientek_emmc.sh
因为 mx6ull_alientek_emmc.sh 在编译之前会清理工程,会删除掉.config 文件!通过图形化界面配置所有配置项都会被删除,结果就是竹篮打水一场空。
编译完成以后烧写到 SD 卡中,重启开发板进入 uboot 命令模式,输入“?”查看是否有“dns”命令,一般肯定有的。测试一下 dns 命令工作是否正常,使用 dns 命令来查看一下百度官网“www.baidu.com”的 IP 地址。要先设置一下 dns 服务器的 IP 地址,也就是设置环境变量dnsip的值
2、Kconfig 语法简介
2.1 mainmenu
2.2 调用其他目录下的 Kconfig 文件
2.3 menu/endmenu 条目
menu 用于生成菜单,endmenu 就是菜单结束标志,这两个一般是成对出现的
2.4 config 条目
在 menu/endmenu 代码块中有大量的“config xxxx”的代码块,也就是 config 条
目。config 条目就是“General setup”菜单的具体配置项
第 17 行的 string 是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。可以为:bool、tristate、string、hex 和 int,一共 5 种。最常用的是 bool、tristate 和string 这三种,bool 类型有两种值:y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项。tristate 类型有三种值:y、m 和 n,其中 y 和 n 的涵义与 bool类型一样,m 表示将这个配置项编译为模块。string 为字符串类型,所以 LOCALVERSION 是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号。