LV05-02-U-Boot-05-uboot下自定义一个命令

本文主要是uboot——uboot下自定义一个命令的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.2的64位版本
VMware® Workstation 17 Pro 17.6.0 build-24238078
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,使用的uboot版本为U-Boot 2019.04
linux内核 linux-4.19.71(NXP官方提供)
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
其他网站 kernel - Linux source code (v4.15) - Bootlin linux内核源码在线查看
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
nxp-imx/linux-imx/releases/tag/v4.19.71 NXP linux内核仓库tags中的v4.19.71
nxp-imx/uboot-imx/releases/tag/rel_imx_4.19.35_1.1.0 NXP u-boot仓库tags中的rel_imx_4.19.35_1.1.0
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)
Source Code https://elixir.bootlin.com/linux/latest/source linux kernel源码
https://elixir.bootlin.com/u-boot/latest/source uboot源码

前面我们已经大概了解了命令的定义和执行过程,我们来自定义一个简单的命令。

一、命令编写

1. gpio_demo.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
* Control GPIO pins on the fly
*
* Copyright (c) 2008-2011 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/

#include <common.h>
#include <command.h>

static int do_gpio_demo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int i = 0;
printf("hello gpio_demo!argc=%d flag=%d\n", argc, flag);
printf("\tcmdtp->name=%s\n", cmdtp->name);
printf("\tcmdtp->maxargs=%d\n", cmdtp->maxargs);
printf("\tcmdtp->usage=%s\n", cmdtp->usage);
printf("\tcmdtp->help=%s\n", cmdtp->help);
printf("\n");
for(i = 0; i < argc; i++)
{
printf("[%s][%d]argv[%d]=%s\n", __FUNCTION__, __LINE__, i, argv[i]);
}
return 0;
}

U_BOOT_CMD(gpio_demo, 4, 0, do_gpio_demo,
"sumu gpio_demo",
"print args");

2. Makefile

在cmd目录中的Makefile文件要添加源文件的编译:

1
obj-y += gpio_demo.o

二、编译源码

1. 编译脚本

我们直接编译移植过的uboot,可以用这个脚本:1.sh · 苏木/u-boot - 码云 - 开源中国 (gitee.com),出现这个提示表示编译完成:

image-20241116195759671

2. 映射文件

我们看下编译后生成的u-boot.map文件,可以搜索一下gpio_demo关键字,会看到如下信息:

1
2
3
.u_boot_list_2_cmd_2_gpio_demo
0x000000008788a05c 0x1c cmd/built-in.o
0x000000008788a05c _u_boot_list_2_cmd_2_gpio_demo
image-20241116195701362

这就说明我们添加的命令成功了。

三、开发板验证

我们烧写到开发板中,然后启动,我们先敲一个help命令:

1
=> help
image-20241116195906526

在uboot的命令模式执行:

1
=> gpio_demo 1 2 3 4 5

会看到有如下输出:

image-20241116200022941

因为我们设置的最多传入4个参数,所以有些超了的并不是我们执行do_gpio_democ()函数的打印。但是到这里就说明我们的自定义命令完成了。