14_Uboot图形化配置

news2024/11/20 9:46:11

目录

U-Boot图形化配置体验

make menuconfig过程分析

 Kconfig语法简介

config条目

depends on和select

choice/endchoice

Comment

Source

添加自定义菜单


U-Boot图形化配置体验

uboot或Linux内核可以通过输入"make menuconfig"来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要ncurses库支持。ncurses库提供了一系列的API函数供调用者生成基于文本的图形界面,因此需要先在Ubuntu中安装ncurses库,命令如下:

 menuconfig重点会用到两个文件:config和Kconfig,.config文件前面已经说了,这个文件保存着uboot的配置项,使用menuconfig配置完uboot以后肯定要更新.config文件。Kconfig文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有Kconfig文件。

在打开图形化配置界面之前,要先使用"make xxx_defconfig”对uboot进行一次默认配置,只需要一次即可。如果使用"make clean”清理了工程的话就那就需要重新使用"makexxx_defconfig”再对uboot进行一次配置。进入uboot 根目录,输入如下命令:

 如果已经在uboot的顶层Makefile中定义了ARCH和CROSS_COMPILE的值,那么上述命令可以简化为:

 打开后的图形化界面如图所示:

图就是主界面,主界面上方的英文就是简单的操作说明,操作方法如下:

通过键盘上的"键来选择要配置的菜单,按下"Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的代码编译进Uboot中,菜单前面变为“<*>”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“<M>”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。

在配置界面下方会有五个按钮,这五个按钮的功能如下:

<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。

<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。

<Help>:帮助按钮,查看选中菜单的帮助信息。

<Save>:保存按钮,保存修改后的配置文件。

<Load>:加载按钮,加载指定的配置文件。

在图中共有13个配置主配置项,通过键盘上的上下键调节配置项。后面跟着“--->”表示此配置项是有子配置项的,按下回车键就可以进入子配置项。

我们就以如何使能dns 命令为例,讲解一下如何通过图形化界面来配置 uboot。进入“Command line interface --->”这个配置项,此配置项用于配置uboot的命令,进入以后如图所示:

 从图可以看出,有很多配置项,这些配置项也有子配置项,选择"Network commands--->”,进入网络相关命令配置项,如图所示:

 从图可以看出, uboot中有很多和网络有关的命令,比如bootp、tftpboot、dhep等等。选中dns,然后按下键盘上的“Y”键,此时dns前面的“[]”变成了“[*]”,如图所示:

 每个选项有3种编译选项:编译进uboot中(也就是编译进u-boot.bin中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进uboot中,此时“[]”变成了“[*]”按下"N”表示不编译, "[]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux内核里面很常用, uboot下面不使用,如果要将某个功能编译为模块,那就按下"M",此时“[]”就会变为“<M>”。

细心的朋友应该会发现,在mx6ull_alientek_emmc.h1里面我们配置使能了dhep和ping命令,但是在图中dhep和ping前面的"[]”并不是“[*]”,也就是说不编译dhep和ping命令,这不是冲突了吗?实际情况是dhep和ping命令是会编译的。之所以在图中没有体现出来时因为我们是直接在mx6ull_alientek_emmc.h中定义的宏CONFIG_CMD_PING和CONFIG_CMD_DHCP,而menuconfig是通过读取.config文件来判断使能了哪些功能,.config里面并没有宏CONFIG_CMD_PING和CONFIG_CMD_DHCP,所以menuconfig就会识别出错。

选中dns,然后按下"H”或者"?”键可以打开dns命令的提示信息,如图所示:

 按两下ESC键即可退出提示界面,相当于返回上一层。选择 dns命令以后,按两下ESC键(按两下ESC键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下ESC键,退出到主配界面,如果也没有其他要修改的,那就再次按两下ESC键退出 menuconfig 配置界面。如果修改过配置的话,在退出主界面的时候会有如图所示提示:

 图询问是否保存新的配置文件,通过键盘的一或→键来选择“Yes"项,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了uboot的dns命令,打开.config文件,会发现多了“CONFIG_CMD_DNS=y”这一行,如图中的323行所示:

 使用如下命令编译uboot:

 千万不能使用如下命令:

因为mx6ull_alientek_emmc.sh在编译之前会清理工程,会删除掉.config文件!通过图形化界面配置所有配置项都会被删除,结果就是竹篮打水一场空。

编译完成以后烧写到SD卡中,重启开发板进入 uboot命令模式,输入“?”查看是否有“dns”命令,一般肯定有的。使用dns命令来查看一下百度官网"www.baidu.com"的IP地址。

注意!如果要与外部互联网通信,比如百度官网,这个时候要保证开发板能访问到外部互联网。如果你的开发板和电脑直接用网线连接的,那么肯定无法连接到外部网络,这个时候dns命令查看百度官网也会失败!所以开发板一定要连接到路由器上,而且要保证你的路由器能访问外网,比如手机连接到这个路由器上以后可以正常访问互联网。

要先设置一下dns服务器的IP地址,也就是设置环境变量dnsip的值,命令如下:

 设置好以后就可以使用dns命令查看百度官网的IP 地址了,输入命令:

 结果如图所示:

从图可以看出, "www.baidu.com"的IP地址为14.215.177.38,说明dns命令工作正常。这个就是通过图形化命令来配置uboot,一般用来使能一些命令还是很方便的,这样就不需要到处找命令的配置宏是什么,然后在到配置文件里面去定义。

make menuconfig过程分析

当输入make menuconfig以后会匹配到顶层Makefile的如下代码:

 其中build=-f /scripts/Makefile.build obj,将490行的规则展开就是:

 Makefile.build会读取scripts/kconfig/Makefile中的内容,在scripts/kconfig/Makefile中可以找到如下代码:

 其中obj= scripts/kconfig, silent是设置静默编译的,在这里可以忽略不计,Kconfig-Kconfig,因此扩展以后就是:

 目标menuconfig依赖scripts/kconfig/mconf,"因此scripts/kconfig/mconf.c这个文件会被编译,生成mconf这个可执行文件。目标menuconfig对应的规则scripts/kconfig/mconfKconfig,也就是说mconf会调用uboot根目录下的Kconfig文件开始构建图形配置界面。

 Kconfig语法简介

 已经知道了scripts/kconfig/mconf会调用uboot根目录下的Kconfig文件开始构建图形化配置界面,接下来简单学习一下Kconfig的语法。因为后面学习 Linux 驱动开发的时候可能会涉及到修改Kconfig,对于Kconfig语法我们不需要太深入的去研究,关于Kconfig的详细语法介绍,可以参考linux内核源码(不知为何uboot源码中没有这个文件)中的文件Documentation/kbuild/kconfig-language.txt,大概了解其原理即可。打开uboot 根目录下的Kconfig,这个Kconfig文件就是顶层Kconfig,就以这个文件为例来简单学习一下Kconfig语法。

Mainmenu

顾名思义mainmenu就是主菜单,也就是输入"make menuconfig"以后打开的默认界面,在顶层Kconfig中有如下代码:

 上述代码就是定义了一个名为“U-Boot SUBOOTVERSION Configuration”的主菜单.其中,UBOOTVERSION=2016.03,因此主菜单名为"U-Boot 2016.03 Configuration",如图所示:

 调用其他目录下的Kconfig文件

和makefile一样, Kconfig也可以调用其他子目录中的Kconfig文件,调用方法如下:

 在顶层Kconfig中有如下代码:在顶层Kconfig中有如下代码:

从示例代码34.2.2.2中可以看出,顶层Kconfig 文件调用了很多其他子目录下的Kcofig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。

menu/endmenu条目

menu用于生成菜单, endmenu就是菜单结束标志,这两个一般是成对出现的。在顶层Kconfig中有如下代码:

 

 示例代码34.2.2.3中有两个menu/endmenu代码块,这两个代码块就是两个子菜单,第14行的"menu "General setup""表示子菜单"General setup"。第102行的"menu "Boot images""表示子菜单"Boot images"。体现在主菜单界面中就如图所示:

 在"General setup"菜单上面还有"Architecture select (ARM architecture)""ARMarchitecture”这两个子菜单,但是在顶层Kconfig中并没有看到这两个子菜单对应的menu/endmenu 代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的"Boot timing"、"Console recording"等等这些子菜单,都是分别由顶层Kconfig所调用的common/Kconfig、cmd/Kconfig等这些子Kconfig文件来创建的。

config条目

顶层Kconfig中的“General setup”子菜单内容如下:

 可以看出,在menu/endmenu代码块中有大量的“config xxxx”的代码块,也就是config条目。config条目就是"General setup"菜单的具体配置项,如图所示:

 "config LOCALVERSION”对应着第一个配置项, "config LOCALVERSION-AUTO"对应着第二个配置项,以此类推。我们以“config LOCALVERSION”和“configLOCALVERSION_AUTO”这两个为例来分析一下config配置项的语法:

 第16和26行,这两行都以config关键字开头,后面跟着LOCALVERSIONLOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会下.config 文件中生成 CONFIG_LOCALVERSION_AUTO,由此可知, .config文件中的“CONFIG-xxx" (xxx就是具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上“CONFIG_”前缀。

config关键字下面的这几行是配置项属性,17~24行是LOCALVERSION的属性,27~44行是LOCALVERSION-AUTO的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。

第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是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如图所示:

 string后面的"Local version-append to U-Boot release"就是这个配置项在图形界面上的显示出来的标题。

第18行, help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help的内容。

第27行,说明"CONFIGLOCALVERSION-AUTO"是个bool类型,可以通过按下Y或N 键来使能或者禁止CONFIG_LOCALVERSION_AUTO。

第28行, "default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。

depends on和select

打开arch/Kconfig文件,在里面有这如下代码:

 第9行,"depends on"说明"SYS GENERIC BOARD"项依赖于"HAVE GENERIC BOARD",也就是说"HAVE-GENERIC_BOARD"被选中以后"SYS-GENERIC_BOARD"才能被选中。

第17-20行, "select”表示方向依赖,当选中"ARC"以后, "HAVE_PRIVATE_LIBGCC"、"HAVE GENERIC BOARD"、"SYS GENERIC BOARD”和"SUPPORT OF CONTROL”这四个也会被选中。

choice/endchoice

在arch/Kconfig文件中有如下代码:

choice/endchoice代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。示例代码34.2.2.7就是选择处理器架构,可以从ARC、ARM、AVR32等这些架构中选择,这里是单选。在uboot图形配置界面上选择" Architecture select”,进入以后如图所示: 

 

 可以在图中通过移动光标来选择所使用的CPU架构。第12行的prompt给出这个choice/endchoice 段的提示信息为“Architecture select”。

Menuconfig

menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:

 第1行,定义了一个可选的菜单MODULES,只有选中了MODULES第3-5行if到endif之间的内容才会显示。在顶层Kconfig中有如下代码:

 

第74~99行使用menuconfig实现了一个菜单,路径如下: 

 

 如图所示:

 从图可以看到,前面有“[]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码34.2.2.9中的第83-99行所描述的菜单,如图所示:

 如果不选择"Configure standard U-Boot features (expert users)",那么示例代码34.2.2.9中的第83-99行所描述的菜单就不会显示出来,进去以后是空白的。

Comment

comment用于注释,也就是在图形化界面中显示一行注释,打开文件drivers/mtd/nand/Kconfig,有如下所示代码:

 

 

 第81行使用comment标注了一行注释,注释内容为: "Generic NANDoptions",这行注释在配置项NAND_ARASAN的下面。在图形化配置界面中按照如下路径打开:

 

 结果如图所示:

 从图可以看出,在配置项“Configure Arasan Nand”下面有一行注释,注释内容为“*** Generic NAND options ***”

Source

source用于读取另一个Kconfig,比如:

 

 基本上常用的语法就是这些,因为uboot相比Linux内核要小很多,所以配置项也要少很多,所以建议大家使用uboot来学习Kconfig。一般不会修改uboot中的Kconfig文件,甚至都不会使用uboot 的图形化界面配置工具

添加自定义菜单

图形化配置工具的主要工作就是在.config下面生成前缀为“CONFIG_”的变量,这些变量一般都要值,为y, m或n,在uboot源码里面会根据这些变量来决定编译哪个文件。自定义菜单要求如下:

1.在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。

2.配置项为"MY_TESTCONFIG”,此配置项处于菜单"My test menu”中。

3.配置项的为变量类型为 bool,默认值为y。

4.配置项菜单名字为“This is my test config”。

5.配置项的帮助内容为“This is a empty config, just for tset!”。

打开顶层Kconfig,在最后面加入如下代码:

 添加完成以后打开图形化配置界面,如图所示:

 

 从图可以看出,主菜单最后面出现了一个名为"My test menu”的子菜单,这个就是我们上面添加进来的子菜单。进入此子菜单,如图所示:

 

 从图可以看出,配置项添加成功,选中"This is my test config"配置项,然后按下"H”键打开帮助文档,如图所示:

 

 从图可以看出,帮助信息也正确。配置项MY TESTCONFIG默认也是被选中的,因此在.config文件中肯定会有"CONFIG_MY_TESTCONFIG-y”这一行,如图所示:

 至此,我们在主菜单添加自己的自定义菜单就成功了,以后大家如果去半导体原厂工作的话,如果要编写Linux驱动,那么很有可能需要你来修改甚至编写Kconfig文件。最主要的是记住:Kconfig文件的最终目的就是在.config 文件中生成以“CONFIG_”开头的变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理-存储系统-外部存储虚拟存储器

目录 一、外部存储 1.1磁盘组成 1.2性能指标 1.3磁盘地址 1.4硬盘的工作原理 1.5磁盘阵列 二、 固态硬盘SSD 三、虚拟存储器(存储系统详细知识点) 3.1 页式存储器 逻辑地址-》主存(物理)地址 加入块表(TLB)的转换过程 3.2 段式存储器 3.3 段页式存储器 一、外部存储 又称…

一个非系统工程师所关心的——Android开机流程

一、Loader层 1. Boot ROM: 上电后&#xff0c;BootRom会被激活&#xff0c;引导芯片代码开始从预定义的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;然后加载引导程序到RAM。 2. Boot Loader引导程序 Android是基于Linux系统的&#xff0c;它没有BIO…

路由器端口映射-原理+图解

文章目录 1. 前言2. 内部服务器3. 内网IP3.1 含义3.2 查询内网IP方法3.3 直观法判断内网IP 4. 内部端口5. 外部端口6. 远程桌面连接7. 端口映射原理图8. 欢迎纠正~ 1. 前言 端口映射就是可将N台主机的内网IP地址映射成一个公网IP地址&#xff0c;从而让外网可以访问到局域网内…

Linux 学习笔记(九):基于 TSS 的进程切换

一、TSS 基本概念 1、什么是 TSS &#xff1f; TSS&#xff08;Task State Segment&#xff09;即任务状态段。具体的说&#xff0c;在设计 “Intel 架构”&#xff08;即 x86 系统结构&#xff09;时&#xff0c;每个任务&#xff08;进程or线程&#xff09;都对应有一个独立…

Java经典笔试题—day13

Java经典笔试题—day13 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;参数解析&#x1f36d;跳石板 &#x1f50e;结尾 &#x1f50e;选择题 (1)一个关系数据库文件中的各条记录 &#xff08;&#xff09; A. 前后顺序不能任意颠倒&#xff0c;一定要按照输入的顺序排…

测试4-数据库设计

测试4-数据库设计 目录 测试4-数据库设计选择题简答题1. 画E-R图并将其转换为适当的关系模型题目E-R图关系模型 2. 画E-R图并将其转换为关系模型题目E-R图关系模型 选择题 下列关于数据库运行和维护的叙述中&#xff0c;正确的是D。 A &#xff0e;只要数据库正式投入运行&…

网狐大联盟服务端源码分析之服务核心-ServiceCore-Base64编解码实现

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

shell变量类型含义 长方形面积计算 截取相应字段方法

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …

spring之spring入门程序

1.创建Maven Module 2.pom.xml引入依赖 此图引用于https://www.cnblogs.com/Zz-maker/p/11199331.html Maven种的依赖的传递性&#xff0c;spring-context依赖于core,beans,aop,expression等模块&#xff0c;但是在pom.xml中只引用spring-context即可&#xff1a; <?xml v…

WhatsApp与电子商务,最佳拍档

您可以通过将 WhatsApp 整合到您的电子商务业务策略中。首先&#xff0c;您可以从将WhatsApp集成到您的客服渠道&#xff0c;与您的其他客户沟通渠道形成交互&#xff0c;并统一进行客户管理与回复&#xff0c;您需要一个工具做到——SaleSmartly&#xff08;ss客服&#xff09…

UI自动化测试、接口测试等自动化测试详解

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 一.UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操…

030:Mapbox GL设置渐变矢量矩形

第030个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据,构成渐变的矩形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共109行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

第十三章 常用类(包装类和 String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据类型的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 publi…

html面试复习

目录 网页的显示过程 浏览器的渲染引擎 不同浏览器的内核 什么是标记语言&#xff08;markup language &#xff09; 什么是超文本&#xff08; HyperText &#xff09; 完整的html结构 文档声明 html元素 head元素 body元素 html元素 img标签 a标签 锚点链接 i…

链接投票二维码制作投票的链接制作投票链接的制作

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计

原文标题&#xff1a;Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules 代码&#xff1a;https://github.com/aspuru-guzik-group/chemical_vae 原文链接&#xff1a;https://pubs.acs.org/doi/10.1021/acscentsci.7b00572 Automatic…

涨点神器:基于Yolov5/Yolov7的小目标性能提升

1.小目标介绍 目标检测近十年涌现了一大批如Faster R-CNN、RetinaNet、YOLO等可以在工业界实用的目标检测方法,但小目标检测性能差的问题至今也没有被完全解决。因为Swin Transformer的提出,COCO test-dev上的 AP 已经刷到64 ,但小目标检测性能(即APS )和大目标检测性能(…

什么是MQTT?mqtt协议和http协议区别

摘要&#xff1a; 什么是MQTT&#xff1f;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;译为&#xff1a;消息队列遥测传输&#xff0c;是一种轻量级的通讯协议&#xff0c;用于在网络上传输消息。MQTT 最初由 IBM 发布&#xff0c;后来成为 OASIS&#xf…

图解LeetCode——138. 复制带随机指针的链表

一、题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。…

研报精选230525

目录 【行业230525中泰证券】半导体行业深度报告&#xff1a;解析英伟达成长的核心战略&#xff1a;研发为底、生态为径、AI为翼 【行业230525西南证券】医药行业周报&#xff1a;行情回暖&#xff0c;持续精选个股 【行业230525国元证券】2023年中期军工行业投资策略&#xff…