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

这一章学习增加一个命令,那么增加一个什么命令呢?大家可能也会看到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效果图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值