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硬件接口
2.2 gpd0端口寄存器地址
配置寄存器:gpd0con_addr = 0x1140_0000 + 0x00a0
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
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命令编写成功。
5. beep命令运行测试
tiny4412 # beep格式:beep on/offtiny4412 # ? beepflag=0beep - beep usage:beep beep用法开蜂鸣器:beep on关蜂鸣器:beep_offtiny4412 # beep ontiny4412 # beep off
3.分析uboot保存环境变量位置
在linux操作系统启动前,uboot需要完成系统环境变量配置。在uboot目录下有tiny4412.h中保存的系统的默认环境变量参数。
1.当我们修改了系统环境变量,执行了saveenv命令后,则环境变量将写入到磁盘中,接下来我们将分析一下uboot源码中环境变量写入磁盘的扇区位置。
在uboot命令中,并没有直接脚cmd_save.c的函数,因此,我们可以根据saveenv命令执行后的提示信息来分析。在uboot命令行下执行saveenv命令时,会看到有输出提示信息,这样我们可以直接在uboot工程中搜索一下输出信息的位置。
tiny4412 # savesaving environment to smdk bootable device...done
2.接下来跳入saveenv函数,查看一下该函数执行过程。
当我们跳到定义处时会看到有多重位置,要想准确跳转到正确位置,我们可以再查找参考saveenv命令的后半段提示信息赋值位置。
3.经过查找参考我们发现,后半段提示信息的定义位置是在env_auto.c中,而我们saveenv函数右键跳到定义处时在env_auto.c中也有定义,说明我们要跳转的文件即为env_atuo.c文件。
在 saveenv函数中,并没有看到有关于mmc写扇区的函数,说明我们还需要进一步跳转到对应的子函数中去分析。
4.我们可以再次根据saveenv命令的打印提示,在最后还会打印“done”这个信息,这样我们就可以更新这个信息,对当前函数中的三个子函数进行分析,看下哪一个子函数中有这个字符串的打印。经过查看代码可知最终调用的函数即为saveenv_movinand()函数。
5.再次跳到movi_write_env()函数中查看一下写入到mmc中的地址。
6.在这个函数中即为实现环境变量写入作用,再次跳到movi_write()函数中查看一下这个函数参数作用。
可以看到,movi_write()函数参数作用分别为:mmc设备编号、写入mmc的起始扇区、写入的扇区个数、写入的环境变量内容。
我们可以在这个函数中加入printf函数打印一下写入的扇区地址和扇区数量。然后再重新编译uboot,烧写到sd卡中再次启动查看效果。
tiny4412 # savesaving environment to smdk bootable device...start=1025,blkcnt=32donetiny4412 #
Type-C带充电的OTG转接器方案 LDR6028
皮带输送机皮带偏移的调整方法
艾默生充电模块的日常维护
基于DDS的任意波形/ 函数发生器之间的差别
MCU选型深度解析:从计算能力到商业考量
uboot自定义命令
一文揭晓华为新一代折叠旗舰Mate X2亮点
不同蓝牙定位方案之间的对比
因电信和医疗领域关键应用 印度能源公司开设100 MWh锂电池工厂
思博伦:虚拟运营商应重视安全和应用负载性测试
科大讯飞准备优化30%的正式员工
今天程序员节长沙出招 全国首个!长沙为程序员打造“1024街”
工业机器人直线和旋转传动机构的区别
分享10个Pandas在实际应用中肯定会用到的技巧
小型心形流水灯电路图大全(89c52/CD4017心形流水灯电路图)
10G EPON需求减弱的几个原因
PCB制作工艺过程
自镇流LED灯主要性能指标及国内外标准要求
人工智能大战,谁会在AI时代领头前行?
我国对国产大飞机的投资需要进一步加强