快讯
HOME
快讯
正文内容
uboot nand配置 Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品
发布时间 : 2025-03-17
作者 : 小编
访问数量 : 23
扫码分享至微信

Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品

作为一名过来人,uboot、kernel对每个学linux的来说都有很深的情谊,因为它们是一个系统跑起来的最基础,每个学linux的都会首先接触到。而它们本身就是一个精美的小系统,里边代码所体现的逻辑、算法以及每个绝妙的C知识点都让你沉醉其中。

uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核。具体内容如下:

1 u­boot 的介绍及系统结构

1.1 u­boot 介绍

1.2 获取 u­boot

1.3 u­boot 体系结构

1.3.1 u­boot 目录结构

2 uboot 的启动过程及工作原理

2.1 启动模式介绍

2.2 阶段 1 介绍

2.2.1 定义入口

2.2.2 设置异常向量

2.2.3 设置 CPU 的模式为 SVC 模式

2.2.4 关闭看门狗

2.2.5 禁掉所有中断

2.2.6 设置以 CPU 的频率

2.2.7 设置 CP15

2.2.8 配置内存区控制寄存器

2.2.9 安装 U­BOOT 使的栈空间

2.2.10 BSS 段清 0

2.2.11 搬移 Nand Flash 代码

2.2.12 进入 C 代码部分

2.3 阶段 2 的 C 语言代码部分 

2.3.1 调用一系列的初始化函数

2.3.2 初始化网络设备

2.3.3 进入主 UBOOT 命令行

2.4 代码搬运

3 uboot 的移 植过程

3.1 环境

3.2 步骤

3.2.1 修改 Makefile

3.2.2 在 board 子目录中建立 crane2410

3.2.3 在 include/configs/中建立配置头文件

3.2.4 指定交叉编译工具的路径

3.2.5 测试编译能否成功

3.2.6 修改 lowlevel_init.S 文件

2.9 UBOOT 的 Nand Flash 移植

3.2.8 重新编译 u­boot

3.2.9 把 u­boot 烧入 flash

4.2 常用命令使用说明

4.2.1 askenv(F)

在标准输入(stdin)获得环境变量。

4.2.2 autoscr

从内存(Memory)运行脚本。(注意,从下载地址开始,例如我们的开发板是从 0x30008000 处开始运

行).

CRANE2410 # autoscr 0x30008000

## Executing script at 30008000

4.2.3 base

打印或者设置当前指令与下载地址的地址偏移。

4.2.4 bdinfo

打印开发板信息

CRANE2410 # bdinfo

-arch_number = 0x000000C1 (CPU 体系结构号)

-env_t = 0x00000000 (环境变量)

-boot_params = 0x30000100 (启动引导参数)

-DRAM bank = 0x00000000 (内存区)

--> start = 0x30000000 (SDRAM 起始地址)

--> size = 0x04000000 (SDRAM 大小)

-ethaddr = 01:23:45:67:89:AB (以太网地址)

-ip_addr = 192.168.1.5 (IP 地址)

-baudrate = 115200 bps (波特率)

4.2.5 bootp

通过网络使用 Bootp 或者 TFTP 协议引导境像文件。

CRANE2410 # help bootp

bootp [loadAddress] [bootfilename]

4.2.6 bootelf

默认从 0x30008000 引导 elf 格式的文件(vmlinux)

CRANE2410 # help bootelf

bootelf [address] - load address of ELF image.

4.2.7 bootd(=boot)

引导的默认命令,即运行 U-BOOT 中在“include/configs/smdk2410.h” 中设置的“bootcmd” 中

的命令。如下:

#define CONFIG_BOOTCOMMAND "tftp 0x30008000 uImage; bootm 0x30008000";

在命令下做如下试验:

CRANE2410 # set bootcmd printenv

CRANE2410 # boot

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:abCRANE2410 # bootd

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

4.2.8 tftp(tftpboot)

即将内核镜像文件从 PC 中下载到 SDRAM 的指定地址,然后通过 bootm 来引导内核,前提是所用 PC 要安装设

置 tftp 服务。

下载信息:

CRANE2410 # tftp 0x30008000 zImage

TFTP from server 10.0.0.1; our IP address is 10.0.0.110

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

#################################################

done

Bytes transferred = 913880 (df1d8 hex)

4.2.9 bootm

内核的入口地址开始引导内核。

CRANE2410 # bootm 0x30008000

## Booting image at 30008000 ...

Starting kernel ...

Uncompressing

Linux......................................................................

done, .

4.2.10 go

直接跳转到可执行文件的入口地址,执行可执行文件。

CRANE2410 # go 0x30008000

## Starting application at 0x30008000 ...

4.2.11 cmp

对输入的两段内存地址进行比较。

CRANE2410 # cmp 0x30008000 0x30008040 64

word at 0x30008000 (0xe321f0d3) != word at 0x30008040 (0xc022020c)

Total of 0 words were the same

CRANE2410 # cmp 0x30008000 0x30008000 64

Total of 100 words were the same

4.2.12 coninfo

打印所有控制设备和信息,例如

-List of available devices:

-serial 80000003 SIO stdin stdout stderr

4.2.13 cp

内存拷贝,cp 源地址 目的地址 拷贝大小(字节)

CRANE2410 # help cp

cp [.b, .w, .l] source target count

ANE2410 # cp 0x30008000 0x3000f000 644.2.14 date

获得/设置/重设日期和时间

CRANE2410 # date

Date: 2006-6-6 (Tuesday) Time: 06:06:06

4.2.15 erase(F)

擦除 FLASH MEMORY, 由于该 ARM 板没有 Nor Flash, 所有不支持该命令.

CRANE2410 # help erase

erase start end

- erase FLASH from addr 'start' to addr 'end'

erase start +len

- erase FLASH from addr 'start' to the end of sect w/addr 'start'+'len'-1

erase N:SF[-SL]

- erase sectors SF-SL in FLASH bank # N

erase bank N

- erase FLASH bank # N

erase all

- erase all FLASH banks

4.2.16 flinfo(F)

打印 Nor Flash 信息, 由于该 ARM 板没有 Nor Flash, 所有不支持该命令.

4.2.17 iminfo

打印和校验内核镜像头, 内核的起始地址由 CFG_LOAD_ADDR 指定:

#define CFG_LOAD_ADDR 0x30008000 /* default load address */

该宏在 include/configs/crane2410.h 中定义.

CRANE2410 # iminfo

## Checking Image at 30008000 ...

Image Name: Linux-2.6.14.1

Created: 2006-06-28 7:43:01 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1047080 Bytes = 1022.5 kB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

4.2.18 loadb

从串口下载二进制文件

CRANE2410 # loadb

## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

## Total Size = 0x00000000 = 0 Bytes

## Start Addr = 0x30008000

4.2.19 md

显示指定内存地址中的内容

CRANE2410 # md 0

00000000: ea000012 e59ff014 e59ff014 e59ff014 ................

00000010: e59ff014 e59ff014 e59ff014 e59ff014 ................

00000020: 33f80220 33f80280 33f802e0 33f80340 ..3...3...3@..3

00000030: 33f803a0 33f80400 33f80460 deadbeef ...3...3`..3....

00000040: 33f80000 33f80000 33f9c0b4 33fa019c ...3...3...3...3

00000050: e10f0000 e3c0001f e38000d3 e129f000 ..............).00000060: e3a00453 e3a01000 e5801000 e3e01000 S...............

00000070: e59f0444 e5801000 e59f1440 e59f0440 D.......@...@...

00000080: e5801000 e59f043c e3a01003 e5801000 ....<...........

00000090: eb000051 e24f009c e51f1060 e1500001 Q.....O.`.....P.

000000a0: 0a000007 e51f2068 e51f3068 e0432002 ....h ..h0... C.

000000b0: e0802002 e8b007f8 e8a107f8 e1500002 . ............P.

000000c0: dafffffb e51f008c e2400803 e2400080 ..........@...@.

000000d0: e240d00c e51f0094 e51f1094 e3a02000 ..@.......... ..

000000e0: e5802000 e2800004 e1500001 dafffffb . ........P.....

000000f0: eb000006 e59f13d0 e281f000 e1a00000 ................

4.2.20 mm

顺序显示指定地址往后的内存中的内容,可同时修改,地址自动递增。

CRANE2410 # mm 0x30008000

30008000: e1a00000 ? fffff

30008004: e1a00000 ? eeeeee

30008008: e1a00000 ? q

CRANE2410 # md 30008000

30008000: 000fffff 00eeeeee e1a00000 e1a00000 ................

30008010: e1a00000 e1a00000 e1a00000 e1a00000 ................

30008020: ea000002 016f2818 00000000 000df1d8 .....(o.........

30008030: e1a07001 e3a08000 e10f2000 e3120003 .p....... ......

4.2.21 mtest

简单的 RAM 检测

CRANE2410 # mtest

Pattern FFFFFFFD Writing... Reading...

4.2.22 mw

向内存地址写内容

CRANE2410 # md 30008000

30008000: ffffdffd ffffdffc ffffdffb ffffdffa ................

CRANE2410 # mw 30008000 0 4

CRANE2410 # md 30008000

30008000: 00000000 00000000 00000000 00000000 ................

4.2.23 nm

修改内存地址, 地址不递增

CRANE2410 # nm 30008000

30008000: de4c457f ? 00000000

30008000: 00000000 ? 11111111

30008000: 11111111 ?

4.2.24 printenv

打印环境变量

CRANE2410 # printenv

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

ipaddr=10.0.0.110

serverip=10.0.0.1

netmask=255.255.255.0

stdin=serial

stdout=serialstderr=serial

Environment size: 153/65532 bytes

4.2.25 ping

ping 主机

CRANE2410 # ping 10.0.0.1

host 10.0.0.1 is alive

4.2.26 reset

复位 CPU

4.2.27 run

运行已经定义好的 U-BOOT 的命令

CRANE2410 # set myenv ping 10.0.0.1

CRANE2410 # run myenv

host 10.0.0.1 is alive

4.2.28 saveenv(F)

保存设定的环境变量

4.2.29 setenv

设置环境变量

CRANE2410 # setenv ipaddr 10.0.0.254

CRANE2410 # printenv

ipaddr=10.0.0.254

4.2.30 sleep

命令延时执行时间

CRANE2410 # sleep 1

4.2.31 version

打印 U-BOOT 版本信息

CRANE2410 # version

U-Boot 1.1.4 (Jul 4 2006 - 12:42:27)

4.2.32 nand info

打印 nand flash 信息

CRANE2410 # nand info

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

4.2.33 nand device <n>

显示某个 nand 设备

CRANE2410 # nand device 0

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

... is now current device

4.2.34 nand bad

CRANE2410 # nand bad

Device 0 bad blocks:4.2.35 nand read

nand read InAddr FlAddr size

InAddr: 从 nand flash 中读到内存的起始地址。

FlAddr: nand flash 的起始地址。

size: 从 nand flash 中读取的数据的大小。

CRANE2410 # nand read 0x30008000 0 0x100000

NAND read: device 0 offset 0, size 1048576 ...

1048576 bytes read: OK

4.2.36 nand erease

nand erase FlAddr size

FlAddr: nand flash 的起始地址

size: 从 nand flash 中擦除数据块的大小

CRANE2410 # nand erase 0x100000 0x20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

4.2.37 nand write

nand write InAddr FlAddr size

InAddr: 写到 Nand Flash 中的数据在内存的起始地址

FlAddr: Nand Flash 的起始地址

size: 数据的大小

CRANE2410 # nand write 0x30f00000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

4.2.37 nboot

u-boot-1.1.4 代码对于 nboot 命令的帮助不正确,修改如下:

正确的顺序为:

nboot InAddr dev FlAddr

InAddr: 需要装载到的内存的地址。

FlAddr: 在 nand flash 上 uImage 存放的地址

dev: 设备号

需要提前设置环境变量,否则 nboot 不会调用 bootm

CRANE2410 #setenv autostart yes

CRANE2410 # nboot 30008000 0 100000

Loading from device 0: <NULL> at 0x4e000000 (offset 0x100000)

Image Name: Linux-2.6.14.3

Created: 2006-07-06 7:31:52 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 897428 Bytes = 876.4 kB

Load Address: 30008000

Entry Point: 30008040

Automatic boot of image at addr 0x30008000 ...

## Booting image at 30008000 ...

Starting kernel ...

4.3 命令简写说明

所以命令都可以简写,只要命令前面的一部分不会跟其它命令相同,就可以不用写全整个命令.save 命令

CRANE2410 # sa

Saving Environment to Flash...

Un-Protected 1 sectors

Erasing Flash...Erasing sector 10 ... Erased 1 sectors

4.4 把文件写入 NandFlash

如果把一个传到内存中的文件写入到 Nand Flash 中, 如:新的 uboot.bin, zImage(内核),

rootfs 等, 如果做呢?我们可以用 Nand Flash 命令来完成. 但是 Nand Flash 写时,必须先要把 Nand

Flash 的写入区全部擦除后,才能写. 下面以把内存 0x30008000 起长度为 0x20000 的内容写到 Nand

Flash 中的 0x100000 为例.

CRANE2410 # nand erase 0x100000 20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

CRANE2410 # nand write 0x30008000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

「正点原子Linux连载」第三十四章U-Boot图形化配置及其原理

1)实验平台:正点原子Linux开发板

2)摘自《正点原子 I.MX6U嵌入式Linux驱动开发指南

关注官方微信号公众号,获取更多资料:正点原子

在前两章中我们知道uboot可以通过mx6ull_alientek_emmc_defconfig来配置,或者通过文件mx6ull_alientek_emmc.h来配置uboot。还有另外一种配置uboot的方法,就是图形化配置,以前的uboot是不支持图形化配置,只有Linux内核才支持图像化配置。不过不知道从什么时候开始,uboot也支持图形化配置了,本章我们就来学习一下如何通过图形化配置uboot,并且学习一下图形化配置的原理,因为后面学习Linux驱动开发的时候可能要修改图形配置文件。

34.1 U-Boot图形化配置体验

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

sudo apt-get install build-essential

sudo apt-get install libncurses5

sudo apt-get install libncurses5-dev

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

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

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

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

makemx6ull_alientek_emmc_defconfig

makemenuconfig

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

图34.1.1 uboot图形化配置界面

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

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

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

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

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

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

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

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

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

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

图34.1.2 Command line interface配置项

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

图34.1.3 Network commands配置项

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

图34.1.4 选中dns命令

每个选项有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就会识别出错。

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

图34.1.5 dns命令提示信息

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

图34.1.6 是否保存新的配置文件对话框

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

图34.1.7 .config文件

使用如下命令编译uboot:

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的值,命令如下:

setenv dnsip 114.114.114.114

saveenv

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

dns www.baidu.com

结果如图34.1.8所示:

图34.1.78dns命令

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

34.2 menuconfig图形化配置原理

34.2.1 makemenuconfig过程分析

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

示例代码34.2.1.1 顶层Makefile代码段

489% config: scripts_basic outputmakefile FORCE

490 $( Q) $( MAKE) $( build)= scripts/ kconfig $@

这个在31.3.13小节已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将490行的规则展开就是:

@make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

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

示例代码34.2.1.2 scripts/kconfig/Makefile代码段

36 menuconfig: $( obj)/ mconf

37 $< $( silent) $( Kconfig)

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

menuconfig: scripts/kconfig/mconf

scripts/kconfig/mconf Kconfig

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

34.2.2 Kconfig语法简介

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

1、mainmenu

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

示例代码34.2.2.1 顶层Kconfig代码段

5 mainmenu "U-Boot $UBOOTVERSION Configuration"

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

图34.2.2.1 主菜单名字

2、调用其他目录下的Kconfig文件

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

source "xxx/Kconfig" //xxx为具体的目录名,相对路径

在顶层Kconfig中有如下代码:

示例代码34.2.2.2 顶层Kconfig代码段

12 source "arch/Kconfig"

......

225

226 source "common/Kconfig"

227

228 source "cmd/Kconfig"

229

230 source "dts/Kconfig"

231

232 source "net/Kconfig"

233

234 source "drivers/Kconfig"

235

236 source "fs/Kconfig"

237

238 source "lib/Kconfig"

239

240 source "test/Kconfig"

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

3、menu/endmenu条目

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

示例代码34.2.2.3 顶层Kconfig代码段

14 menu "General setup"

15

16 config LOCALVERSION

17 string "Local version - append to U-Boot release"

18 help

19 Append an extra string to the end of your U- Boot version.

20 This will show up on your boot log,for example.

21 The string you set here will be appended after the contents of

22 any files with a filename matching localversion* in your

23 object and source tree, in that order. Your total string can

24 be a maximum of 64 characters.

25

......

100 endmenu # General setup

101

102 menu "Boot images"

103

104 config SUPPORT_SPL

105bool

106

......

224 endmenu # Boot images

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

图34.2.2.2 子菜单

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

3、config条目

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

示例代码34.2.2.4 顶层Kconfig代码段

14 menu "General setup"

15

16 config LOCALVERSION

17 string "Local version - append to U-Boot release"

18 help

19 Append an extra string to the end of your U- Boot version.

20 This will show up on your boot log,for example.

21 The string you set here will be appended after the contents of

22 any files with a filename matching localversion* in your

23 object and source tree, in that order. Your total string can

24 be a maximum of 64 characters.

25

26 config LOCALVERSION_AUTO

27bool"Automatically append version information to the version string"

28default y

29 help

......

45

46 config CC_OPTIMIZE_FOR_SIZE

47bool"Optimize for size"

48default y

49 help

......

54

55 config SYS_MALLOC_F

56bool"Enable malloc() pool before relocation"

57default y if DM

58 help

......

63

64 config SYS_MALLOC_F_LEN

65 hex "Size of malloc() pool before relocation"

66 depends on SYS_MALLOC_F

67default 0x400

68 help

......

73

74 menuconfig EXPERT

75bool"Configure standard U-Boot features (expert users)"

76default y

77 help

......

82

83if EXPERT

84 config SYS_MALLOC_CLEAR_ON_INIT

85bool"Init with zeros the memory reserved for malloc (slow)"

86default y

87 help

......

99 endif

100 endmenu # General setup

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

图34.2.2.3 General setup配置项

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

示例代码34.2.2.5 顶层Kconfig代码段

16 config LOCALVERSION

17 string "Local version - append to U-Boot release"

18 help

19 Append an extra string to the end of your U- Boot version.

......

24 be a maximum of 64 characters.

25

26 config LOCALVERSION_AUTO

27bool"Automatically append version information to the version string"

28default y

29 help

30 This will try to automatically determine if the current tree is a

31 release tree by looking for git tags that belong to the current

......

43

44 which is done within the script "scripts/setlocalversion".)

第16和26行,这两行都以config关键字开头,后面跟着LOCALVERSION和LOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会下.config文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns命令的时候讲过了。由此可知,.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是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如图34.2.2.4所示:

图34.2.2.4 本地版本号配置

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

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

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

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

4、dependson和select

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

示例代码34.2.2.6 arch/Kconfig代码段

7 config SYS_GENERIC_BOARD

8 bool

9 depends on HAVE_GENERIC_BOARD

10

11 choice

12 prompt "Architecture select"

13 default SANDBOX

14

15 config ARC

16 bool"ARC architecture"

17 select HAVE_PRIVATE_LIBGCC

18 select HAVE_GENERIC_BOARD

19 select SYS_GENERIC_BOARD

20 select SUPPORT_OF_CONTROL

第9行,"dependson"说明"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"这四个也会被选中。

4、choice/endchoice

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

示例代码34.2.2.7 arch/Kconfig代码段

11 choice

12 prompt "Architecture select"

13default SANDBOX

14

15 config ARC

16bool"ARC architecture"

......

21

22 config ARM

23bool"ARM architecture"

......

29

30 config AVR32

31bool"AVR32 architecture"

......

35

36 config BLACKFIN

37bool"Blackfin architecture"

......

40

41 config M68K

42bool"M68000 architecture"

......

117

118 endchoice

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

图34.2.2.5 架构选择界面

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

5、menuconfig

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

示例代码34.2.2.8 menuconfig用法

1 menuconfig MODULES

2bool"菜单"

3if MODULES

4...

5 endif # MODULES

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

示例代码34.2.2.9 顶层Kconfig代码段

14 menu "General setup"

......

74 menuconfig EXPERT

75bool"Configure standard U-Boot features (expert users)"

76default y

77 help

78 This option allows certain base U- Boot options and settings

79 to be disabled or tweaked. This is for specialized

80 environments which can tolerate a "non-standard" U- Boot.

81 Only use this if you really know what you are doing.

82

83if EXPERT

84 config SYS_MALLOC_CLEAR_ON_INIT

85bool"Init with zeros the memory reserved for malloc (slow)"

86default y

87 help

88 This setting is enabled by default. The reserved malloc

89 memory is initialized with zeros, so first malloc calls

......

98 should be replaced by calloc -if expects zeroed memory.

99 endif

100 endmenu # General setup

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

General setup

-> Configure standard U-Boot features (expert users) --->

如图34.2.2.6所示:

图34.2.2.6 菜单Configure standard U-Boot features (expert users)

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

图34.2.2.7 菜单Init with zeros the memory reserved for malloc (slow)

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

6、comment

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

示例代码34.2.2.10 drivers/mtd/nand/Kconfig代码段

74 config NAND_ARASAN

75 bool"Configure Arasan Nand"

76 help

......

80

81 comment "Generic NAND options"

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

-> Device Drivers

-> NAND Device Support

结果如图34.2.2.8所示:

图34.2.2.8 注释"Generic NAND options"

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

7、source

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

source "arch/Kconfig"

这个在前面已经讲过了。

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

34.3 添加自定义菜单

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

①、在主界面中添加一个名为"Mytestmenu",此菜单内部有一个配置项。

②、配置项为"MY_TESTCONFIG",此配置项处于菜单"Mytestmenu"中。

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

④、配置项菜单名字为"Thisismytestconfig"。

⑤、配置项的帮助内容为"Thisisaemptyconfig, just for tset!"。

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

示例代码34.3.1 自定义菜单

1 menu "My test menu"

2

3 config MY_TESTCONFIG

4bool"This is my test config"

5default y

6 help

7 This is a empty config, just for tset!

8

9 endmenu # my test menu

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

图34.3.1 主界面

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

图34.3.2 "Mytestmenu"子菜单

从图34.3.2可以看出,配置项添加成功,选中"Thisismytestconfig"配置项,然后按下"H"键打开帮助文档,如图34.3.3所示:

图34.3.3 帮助信息

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

图34.3.4 .config文件

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

相关问答

uboot 由哪四个部分组成?

1.U-Boot由四个部分组成。2.首先是启动阶段的SPL(SecondaryProgramLoader),它是一个小型的引导程序,负责初始化硬件和加载U-Boot。其次是U-Boot的主体...

uboot 启动哪些系统?

U-Boot(UniversalBootLoader)是一个开源的、通用的引导加载程序,它支持多种嵌入式处理器和操作系统。在U-Boot启动过程中,它会负责加载和启动操作系统内核...

uboot 时间怎么看?

要查看U-Boot的时间,您可以按照以下步骤进行操作:1.在开机时启动U-Boot。这通常需要按下开机键或重启设备。2.当U-Boot启动时,它通常会显示一些信息...

小米路由器mini可以刷别的不死 UBOOT 么-ZOL问答

ngfeng有可以直接操作的已经发送楼主百渡私了,请查看。有用(0)回复631468545连接路由器网速变慢了的设置方法:1.登陆到路由器的设置,输入用户名和密码。...

如何从GIT导入VIM 配置 ?

1.众所周知,vim的配置都保存在~/.vimrc的文件里,跟vim操作相关的保存在~/.vim/下。2.我每到一个新的环境工作时,都会从自己的github上clonevim的配置下来,...1...

ap掩码和网段设置?

#一、重置ap恢复出厂设置1.准备Console线及配置终端AC、AP均默认开启WEB管理功能,默认管理地址为192.168.110.1,默认登录用户名及密码均为admin,管理PC配...

怎样在Linux下编程?需要什么技术?

前言分享好玩科技,探索未知世界。大家好,我是drinkingcode。针对如何学习Linux编程,分享一下作为过来人的经验,希望可以帮助到大家。环境搭建如果要在Linu...

c++程序员的发展方向?

一、C++服务器程序员(流媒体后台,游戏后台,高性能服务器后台)1.精通C++,STL,Linux等,熟悉设计模式;2.熟练掌握一门脚本语言(Lua,Python,...有Linux、Wi...

如何在 Linux 平台上开启UGNX11.0-ZOL问答

打开终端窗口,在命令行中键入$UGII_ROOT_DIR/ugmenu在提示行键入要运行的NX版本的行号。键入代表图形的g并按下Enter,或单独按下Enter。这将显示NX....

嵌入式软件工程师必须要掌握那些知识?

说句实话,现代开发分工越来越专,越来越细了。在嵌入式行业,有IC方案商,各IP厂商,各硬件(Sensor,LCD等)厂商,做产品开发的,基本上就是资源整合和利用,甚...要想会...

 周锦堂  灭火枪 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2025  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部