第二十章、 Tiny4412 U-BOOT移植二十 增加cleanlcd命令
齐,显示一会后,字符就相互重叠了,好吧,就增加一个清楚LCD显示的命令,当然我也希望他能设置颜色了。
一、命令格式说明
关于如何命令的说明网上有好多资料,我这里仅仅简单的说明一下:
U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在<include/command.h>头文件中定义。如下所示:
#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的定义则在同一文件<command.h>下,如下所示:
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命令
在<config_cmd_all.h>与<config_cmd_default.h>中定义了所有UBOOT支持的命令的标志位。下面我们只在config_cmd_all.h中增加一行命令定义:
#define CONFIG_CMD_CLEANLCD /*add by zth*/
其中,<config_cmd_default.h>中定义的命令是由板子默认支持的,这是由于在板子的配置文件中包含进了该头文件,如果让板子支持<config_cmd_default.h>中没有,而<config_cmd_all.h>中命令,还必须在板子的配置文件中进行相关的定义,所以我没有在<config_cmd_default.h>中定义cleanlcd命令,就必须在我的</configs/zthtiny4412.h>中支持cleanlcd命令,所以打开zthtiny4412.h,增加以下命令:
#define CONFIG_CMD_CLEANLCD /*add by zth*/
当然,也可以直接把这句定义语句写在<config_cmd_default.h>中。
2、增加cmd_cleanlcd.c文件
内容如下:
/*
add by zth
this command use to clean the LcD
*/
#include <common.h>
#include <command.h>
#include <lcd.h>
#include <config.h>
#include <malloc.h>
#include <zth_tiny4412_lcd.h>
#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=%s\n",argv[1]);
//printf("colour_value=%x\n",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_value\n "
"colour_value youcan use an 24bit value\n"
);
#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效果图