您的位置:首页 > 其它

第二十章、 Tiny4412 U-BOOT移植二十 增加cleanlcd命令

2014-07-08 17:35 330 查看
这一章学习增加一个命令,那么增加一个什么命令呢?大家可能也会看到LCD上显示的字符由于没有换行和对齐,显示一会后,字符就相互重叠了,好吧,就增加一个清楚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效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: