在开发过程中,时常会根据实际情况在U-BOOT阶段完成一些外设的初始化,或者实现一些功能应用。本文给大家介绍一下如何在u-boot中通过增加自定义的命令方式来达到这一目的。
编写源文件
在cmd目录下创建command_test.c文件,内容如下:
/*
* Copyright 2000-2009
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
static int do_command_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
printf("test for add command.\n");
return 0;
}
U_BOOT_CMD(
command_test, CONFIG_SYS_MAXARGS, 1, do_command_test,
"test for add command",
"\n"
" - test commands\n"
"help command ...\n"
" - print detailed usage of 'command'"
);
name:命令名称。注意:这不是一个字符串。
maxargs:此函数接受的最大参数值,包括命令本身。
repeatable:0 - 不允许自动重复;1 - 允许自动重复。
command:指向命令函数的指针。这是在u-boot命令行下发出命令时调用的函数。
usage:用于描述命令的提示信息。是一个字符串。
help:长描述。这是一个字符串。只有定义了CONFIG_SYS_LONGHELP时,长描述才可用。
命令函数指针声明如下:
int (*cmd)(struct cmd_tbl *cmdtp, int flag, int argc, const char *argv[]);
cmdtp:描述该命令的表条目。
flag:可以包含以下几种位图:CMD_FLAG_REPEAT - 重复执行最后一条命令;CMD_FLAG_BOOTD - 该命令由bootd命令调用;CMD_FLAG_ENV - 该命令由run命令调用。
argc:包括命令在内的参数的数目。
argv:参数。允许的返回值为:CMD_RET_SUCCESS - 标志命令执行成功;CMD_RET_FAILURE - 命令执行失败;CMD_RET_USAGE - 使用无效参数调用命令。这个值将显示用法字符串。
struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage; /* Usage message (short) */
char *help; /* Help message (long) */
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
};
typedef struct cmd_tbl_s cmd_tbl_t;
修改Makefile
修改cmd/Makefile,添加内容如下
u-boot Makefile编译过程可以参考之前文档。
uboot Makefile解析
重新编译u-boot
root@ubuntu:/home/ubuntu/Desktop/u-boot-2017.05-rc2# make ARCH=arm CROSS_COMPLIE=arm-linux-gnueabi- vexpress_ca9x4_defconfig
#
# configuration written to .config
#
root@ubuntu:/home/ubuntu/Desktop/u-boot-2017.05-rc2# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/config.h
CFG u-boot.cfg
GEN include/autoconf.mk
GEN include/autoconf.mk.dep
CHK include/config/uboot.release
CHK include/generated/version_autogenerated.h
CHK include/generated/timestamp_autogenerated.h
UPD include/generated/timestamp_autogenerated.h
CHK include/generated/generic-asm-offsets.h
CHK include/generated/asm-offsets.h
HOSTCC tools/mkenvimage.o
HOSTLD tools/mkenvimage
HOSTCC tools/fit_image.o
HOSTCC tools/image-host.o
HOSTCC tools/dumpimage.o
HOSTLD tools/dumpimage
HOSTCC tools/mkimage.o
HOSTLD tools/mkimage
CC cmd/version.o
CC cmd/command_test.o
LD cmd/built-in.o
CC common/main.o
LD common/built-in.o
CC lib/efi_loader/helloworld.o
LD lib/efi_loader/helloworld.so
OBJCOPY lib/efi_loader/helloworld.efi
CC lib/smbios.o
CC lib/display_options.o
LD lib/built-in.o
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
COPY u-boot.bin
SYM u-boot.sym
CFGCHK u-boot.cfg
root@ubuntu:/home/ubuntu/Desktop/u-boot-2017.05-rc2#
自定义命令测试
u-boot终端下执行命令的过程可以参考之前文档
uboot-main_loop函数分析