【转】如何让ucgui支持24位色(24bpp)

将UC/GUI 3.32a 更改为可以支持24bpp色彩模式

 

我打算在UC/OS-II上直接移植一个开源的GUI界面。所以我从网上找了一些GUI的开源代码,主要看了看飞漫软件的MiniGUI和Micrium公司的uC/GUI。

飞漫软件的MiniGUI可免费下载的版本是1.3.3,可是不支持UC/OS-II,网上的介绍中比较适合移植到LINUX。飞漫软件已经发行了可以在UC/OS-II上运行的版本,但已经是商业版本了,不是我可以随便下载的了。

uC/GUI比较适合UC/OS-II,正是我希望的。我将它移植到了UC/OS-II中,发现目前的版本3.32a最大只支持16bpp,不支持24bpp。我将它改成了24bpp模式,就当作是熟悉一下uC/GUI了。

1         UC/GUI介绍

uC/GUI是Micrium公司开发的通用的嵌入式用户图形界面软件。它给任何使用图形LCD的应用程序提供独立于处理器和LCD控制器之外的有效的图形用户接口。可以应用于单一任务环境,也可以应用于多任务环境中。uC/GUI能够应用于任何LCD控制器和CPU的任何尺寸的物理显示或者模拟显示中。

   uC/GUI的特点如下:

◆ 适用于任何8位/16位/32位CPU,可允许于支持ANSI C的任何编译器

◆ 适用于任何控制器驱动任何LCD(单色,灰度,或者彩色)

◆ 通过配置宏,可支持任何接口

◆ 可配置显示尺寸

◆ 可在LCD的任何一点上显示字符和画位图

◆ 对于显示尺寸和速度提供优化进程,编译时间依赖于采用的优化进程

◆  支持虚拟显示,虚拟显示的尺寸比实际显示大。

更对UC/GUI的说明和资料请登陆www. ucgui.com。

2         UC/GUI需要进行的更改

www.ucgui.com上可以下载到UC/GUI的用户手册,如果仅仅是将UC/GUI移植到S3C2410上,可以参照第20-23章,这里就不再详细说明。

如果是仅仅将UC/GUI移植到UC/OS-II上,可以参照第11章。

因为目前能够获得的UC/GUI源码仅能够支持1、2、4、8、16bpp。我简单介绍如何支持24bpp模式,可以用于在8.6英寸TFT-LCD上显示更多色彩。

     需要修改的地方包括:

1)CONFIG目录下文件:主要是LCDCONF.h、GUICONF.H

2)LCDDRIVER目录下文件,LCD_S3C2410.C

3)CORE目录下文件:包括GUI.H、GUITYPE.H、LCD.H、 LCD_CONFDEFAULTS.H、LCD_PRIVATE.H、GUIALLOC.C、 LCD_L0_GENERIC.C。

4)MEMDEV目录下文件: GUIDEV.C。

根据我的修改,目前使用本文后面的UCGUI_test()测试一切正常。

目前还没有进行WM和AA的测试,本文仅仅提供一下修改的思路。以后随着移植进一步完善,可能会有后续修改,请留意。

3         配置头文件

3.1     LCDCONF.H

修改BPP宏:

#define LCD_BITSPERPIXEL        (24)

重新定义内存读写宏,使之符合U32格式:

#define LCD_READ_MEM(Off)            *((U32*)         (gActiveFrameBuffer+((U32)(Off))))

#define LCD_WRITE_MEM(Off,data)      *((U32*)         (gActiveFrameBuffer+((U32)(Off))))=data

3.2     GUICONF.H

将默认字体改为GUI_Font8x16,这是因为我觉得这种字体看起来比较大,适合我手头的屏幕。为了节约空间,我仅仅使用了三种字体,其他FONT都没有编译。

增大GUI_ALLOC_SIZE的值,因为屏幕较大,而且使用了24bpp模式。视你需要的最大尺寸设置。

目前,我把MEMDEV、OS、TOUCH、UNICODE、WM支持都打开了,但是除了MEMDEV都没有测试过,下一步会逐个测试。我觉得AA没有必要,所以也没有打开。

4         S3C2410驱动更改

修改LCD_S3C2410.C,在绘制位图的函数LCD_L0_DrawBitmap中,增加LCD_BITSPERPIXEL>16的switch-case条件,使用函数DrawBitLine24BPP。

    #if (LCD_BITSPERPIXEL > 16)

      case 24:

        DrawBitLine24BPP(x0, i + y0, (const U32 *)pData, xsize, pTrans);

            //注意pData的类型已经改为U32。

        break;

    #endif   

增加24bpp的画线函数,如下:

#if (LCD_BITSPERPIXEL > 16)

static void  DrawBitLine24BPP(int x, int y, U32 const * p, int xsize, const LCD_PIXELINDEX * pTrans)

{

… …//函数体与DrawBitLine16BPP相同。

}

两个点操作函数,LCD_L0_GetPixelIndex()和LCD_L0_SetPixelIndex()可以不用修改,因为在下面的步骤中LCD_PIXELINDEX的定义已经更改为U32了。

5         UC/GUI内核修改

5.1     GUI.H

修改LCD_COLORINDEX_UNION的UNION定义,否则COLOR和BKCOLOR永远只能够使用16bpp。

typedef union {

  U8  aColorIndex8[2];

  U16 aColorIndex16[2];

  U32 aColorIndex32[2]; //增加这一句。

} LCD_COLORINDEX_UNION;

5.2     GUITYPE.H

将GUI_HANDLE、GUI_HWIN、GUI_HMEM定义为I32。

#define GUI_HANDLE int

#define GUI_HWIN            I32P

#define     GUI_HMEM I32P

5.3     LCD.H

重新定义LCD_COLOR。

typedef U32 LCD_COLOR;

5.4     LCD_CONFDEFAULTS.H

重新定义LCD_BITSPERPIXEL。

#if LCD_BITSPERPIXEL <=8

  #define LCD_PIXELINDEX U8

#elif LCD_BITSPERPIXEL <=16

  #define LCD_PIXELINDEX U16

#else

  #define LCD_PIXELINDEX U32 //增加这一句

#endif

5.5     LCD_PRIVATE.H

重新定义LCD_BKCOLORINDEX、LCD_COLORINDEX、LCD_ACOLORINDEX。

#if LCD_BITSPERPIXEL <=8

  #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex8[0]

  #define LCD_COLORINDEX   GUI_Context.LCD.aColorIndex8[1]

  #define LCD_ACOLORINDEX  GUI_Context.LCD.aColorIndex8

#elif LCD_BITSPERPIXEL <=16

  #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex16[0]

  #define LCD_COLORINDEX   GUI_Context.LCD.aColorIndex16[1]

  #define LCD_ACOLORINDEX  GUI_Context.LCD.aColorIndex16

#else //增加一下几句

  #define LCD_BKCOLORINDEX GUI_Context.LCD.aColorIndex32[0]

  #define LCD_COLORINDEX   GUI_Context.LCD.aColorIndex32[1]

  #define LCD_ACOLORINDEX  GUI_Context.LCD.aColorIndex32

#endif

5.6     GUIALLOC.C

将GUI_BLOCK_ALIGN改为4个字节对齐。

#define GUI_BLOCK_ALIGN 4

5.7     LCD_L0_GENERIC.C

重新编写COLOR2INDEX()和INDEX2COLOR()。

  #define COLOR2INDEX(Color) ReverseRGB(Color)

   #define INDEX2COLOR(Index) ReverseRGB(Index)

其中,

LCD_COLOR ReverseRGB(LCD_COLOR Color)

{

   U32 r, g, b;

          r = (Color)  &0xff;

          g = (Color>>8) &0xff;

          b = (Color>>16) &0xff;       

   return b+(g<<8)+(r<<16);

}

ReverseRGB()的目的是将UC/GUI默认的BGR色彩改为RGB色彩。

6         MEMDEV的修改

6.1     GUIDEV.C

修改_DrawBitmap函数,增加BitsPerPixel==24的if语句,

  #if LCD_BITSPERPIXEL >16

    if (BitsPerPixel==24) {

      for (i=0; i<ysize; i++) {

        DrawBitLine24BPP_DDB(pUsage, x0, i+y0, (U32*)pData, xsize);

        pData += BytesPerLine;

      }

      return;

    }

  #endif

       其中DrawBitLine24BPP_DDB为,

#if LCD_BITSPERPIXEL >16

static void  DrawBitLine24BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U32 *pSrc, int xsize) {

  LCD_PIXELINDEX* pDest;

  pDest = GUI_MEMDEV_XY2PTR(x,y);

  switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {

  case 0:    /* Write mode */

    memcpy(pDest, pSrc, xsize*4);

    break;

  case LCD_DRAWMODE_TRANS:

    do {

      if (*pSrc) {

        *pDest = *pSrc;

        GUI_USAGE_AddPixel(pUsage, x,y);

      }

      x++;

      pDest++;

      pSrc++;

    } while (--xsize);

    break;

  }

}

#endif

GUI_MEMDEV_CreateEx中增加,

  #if LCD_BITSPERPIXEL <= 8

    int BytesPerLine = (( 8*xsize+15)>>4)<<1;  /* Reserve 8 bits for pixels */

  #elif LCD_BITSPERPIXEL <= 16

    int BytesPerLine = ((16*xsize+15)>>4)<<1;  /* Reserve 16 bits for pixels */

  #else //增加这一句

    int BytesPerLine = ((32*xsize+15)>>4)<<1;  /* Reserve 24 bits for pixels */

  #endif

同时修改,

#if LCD_BITSPERPIXEL <=8

  #define BITSPERPIXEL 8

#elif LCD_BITSPERPIXEL <=16

  #define BITSPERPIXEL 16

#else //增加这一句

  #define BITSPERPIXEL 24

#endif

7         测试

修改后Metromerks CodeWarrior project目录结构如下:

修改完成后使用UCGUI_test()函数测试,在每个delay()时设置断点,可以看显示是否正确。下面的有些语句是从《UC/GUI用户手册》中摘来的。

void UCGUI_test(void)

{

   U32 i,j;

   GUI_MEMDEV_Handle hMem;  

  

GUI_Init();

   //测试数字显示函数

   GUI_MEMDEV_Select(0);

   GUI_SetBkColor(GUI_BLACK);

   GUI_SetColor(GUI_WHITE);

   GUI_Clear();

   GUI_DispDecAt(123456, 100, 50, 9);

   GUI_DispDecAt(123456, 100, 70, 4);

   GUI_DispDecAt(-123456, 100, 90, 9);

   GUI_GotoXY(100,110);

   GUI_DispFloat(12345.6, 9);

   GUI_GotoXY(100,130);

   GUI_DispFloat(12345.6, 4);

   GUI_GotoXY(100,150);

   GUI_DispFloat(-12345.6, 9);

   GUI_GotoXY(100,170);

   GUI_DispString(GUI_GetVersionString());

   delay(600000);

  

   //测试文本显示函数

   GUI_SetBkColor(GUI_BLUE);

   GUI_Clear();

   GUI_SetPenSize(10);

   GUI_SetColor(GUI_RED);

   GUI_DrawLine(80,10,240,90);

   GUI_DrawLine(80,90,240,10);

   GUI_SetBkColor(GUI_BLACK);

   GUI_SetColor(GUI_WHITE);

   GUI_SetTextMode(GUI_TM_NORMAL);

   GUI_DispStringHCenterAt("GUI_TM_NORMAL", 160, 10);

   GUI_SetTextMode(GUI_TM_REV);

   GUI_DispStringHCenterAt("GUI_TM_REV", 160, 26);

   GUI_SetTextMode(GUI_TM_TRANS);

   GUI_DispStringHCenterAt("GUI_TM_TRANS", 160, 42);

   GUI_SetTextMode(GUI_TM_XOR);

   GUI_DispStringHCenterAt("GUI_TM_XOR", 160, 58);

   GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV);

   GUI_DispStringHCenterAt("GUI_TM_TRANS|GUI_TM_REV", 160, 74);        

   delay(600000);

  

   //测试2-D绘图函数

   GUI_SetColor(GUI_YELLOW);

   GUI_SetBkColor(GUI_GRAY);

   GUI_Clear();

   GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);

   GUI_FillCircle(120, 64, 40);

   GUI_SetDrawMode(GUI_DRAWMODE_XOR);

   GUI_FillCircle(140, 84, 40);

   GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);

   GUI_FillRect(100, 100, 200, 200);

   GUI_InvertRect(120, 120, 180, 180);

   for(i=0;i<10;i++)

            GUI_DrawCircle(200, 200, 20*i);

   GUI_DrawBitmap(&bmsample8bpp, 200, 200);

   GUI_DrawBitmap(&bmsampleGray, 400, 200);

   delay(600000);

  

   //MEMDEV绘图设备测试,包括数字、文本、2-D绘图。

   GUI_SetColor(GUI_YELLOW);

   GUI_SetBkColor(GUI_GRAY);

   GUI_SetTextMode(GUI_TM_NORMAL);

   GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);

   GUI_Clear();

   hMem="GUI"_MEMDEV_Create(0,0,200,200);

   GUI_MEMDEV_Select(hMem);

  

   GUI_DrawBitmap(&bmsample8bpp, 0, 0);

   GUI_DispStringAt("GUI_TM_NORMAL", 0, 100);

   GUI_MEMDEV_CopyToLCD(hMem);

   delay(600000);

   GUI_Clear();

  

   GUI_GotoXY(10,10);

   GUI_DispFloat(-12345.6, 9);

   GUI_DrawLine(0,0,100,100);

   GUI_DrawLine(0,100,100,0);

   GUI_MEMDEV_CopyToLCD(hMem);

   delay(600000);

   GUI_Clear();

  

   GUI_SetPenSize(2);

   GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);

   GUI_FillCircle(50, 50, 20);

   GUI_SetDrawMode(GUI_DRAWMODE_XOR);

   GUI_FillCircle(70, 50, 20);

   GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);

   for(i=0;i<10;i++)

            GUI_DrawCircle(50, 50, 5*i);

   GUI_MEMDEV_CopyToLCD(hMem);

   delay(600000);

  

   GUI_MEMDEV_Select(0);

   GUI_MEMDEV_Delete(hMem);

   GUI_Clear();

}

8         结论

进行UC/GUI移植前,必须保证LCD的初始化已经正确,可以自己编写几个底层函数,画点的、画线的、写文本、画图片的等。只有确保自己对S3C2410的LCD部分真正熟悉并掌握了,再移植UC/GUI才有把握。

将UC/GUI更改为24bpp,主要修改跟LCD_BITSPERPIXEL、LCD_COLOR定义有关的部分。如果移植过程中出现问题,可以单步跟踪进去,看是什么变量导致输出不正确。

我也没有将UC/GUI的源文件看一遍,基本上是使用仿真跟踪的方法确定哪部分需要修改。所以没有用到的部分,比如AA、WM可能还需要进一步修改,这点请按照以上步骤修改的朋友注意。

(转载自wpingme.blog.163.com)

转载于:https://www.cnblogs.com/huangqp/archive/2012/07/29/2614067.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NASA指定首批9名宇航员,参与波音和马斯克商业载人航天

来源&#xff1a;澎湃新闻人类太空探索史即将翻开商业载人航天的新一页。美国当地时间8月3日&#xff0c;美国国家航空航天局&#xff08;NASA&#xff09;公布了9名将搭乘波音公司的CST-100 Starliner载人航天器和SpaceX载人龙飞船往返国际空间站的宇航员。其中3名宇航员参与S…

二叉树——基本概念

二叉树的概念 树是一种非线性的数据结构&#xff0c;他有n(n>0)个有限的结点组成的一个有层次关系的集合。之所以叫树&#xff0c;是因为这种数据结构看起来像是一个倒挂的树&#xff0c;根朝上&#xff0c;叶子朝下。特点就是每个结点有0个或多个结点&#xff0c;没有父结点…

设计模式第三集——装饰者模式(Decorator)

再次强调设计的重要原则&#xff1a;对扩展开放&#xff0c;对修改关闭。在设计中要尽量避免对之前源代码的修改。 为适应扩展的特性&#xff0c;除了继承之外&#xff0c;还可以用装饰者模式&#xff1a;动态的将新的功能附加到对象上。换句话说&#xff0c;装饰者模式就是有一…

AI开放只是幌子?科技巨头边承诺开放边申请专利

选自 I Wired编译 I 网易智能参与 I 木秀林据《连线》报道&#xff0c;上周在旧金山举行的谷歌云计算会议上&#xff0c;该公司CEO桑德尔皮查伊提到公司致力于人工智能&#xff08;AI&#xff09;的开放。他表示&#xff1a;“我们创立开放的平台&#xff0c;分享我们的技术&am…

两种列式存储格式:Parquet和ORC

背景 随着大数据时代的到来&#xff0c;越来越多的数据流向了Hadoop生态圈&#xff0c;同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要&#xff0c;在Hadoop生态圈的快速发展过程中&#xff0c;涌现了一批开源的数据分析引擎&#…

数据链路层(学习笔记)

首先要明确“数据链路”和“链路”这两个概念&#xff1a; 链路&#xff1a;从一个节点到相邻节点的一段物理现路&#xff0c;其中间没有任何的交换节点&#xff0c;所以可以说链路只是一条路径的组成部分。   数据链路&#xff1a;当需要在一条线路上传送数据的时候&#xf…

免otp动态密码登录堡垒机

环境准备 安装brew 参考文档&#xff1a;https://brew.sh/index_zh-cn.html 安装oath-toolkit 和expect brew install oath-toolkit brew install expect 正式开始 生成MFA_KEY对应的6位otp密码&#xff1a;oathtool -b --totp [MFA_KEY] MFA_KEY就是你绑定APP时&#x…

英特尔10纳米处理器再度跳票,或收缩芯片代工业务

来源&#xff1a;腾讯科技摘要&#xff1a;在全球半导体行业&#xff0c;线宽&#xff08;N纳米&#xff09;是制造厂商进行激烈竞争的指标。在全球半导体行业&#xff0c;线宽&#xff08;N纳米&#xff09;是制造厂商进行激烈竞争的指标。据报道&#xff0c;英特尔将延期到20…

简单GDB调试

GDB下载 使用yum工具直接下载 生成可用gdb调试的可执行程序 -g 会保留源文件中的函数名和变量名 启动gdb gdb 可执行程序名 set args xxx xxx 给程序传参查看程序中的源代码 当前文件 l(list) l 行号 l 函数名 非当前文件 l 文件名&#xff1a;行号 l 文件名&#xf…

人工智能应用需要高可信性(180806)

来源&#xff1a;科学网摘要&#xff1a;近日&#xff0c;“Rekognition”却闹了一个大乌龙&#xff1a;28名美国国会议员被它识别成了罪犯。小编搞了大半辈子测试和容错&#xff0c;对这方面消息比较敏感。最近看到新闻&#xff0c;商业巨头亚马逊2016年推出图像识别AI系统“R…

暑假集训中期测试 Problem D: 装箱问题2 (并查集)

Description 有很多个棱长为1的正方体货物整齐地堆在一堆。不过有一些是悬空的&#xff0c; 大概是粘上去的吧。。。 给出这些货物的相邻关系&#xff0c;求最小的长方体&#xff08;或正方体&#xff09;能装下这些货物的集装箱的体积&#xff0c;&#xff08;集装箱棱长方向与…

s3cmd安装及使用

一、安装 1.下载安装包。 这里我们使用s3cmd-1.0.0.tar.gz安装包 2.解压安装包 tar xzvf s3cmd-1.0.0.tar.gz 3.移动路径 mv s3cmd-1.0.0 /usr/local/s3cmd 4.创建软链接 ln -s /usr/local/s3cmd/s3cmd /usr/bin/s3cmd 5.执行配置命令(按提示输入相应密码等) s3cmd -…

二叉树——堆

二叉树顺序存储结构 理解堆之前先理解一下二叉树的顺序存储结构。普通的二叉树并不适合顺序存储&#xff0c;因为可能会造成大量的空间浪费。只有完全二叉树适合顺序结构存储。显示中我们通常把堆使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统中虚拟进程…

open AI 在DOTA 5v5 比赛中战胜职业选手

来源&#xff1a;AI科技大本营摘要&#xff1a;去年&#xff0c;OpenAI 在 DOTA 的 1v1 比赛中战胜了职业玩家 Dendi&#xff0c;而在距离进阶版 OpenAI Five 系统战胜人类业余玩家不过一个月的时间&#xff0c;今天凌晨&#xff0c;它又以 2:1 的战绩再次完成对人类高级玩家的…

如何体现机器智能和群体智能的关系,2018新版互联网大脑模型绘制

作者&#xff1a;刘锋 计算机博士 互联网进化论作者2018年新的这一版&#xff0c;也是互联网大脑模型图的第五个版本&#xff0c;距离第一版的发布已经有10年时间&#xff08;2008年&#xff09;&#xff0c;距离上一版第四版也有1年时间&#xff0c;在这一版中主要解决了如何…

全球互联正在创造一个知识极大丰富和隐私终结的时代

来源&#xff1a;资本实验室摘要&#xff1a;据预测&#xff0c;到2020年&#xff0c;全球物联网连接设备将超过500亿个&#xff0c;会产生600泽字节的信息。这么庞大的数据量&#xff0c;将如何影响并改变我们的生活和工作&#xff1f;聚焦前沿科技创新与传统产业升级据预测&a…

泡沫破裂之后,强化学习路在何方?

作者&#xff5c;侯宇清、陈玉荣来源&#xff5c;智能单元编辑&#xff5c;Debra一、深度强化学习的泡沫2015 年&#xff0c;DeepMind 的 Volodymyr Mnih 等研究员在《自然》杂志上发表论文 Human-level control through deep reinforcement learning[1]&#xff0c;该论文提出…

一篇文章搞懂数据仓库:维度表(设计原则、设计方法)

目录 1、什么是维度表&#xff1f; 2、维度表设计原则 &#xff08;1&#xff09;维度属性尽量丰富&#xff0c;为数据使用打下基础 &#xff08;2&#xff09;给出详实的、富有意义的文字描述 &#xff08;3&#xff09;区分数值型属性和事实 &#xff08;4&#xff09;…

Github项目:AI消除马赛克实战

目录 1、原理 2、准备工作 3、消除马赛克 4、效果对比 1、原理 该算法利用线性盒滤波器分别处理每个块的事实。对于每个块&#xff0c;它将搜索图像中的所有块像素化以检查直接匹配。 对于大多数像素化图像&#xff0c;Depix能够找到单个匹配结果。它假设这些是正确的。然…

C++继承一览

继承的概念及定义 继承机制是面向对象程序设计是代码可以复用的重要手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生的类称为派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体现了由简单到复杂的认知过程。…