历史上的今天
今天是:2024年12月09日(星期一)
2021年12月09日 | 第二十章、 Tiny4412 U-BOOT移植二十 增加cleanlcd命令
2021-12-09 来源:eefocus
一、命令格式说明
关于如何命令的说明网上有好多资料,我这里仅仅简单的说明一下:
U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在 #ifdef CFG_LONGHELP #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep,cmd, usage, help} #else / no long help info*/ #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep,cmd, usage} #endif / CFG_LONGHELP */ 每一个命令定义一个cmd_tbl_t结构体,而cmd_tbl_t只不过是cmd_tbl_s的一个typedef,如下所示: typedef struct cmd_tbl_s cmd_tbl_t; 而cmd_tbl_s的定义则在同一文件 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) */ #ifdef CFG_LONGHELP char *help; / Help message (long) */ #endif #ifdef CONFIG_AUTO_COMPLETE / do auto completion onthe arguments */ Int (*complete)(int argc, char *argv[], charlast_char, nt maxv, char *cmdv[]); #endif }; 简单说明一下U_BOOT_CMD,或者可以说cmd_tbl_s结构体中每个变量的意思: 1、name:命令的名字,注意,他不是一个字符串(不要用号括起来)。 2、maxargs:最大的参数个数。 2、repeatable:命令是否可以重复,可重复是指运行一个命令后,下次敲回车即可再次运行。 4、cmd:参应的函数指针,类型为(*cmd)(strunt cmd_tbl_s *, int,int,char *[])。 5、usage:简短的使用说明,这是个字符串 6、help:较详细的使用说明,这也是一个字符串。 这样每一个U-Boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。 从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体并返回指向这一结构体的指针。 基于U-Boot命令的基本框架,下面来简单的说明如何增加Cleanlcd操作命令. 二、增加cleanlcd命令 1、定义cleanlcd命令 在 #define CONFIG_CMD_CLEANLCD /*add by zth*/ 其中, #define CONFIG_CMD_CLEANLCD /*add by zth*/ 当然,也可以直接把这句定义语句写在 2、增加cmd_cleanlcd.c文件 内容如下: /* add by zth this command use to clean the LcD */ #include #include #include #include #include #include #if defined(CONFIG_CMD_CLEANLCD) static int do_clean_lcd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { unsigned intcolour_value; if (argc < 2) { printf("Yourcommand not right! Please chcek help; n"); return -1; } colour_value =simple_strtoul(argv[1], NULL, 16); colour_value=colour_value & 0xFFFFFF; //printf("colour_value=%sn",argv[1]); //printf("colour_value=%xn",colour_value); memset_int(LCD_VIDEO_ADDR, colour_value,VIDEO_MEM_SIZE); return 0; } U_BOOT_CMD( cleanlcd, 5, 1, do_clean_lcd, "this just use toclean the lcd with a colour", "add by zth n" "commandformat:n" "cleanlcdcolour_valuen " "colour_value youcan use an 24bit valuen" ); #endif 文件中有这第一行代码: memset_int(LCD_VIDEO_ADDR, colour_value,VIDEO_MEM_SIZE); 为什么我没有用memset()函数呢? 是由于我调试时发现程序每次调用的是 void * memset(void * s,char c,size_t count) 而不是: void * memset(void * s,int c,size_t count) 这样和话LCD显示结果不是我们想要的,为了解决这个问题,那我直接用了以前写的裸机程序中的memset_int,这里我们要把这个函数给定义好,其实我们代码中早已写好了,只是被注释了,下面反这两行代码给定义出来。 3、修改zth_tiny4412_lcd.h和zth_tiny4412_lcd.c和文件 打开zth_tiny4412_lcd.h,定位到24行左右:去掉注释,修改为: extern void memset_int(unsigned int * s, int c,unsigned int count); 打开zth_tiny4412_lcd.c,定位到46行左右:去掉注释,修改为 void memset_int(unsigned int * s, int c,unsigned int count) { unsigned int *xs =(unsigned int *) s; while (count--) *xs++ = c; //return s; } 接着定位到262行左右,修改为: memset_int((void *)pGD->frameAdrs, 0xFF00, pGD->memSize); 4、修改/common/makefile 打开/common/makefile,定位到83行左右,增加: COBJS-$(CONFIG_CMD_CLEANLCD) +=cmd_cleanlcd.o 通过上面4步后,可以进行编译烧写运行了,下面命令提供参考: cp -R /media/sf_share/u-boot_zth . chmod 777 -R u-boot_zth / cd u-boot_zth make distclean make zthtiny4412_config make cd sd_fuse/ make cd zthtiny4412/ ./sd_fusing.sh /dev/sdb 运行后,在串口调试终端输入:help命令,可以找到新增加的cleanlcd命令,如下图所示: 图20-1、新增加的命令运行效果图 利用cleanlcd命令,显示一个颜色,例如命令:cleanlcd0x995500,运行效果如下图所示: 图20-2 、命令运行LCD效果图
史海拾趣
|
改进后的主要利用的计数进行频率的更换··· 同时我想应该可以用分频方法得到,可以仿真后好像波形不太准确···希望看到的同盟可以想下,如果用过分频方法可以贴出来让我参考参考,谢谢···… 查看全部问答> |
|
用writefile向文件中写数据,没有调用closehandle关闭文件。 当系统重启的时候,writefile写的内容并没有保存在存储器上。 如果调用FlushFileBuffers强制把数据写入存储器,程序执行完之后,存储器的空间就被 ...… 查看全部问答> |
|
硬件用的PXA270 需要用SPI驱动WIFI 现在卡在读取ID上了 即上电后初始化硬件(SPI接口),然后就读ID,就不能成功 想请教关于SPI初始化的几个问题: 我用的GPIO23、24、25、26作为SPI的那几个引脚,用22作为中断信号 首先将23、24、25、26这几 ...… 查看全部问答> |
|
大家好,我是一名在读研究生,研一了,目前有个问题困扰很久了,就是方向的选择。我以前是搞编程的,熟练使用vc++ 6.0,一般的程序都可以搞定。读研了,想多学点东西,就选择了嵌入式,看了一些论文,发现自己的硬件底子太弱(本科期间全部精力都用 ...… 查看全部问答> |
|
系统运行起来后,接上调试串口,看到系统抛出如下异常: Exception \'Raised Exception\' (-1): Thread-Id=03990002(pth=835ee15c), Proc-Id=03980002(pprc=835efe38) \' anyview.exe\', VM-active=03980002(pprc=835efe38) \'anyview.exe\' PC= ...… 查看全部问答> |
|
我是新手,请教大虾:我知道149的BSL是十个接口,其中9、10口悬空。网上说,可以直接前面6个接口,就可以下载程序。我现在关心的是:7-TEST,8-VCC_IN是干嘛用的?如果不接7、8口,会影响什么功能? 先在这儿谢过了… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:12 编辑 可以用来显示波形,旁边可以显示参数,常用的驱动函数,有需要的快来!! 记得顶一下 好资源大家分享!!!   ...… 查看全部问答> |




