历史上的今天
返回首页

历史上的今天

今天是: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命令

中定义了所有UBOOT支持的命令的标志位。下面我们只在config_cmd_all.h中增加一行命令定义:

#define CONFIG_CMD_CLEANLCD /*add by zth*/

 

其中,中定义的命令是由板子默认支持的,这是由于在板子的配置文件中包含进了该头文件,如果让板子支持中没有,而中命令,还必须在板子的配置文件中进行相关的定义,所以我没有在中定义cleanlcd命令,就必须在我的中支持cleanlcd命令,所以打开zthtiny4412.h,增加以下命令:

#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效果图

推荐阅读

史海拾趣

Curtis Electromusic Specialties Inc公司的发展小趣事

在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。

FTDI公司的发展小趣事

在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。

CEVA, Inc公司的发展小趣事

CEVA, Inc.最初于1999年11月22日在美国特拉华州注册成立,起初的名称并非CEVA。随着公司的业务扩展和技术积累,其在2002年11月进行了更名,成为ParthusCeva公司。这一更名反映了公司业务的进一步发展和市场定位的调整。随后,在2003年12月,公司再次更名为CEVA公司,这一名称沿用至今,成为无线连接和智能传感技术领域的知名品牌。

EHC(ELECTRONICHARDWARE)公司的发展小趣事

EHC公司自创立之初就专注于电子硬件的技术创新。在竞争激烈的电子市场中,EHC公司凭借其独特的设计理念和先进的生产工艺,成功推出了一系列高性能、高可靠性的电子产品。这些产品不仅满足了消费者对高品质电子产品的需求,也为EHC公司赢得了良好的市场口碑。随着技术的不断进步,EHC公司不断推出创新产品,逐步巩固了其在行业中的领先地位。

Aromat Corp公司的发展小趣事

为了进一步提升公司的竞争力,Aromat Corp开始实施国际化战略。公司积极拓展海外市场,通过设立海外分支机构、与当地企业合作等方式,将产品推向全球。同时,Aromat Corp还加强了与国际同行的交流与合作,学习借鉴先进的经验和技术,不断提升自身的综合实力。

台湾君耀(Brightking)公司的发展小趣事

作为一家具有社会责任感的企业,君耀始终注重环保和可持续发展。公司在生产过程中采用环保材料和工艺,减少对环境的影响。同时,君耀还积极参与各种环保活动,推动行业的绿色发展。这种理念不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这些故事只是君耀公司发展历程中的一部分,每个阶段都充满了挑战和机遇。君耀凭借其坚韧不拔的精神、卓越的技术实力和市场洞察力,成功在电子行业中崛起并持续壮大。如需更多详细信息或具体故事,建议查阅君耀公司的官方资料、相关新闻报道或行业分析报告。

问答坊 | AI 解惑

天线的主要技术指标

天线的主要技术指标 天线的方向图      (一) 方向图     天线辐射的电场强度在空间各点的分布是不一样的,为了描述天线这种辐射强度的分布情况,我们可以用矢量来表示。把天线放置于坐标原点,并使其轴向与z轴方 ...…

查看全部问答>

8位10进制频率计设计

改进后的主要利用的计数进行频率的更换··· 同时我想应该可以用分频方法得到,可以仿真后好像波形不太准确···希望看到的同盟可以想下,如果用过分频方法可以贴出来让我参考参考,谢谢···…

查看全部问答>

wince上的flash读写问题

  用writefile向文件中写数据,没有调用closehandle关闭文件。   当系统重启的时候,writefile写的内容并没有保存在存储器上。   如果调用FlushFileBuffers强制把数据写入存储器,程序执行完之后,存储器的空间就被 ...…

查看全部问答>

请教PXA270的SPI初始化问题

硬件用的PXA270 需要用SPI驱动WIFI 现在卡在读取ID上了 即上电后初始化硬件(SPI接口),然后就读ID,就不能成功 想请教关于SPI初始化的几个问题: 我用的GPIO23、24、25、26作为SPI的那几个引脚,用22作为中断信号 首先将23、24、25、26这几 ...…

查看全部问答>

方向选择问题?小女子急!!

大家好,我是一名在读研究生,研一了,目前有个问题困扰很久了,就是方向的选择。我以前是搞编程的,熟练使用vc++ 6.0,一般的程序都可以搞定。读研了,想多学点东西,就选择了嵌入式,看了一些论文,发现自己的硬件底子太弱(本科期间全部精力都用 ...…

查看全部问答>

系统异常求助(WinCE)

系统运行起来后,接上调试串口,看到系统抛出如下异常: Exception \'Raised Exception\' (-1): Thread-Id=03990002(pth=835ee15c), Proc-Id=03980002(pprc=835efe38) \' anyview.exe\', VM-active=03980002(pprc=835efe38) \'anyview.exe\' PC= ...…

查看全部问答>

EVC++的问题

我用EVC++写一些程序 以前每次都是build之后自动下载到ARM+Wince的板子中 前两天我给WINCE加了个驱动,重新编译了一下操作系统,下到了板子里 然后这种自动下载就不好使了 总是下载失败 我将编译好的*.exe程序 在PC端用复制粘贴 将程序复制到“ ...…

查看全部问答>

关于msp430f149的BSL的接口问题

我是新手,请教大虾:我知道149的BSL是十个接口,其中9、10口悬空。网上说,可以直接前面6个接口,就可以下载程序。我现在关心的是:7-TEST,8-VCC_IN是干嘛用的?如果不接7、8口,会影响什么功能? 先在这儿谢过了…

查看全部问答>

准备 单片机 12864 动态波形显示 原创亲试

本帖最后由 paulhyde 于 2014-9-15 03:12 编辑         可以用来显示波形,旁边可以显示参数,常用的驱动函数,有需要的快来!!       记得顶一下     好资源大家分享!!!   ...…

查看全部问答>