0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

uboot自定义命令

嵌入式技术 2022-09-17 09:59 1393次阅读

uboot自定义命令

U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。

U-Boot本质是一个裸机程序,是一种普遍用于嵌入式系统中的开源的Bootloader,作用是用来引导操作系统,以及给开发人员提供测试调试工具。主要负责基本硬件初始化,导启动内核启动。

U-Boot命令众多,通过uboot命令可完成系统环境变量设置。U-Boot本质就是一份裸机程序,这样可以在U-Boot命令下调试一些硬件设备问题。U-Boot命令行也是可以实现自动补全功能。

1.uboot命令格式分析

  uboot命令存放在uboot目录下的common目录下。
  do_help命令功能实现如下:

extern cmd_tbl_t  __u_boot_cmd_bdinfo;
extern cmd_tbl_t  __u_boot_cmd_showvar;

int do_help(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
{
//	return _do_help(&__u_boot_cmd_start,
//			&__u_boot_cmd_end - &__u_boot_cmd_start,
//			cmdtp, flag, argc, argv);
	return _do_help(&__u_boot_cmd_bdinfo,
			&__u_boot_cmd_showvar - &__u_boot_cmd_bdinfo + 1,
			cmdtp, flag, argc, argv);
}

U_BOOT_CMD(
	help,	CONFIG_SYS_MAXARGS,	1,	do_help,
	"print command description/usage",
	"\n"
	"	- print brief description of all commands\n"
	"help command ...\n"
	"	- print detailed usage of 'command'"
);

/* This does not use the U_BOOT_CMD macro as ? can't be used in symbol names */
cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = {
	"?",	CONFIG_SYS_MAXARGS,	1,	do_help,
	"alias for 'help'",
#ifdef  CONFIG_SYS_LONGHELP
	""
#endif /* CONFIG_SYS_LONGHELP */
};

U_BOOT_CMD为命令参数传递:

help 命令标志符;
CONFIG_SYS_MAXARGS命令传递的最大参数个数;
1 命令重复执行次数;

do_help命令实现函数;

“alias for ‘help’”命令用法说明;
最后一个参数为命令用法详细说明;
int do_help(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])函数参数说明:
cmd_tbl_t * cmdtp结构体指针。

struct cmd_tbl_s {
	char		*name;		/* 命令名字*/
	int		maxargs;	/*命令传递的最大参数个数*/
	int		repeatable;	/*命令重复执行次数*/
	/*命令功能实现函数*/
	int		(*cmd)(struct cmd_tbl_s *, int, int, char * const []);
	char		*usage;		/*命令基本用法说明*/
#ifdef	CONFIG_SYS_LONGHELP
	char		*help;		/*命令详细用法说明*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
	/* do auto completion on the arguments */
	int		(*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
#endif
};

  argc 命令传入的参数个数,和main函数argc相同;
  argv 存放命令参数内容,和main函数argv相同;

2.tiny4412下编写uboot命令控制蜂鸣器

2.1 tiny4412开发板beep硬件接口

ef6cda5fbf0f4b1a8da4d958cce9a78f.png#pic_centerpYYBAGMkcm6AXPogAALTlgSByik812.png#pic_center

2.2 GPD0端口寄存器地址

poYBAGMkcm6AcMBRAAFIVeaUTtI745.png#pic_center

  配置寄存器:GPD0CON_ADDR = 0x1140_0000 + 0x00A0

pYYBAGMkcm6ATcutAADx1i9W8rc441.png#pic_center

2.3 参考help命令模板实现beep命令

#include 
#include 

/*蜂鸣器*/
#define GPD0_CON *((volatile unsigned int *)0x114000A0)//控制寄存器
#define GPD0_DAT *((volatile unsigned int *)0x114000A4)//数据寄存器

int do_beep(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
{
	/*蜂鸣器*/
	GPD0_CON&=0xfffffff0;//清除当前GPD0_0的配置
	GPD0_CON|=0x00000001;//设置为输出模式
	//beep on 或者 beep off
	if(argc!=2)
	{
		printf("格式:beep on/off\n");
		return 0;
	}
	if(strcmp(argv[1],"on")==0)//开蜂鸣器
	{
		GPD0_DAT|=1<<0;//开蜂鸣器
	}
	else if(strcmp(argv[1],"off")==0)//关蜂鸣器
	{
		GPD0_DAT&=~(1<<0);//关蜂鸣器
	}	
	return 0;
}

U_BOOT_CMD(
	beep,	CONFIG_SYS_MAXARGS,	1,	do_beep,
	"beep ",
	"\n"
	"beep用法\n"
	"开蜂鸣器:beep on\n"
	"关蜂鸣器:beep_off"
);

2.4 程序编译

  1. 将cmd_beep.c拷贝到u_boot目录下的common目录下

[wbyq@wbyq common]$ cp /mnt/hgfs/ubuntu/cmd_beep.c ./ 

  2. 修改common目录下的Makefile文件。

[wbyq@wbyq common]$ vim  Makefile 
poYBAGMkcm6AfN_oAAFMLThhXZ8381.png#pic_center

  3.在uoot顶层目录下执行make,重新编译uboot

[wbyq@wbyq uboot_tiny4412-sdk1506]$ make

  4.烧写uboot

[wbyq@wbyq uboot_tiny4412-sdk1506]$ cd sd_fuse/
[wbyq@wbyq tiny4412]$ sudo ./sd_fusing.sh /dev/sdb

  beep命令编写成功。

pYYBAGMkcm-ASnF_AADRQDhKR-0795.png#pic_center

  5. beep命令运行测试

TINY4412 # beep
格式:beep on/off
TINY4412 # ? beep
flag=0
beep - beep 

Usage:
beep 
beep用法
开蜂鸣器:beep on
关蜂鸣器:beep_off
TINY4412 # beep on
TINY4412 # beep off

3.分析uboot保存环境变量位置

  在Linux操作系统启动前,uboot需要完成系统环境变量配置。在uboot目录下有tiny4412.h中保存的系统的默认环境变量参数。

poYBAGMkcm-AMDrDAAFgzLO4XXs676.png#pic_center

 1.当我们修改了系统环境变量,执行了saveenv命令后,则环境变量将写入到磁盘中,接下来我们将分析一下uboot源码中环境变量写入磁盘的扇区位置。
在uboot命令中,并没有直接脚cmd_save.c的函数,因此,我们可以根据saveenv命令执行后的提示信息来分析。在uboot命令行下执行saveenv命令时,会看到有输出提示信息,这样我们可以直接在uboot工程中搜索一下输出信息的位置。

TINY4412 # save
Saving Environment to SMDK bootable device...
done
pYYBAGMkcnCALbAJAAD532Jzw_c480.png#pic_centerpoYBAGMkcnCAfvXyAAB29DuDE98521.png#pic_centerpYYBAGMkcnCAWdkIAAEzPuewygQ374.png#pic_center

  2.接下来跳入saveenv函数,查看一下该函数执行过程。

poYBAGMkcnGAfeBFAAFJvadUxmc007.png#pic_center

  当我们跳到定义处时会看到有多重位置,要想准确跳转到正确位置,我们可以再查找参考saveenv命令的后半段提示信息赋值位置。

pYYBAGMkcnKAW0_TAADLA9vI1v8189.png#pic_centerpoYBAGMkcnKAOqhnAABkB5T6EHE816.png#pic_center

 3.经过查找参考我们发现,后半段提示信息的定义位置是在env_auto.c中,而我们saveenv函数右键跳到定义处时在env_auto.c中也有定义,说明我们要跳转的文件即为env_atuo.c文件。

在 saveenv函数中,并没有看到有关于mmc写扇区的函数,说明我们还需要进一步跳转到对应的子函数中去分析。

pYYBAGMkcnOAHNmGAAHFZGjF75w395.png#pic_center

  4.我们可以再次根据saveenv命令的打印提示,在最后还会打印“done”这个信息,这样我们就可以更新这个信息,对当前函数中的三个子函数进行分析,看下哪一个子函数中有这个字符串的打印。经过查看代码可知最终调用的函数即为saveenv_movinand()函数。

poYBAGMkcnOAPXwxAAFdmqd4NEs124.png#pic_center

  5.再次跳到movi_write_env()函数中查看一下写入到mmc中的地址。

pYYBAGMkcnSAR9fCAAFTGQPcPVU089.png#pic_center

  6.在这个函数中即为实现环境变量写入作用,再次跳到movi_write()函数中查看一下这个函数参数作用。

poYBAGMkcnWAfeGJAACy5x8ktDY303.png

  可以看到,movi_write()函数参数作用分别为:mmc设备编号、写入mmc的起始扇区、写入的扇区个数、写入的环境变量内容。
  我们可以在这个函数中加入printf函数打印一下写入的扇区地址和扇区数量。然后再重新编译uboot,烧写到SD卡中再次启动查看效果。

TINY4412 # save
Saving Environment to SMDK bootable device...
start=1025,blkcnt=32
done
TINY4412 # 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11382

    浏览量

    211525
  • Uboot
    +关注

    关注

    4

    文章

    126

    浏览量

    28529
收藏 人收藏

    相关推荐

    如何添加自定义单板

    在开发过程中,用户有时需要创建自定义板配置。本节将通过一个实例讲解用户如何创建属于自己的machine,下面以g2l-test.conf为例进行说明。
    的头像 发表于 03-12 14:43 246次阅读

    如何快速创建用户自定义Board和App工程

    概述自HPM_SDKv1.7.0发布开始,在HPM_ENV中新增了user_template文件夹,以方便用户快速创建自定义的Board和App工程。user_template是用户模板工程,用户
    的头像 发表于 02-08 13:38 202次阅读
    如何快速创建用户<b class='flag-5'>自定义</b>Board和App工程

    Altium Designer 15.0自定义元件设计

    电子发烧友网站提供《Altium Designer 15.0自定义元件设计.pdf》资料免费下载
    发表于 01-21 15:04 0次下载
    Altium Designer 15.0<b class='flag-5'>自定义</b>元件设计

    think-cell:自定义think-cell(四)

    C.5 设置默认议程幻灯片布局 think-cell 议程可以在演示文稿中使用特定的自定义布局来定义议程、位置和议程幻灯片上的其他形状,例如标题或图片。通过将此自定义布局添加到模板,您可以为整个组织
    的头像 发表于 01-13 10:37 233次阅读
    think-cell:<b class='flag-5'>自定义</b>think-cell(四)

    智能语音识别照明解决方案,平台自定义,中英切换

    智能语音识别照明方案引入NRK3502芯片,支持平台自定义,离线控制,中英双语切换。NRK3502具备高性能和灵活自定义能力,可推动智能照明革新,控制其他智能设备,为国际用户提供全方位智能生活体验。
    的头像 发表于 01-10 13:23 187次阅读
    智能语音识别照明解决方案,平台<b class='flag-5'>自定义</b>,中英切换

    think-cell;自定义think-cell(一)

    本章介绍如何自定义 think-cell,即如何更改默认颜色和其他默认属性;这是通过 think-cell 的样式文件完成的,这些文件将在前四个部分中进行讨论。 第五部分 C.5 设置默认议程幻灯片
    的头像 发表于 01-08 11:31 355次阅读
    think-cell;<b class='flag-5'>自定义</b>think-cell(一)

    创建自定义的基于闪存的引导加载程序(BSL)

    电子发烧友网站提供《创建自定义的基于闪存的引导加载程序(BSL).pdf》资料免费下载
    发表于 09-19 10:50 0次下载
    创建<b class='flag-5'>自定义</b>的基于闪存的引导加载程序(BSL)

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划。
    的头像 发表于 08-15 11:49 851次阅读
    EtherCAT运动控制器PT/PVT实现用户<b class='flag-5'>自定义</b>轨迹规划

    NVIDIA NeMo加速并简化自定义模型开发

    如果企业希望充分发挥出 AI 的力量,就需要根据其行业需求量身定制的自定义模型。
    的头像 发表于 07-26 11:17 936次阅读
    NVIDIA NeMo加速并简化<b class='flag-5'>自定义</b>模型开发

    HarmonyOS开发案例:【 自定义弹窗】

    基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗
    的头像 发表于 05-16 18:18 1593次阅读
    HarmonyOS开发案例:【 <b class='flag-5'>自定义</b>弹窗】

    AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

    编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。本文档介绍如何使用C语言自定义命令。1.实现hmi_model_cmd_t接口
    的头像 发表于 05-11 08:24 546次阅读
    AWTK 开源串口屏开发(18) - 用 C 语言<b class='flag-5'>自定义</b><b class='flag-5'>命令</b>

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以在
    的头像 发表于 05-11 08:21 855次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导

    HarmonyOS开发案例:【UIAbility和自定义组件生命周期】

    本文档主要描述了应用运行过程中UIAbility和自定义组件的生命周期。对于UIAbility,描述了Create、Foreground、Background、Destroy四种生命周期。对于页面
    的头像 发表于 05-10 15:31 1524次阅读
    HarmonyOS开发案例:【UIAbility和<b class='flag-5'>自定义</b>组件生命周期】

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 1140次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。
    的头像 发表于 04-08 10:17 790次阅读