文章目录

  • 前言
  • 一、显示系统分析
  • 二、封装显示结构体
  • 三、底层 Framebuffer
  • 四、显示管理层
  • 五、测试程序
    • 实验效果图:
  • 总结

前言

最近看了 电子量产工具 这个项目,本专栏是对该项目的一个总结。


一、显示系统分析


可以看到上面的框图,我们可以分为三大部分:

  • 从最下面的 第 1 层开始。这是整个项目的最底层,主要负责处理数据和逻辑,与板子直接进行交互。
  • 中间的是第 2 层 管理层。负责处理应用的中间件功能,它位于底层程序和用户界面之间,主要向上层程序提供所需的底层代码。
  • 最上面的就是综合应用,用来实现用户所需的功能。

项目主要包含了 5 个方面,分别是 显示管理器,输入管理器,字体管理器,页面管理器,图片格式管理器。首先实现显示系统功能。

可以看到 显示管理器 下面有两种显示输出的方式:Framebufferweb输出。这里只着重讲解 Framebuffer 的显示实现。

在编写显示系统之前需要对 Framebuffer 有一定的了解,如何不了解的可以参考我之前的文章:Linux 应用基础 Framebuffer应用编程

二、封装显示结构体

对于显示方式有两种,可以将功能封装在结构体中,提高代码的扩展性和灵活性。

  1. DispOpr 显示设备结构体
typedef struct DispOpr {char *name;int (*DeviceInit)(void);                                      //显示设备初始化int (*DeviceExit)(void);int (*GetBuffer)(PDispBuff ptDispBuff);                            //获取LCD的framebufferint (*FlushRegion)(PRegion ptRegion, PDispBuff ptDispBuff);      //将数据刷新到LCDstruct DispOpr *ptNext;                                          //指针,用于连接链表
}DispOpr, *PDispOpr;
  1. DispBuff 是一个结构体,用于封装LCD的相关信息,例如分辨率,像素等。
    buff: 用来后面 存放起始地址。
typedef struct DispBuff {int iXres;                                              //x方向的分辨率int iYres;                                             //y方向的分辨率int iBpp;                                              //bits_per_pixel,每个像素占多少位char *buff;
}DispBuff, *PDispBuff;
  1. Region 也是一个结构体,用来表示一个区域的左上角坐标,宽度以及高度。
typedef struct Region {int iLeftUpX;int iLeftUpY;int iWidth;int iHeigh;
}Region, *PRegion;

三、底层 Framebuffer

  1. 在 framebuffer 里实现 DispOpr 结构体。

    这里要设置 name, 因为用于显示的设备不止 framebuffer ,还有 web 输入。
    中间管理层,会根据这里所设置的 name 来 按照需求 选择不同的显示设备。

  1. FbDeviceInit 中完成 framebuffer 的初始化。

  1. FbGetBuffer负责向上层 管理器返回初始化后的 LCD 的framebuffer 。将 var 中数值取出 放入函数参数的结构体里,传递给上层。

注意: FbFlushRegion 可以将绘制好buff 刷新到 LCD 上。
但是,在 FbDeviceInit 函数中,我们已经返回LCD的framebuffer, 以后上层APP可以直接操作LCD, 可以不用 FbFlushRegion


四、显示管理层

管理层 起着承上启下的作用。

首先,管理层 管理着不同的显示设备,我们可以将不同设备放入链表,然后根据 name来选择。

  1. 先将设备注册进入链表。

    g_DispDevs 是头指针,在 RegisterDisplay 函数中,采用头添加的方法将设备加入链表。
  2. 然后根据 要设备名来找到相应的显示设备。找到设备后对其初始化。
    底层的代码已经实现了相应功能,只需要调用即可。
int SelectDefaultDisplay(char *name)
{PDispOpr pTmp = g_DispDevs;                   //临时指针指向头指针while (pTmp) {if (strcmp(name, pTmp->name) == 0)            //判断名字是否相同{g_DispDefault = pTmp;                   //找到目标设备return 0;}pTmp = pTmp->ptNext;                  //遍历链表}return -1;
}int InitDefaultDisplay(void)
{int ret;ret = g_DispDefault->DeviceInit();         //调用底层 DeviceInit初始化if (ret){printf("DeviceInit err\n");return -1;}ret = g_DispDefault->GetBuffer(&g_tDispBuff);      //调用底层 GetBuffer获取LCD的framebufferif (ret){printf("GetBuffer err\n");return -1;}line_width  = g_tDispBuff.iXres * g_tDispBuff.iBpp/8;pixel_width = g_tDispBuff.iBpp/8;return 0;
}
  1. 为了方便上层 APP 使用 LCD 的 framebuffer,我们需要将 framebuffer 传递给上层。

五、测试程序

测试层程序用于验证和检查应用的正确性和稳定性,例如 单元测试。

测试在 LCD 上显示一个英文字符。
在 main 函数里调用 管理层的代码,来实现相应功能。

  • 刷新LCD 的代码可以忽略不写,因为我们直接 返回 LCD 的 framebuffer , 以后上层APP可以直接操作 LCD , 可以不用 FbFlushRegion
  • 也可以 malloc 返回一块无关的 buffer , 要使用 FbFlushRegion

注意 :显示字符前,要实现描点函数。
pen_8 ,pen_16,pen_32 是起笔点,可以相互转化。

/* 描点函数 */
int PutPixel(int x, int y, unsigned int dwColor)
{unsigned char *pen_8 = (unsigned char *)(g_tDispBuff.buff+y*line_width+x*pixel_width);unsigned short *pen_16;   unsigned int *pen_32;   unsigned int red, green, blue;  pen_16 = (unsigned short *)pen_8;pen_32 = (unsigned int *)pen_8;switch (g_tDispBuff.iBpp){case 8:{*pen_8 = dwColor;break;}case 16:{/* 565 */red   = (dwColor >> 16) & 0xff;green = (dwColor >> 8) & 0xff;blue  = (dwColor >> 0) & 0xff;dwColor = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);*pen_16 = dwColor;break;}case 32:{*pen_32 = dwColor;break;}default:{printf("can't surport %dbpp\n", g_tDispBuff.iBpp);return -1;break;}}return 0;
}/* 显示字符 */
void lcd_put_ascii(int x, int y, unsigned char c)
{unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];int i, b;unsigned char byte;for (i = 0; i < 16; i++){byte = dots[i];for (b = 7; b >= 0; b--){if (byte & (1<<b)){/* show */PutPixel(x+7-b, y+i, 0xffffff);}else{/* hide */PutPixel(x+7-b, y+i, 0); }}}
}

实验效果图:


总结

虽然 这种分层的写法看起来更复杂,但是对于代码的可以移植性会大大提高。

【电子量产工具】1.显示系统相关推荐

  1. 电子产品量产工具-软件架构-显示系统

    该笔记为百问网韦东山老师免费课程学习过程的整理,学习过程中,软件架构思想很重要,所以在每学习完一个单元后悔整理一下.由于韦老师在授课过程中的函数名称和变量命名时不太直观,所以我就自己根据软件分离来重新 ...

  2. 电子量产工具:输入系统-输入管理单元测试

    软件总框图: 输入管理单元测试 添加input_test.c,内容如下 #include <sys/mman.h> #include <sys/types.h> #includ ...

  3. 【电子量产工具】6. 业务系统

    文章目录 前言 一.业务系统分析 二.处理配置文件 三.生成界面 四.根据输入事件找到按钮 五.业务系统总流程测试 测试效果: 总结 前言 最近看了 电子量产工具 这个项目,本专栏是对该项目的一个总结 ...

  4. 【电子量产工具】4. UI系统

    文章目录 前言 一.UI界面分析 二.结构体描述按钮 三.按钮初始化 四.默认绘制按键事件函数 五.默认按下按键事件函数 六.测试程序 实验效果 总结 前言 最近看了 电子量产工具 这个项目,本专栏是 ...

  5. 项目一:电子量产工具

    软件总框架 1:设计构思-显示管理器 1.1 显示部分-数据结构抽象 对两个不同的设备(Frambuffer与WEB),抽象出同一个结构体类型, 总概括:先得到一个buffer,在这个buffer中你 ...

  6. 慧荣SMI SM32X量产工具G1219 图文教程.恢复方法

    第一步:先用ChipGenius芯片检测工具检测您的U盘信息以便查找合适的量产工具: 第二步:根据ChipGenius检测的结果  找到合适的量产工具: 第三步:点击Scan USB按钮扫描一下就可以 ...

  7. 惊心动魄修复U盘【另附U盘量产工具】(显示文件格式为RAW 需要格式化)

    序 昨天把一个8G的U盘借给同事,结果今天早上来,她和我说U盘打不开要格式化了,因为之前遇到这样的问题,也帮同事们弄过,所以满怀信心安慰MM说,没事的,结果按照以前的办法失效了..拿到自己的电脑试了好 ...

  8. 方便的U盘量产工具不刻盘装系统

    2019独角兽企业重金招聘Python工程师标准>>> 可以把U盘模拟成usb-cdrom,iso文件弄到这个cdrom里面,在能usb启动的机器上设好usb-cdrom启动就可以利 ...

  9. 绝好用的迈科威(主控芯片)量产工具

    UdTools1.0. 4.3_20080820 1.修改了"工厂设置"保存,程序关闭后"工厂设置"中的设置会保存,所以在量产前检查一下设置是否符合您的量产要求 ...

最新文章

  1. 英特尔第七任CEO敲定 斯旺为何受到董事会青睐?
  2. WinSock网络编程基础(3)server
  3. 用CSS制作圆角框的方法一,二
  4. 《Head First设计模式》第六章笔记-命令模式
  5. Android系统架构开篇
  6. 积微论坛第一期 - 基于大数据整合预测土壤枯萎病的发生 (文稿分享)
  7. bzoj4819 [Sdoi2017]新生舞会 分数规划(实数二分)+网络流检验
  8. C++11多线程のfuture,promise,package_task
  9. python学习笔记-Day5
  10. 如何使用STM32F4的BootLoader和APP程序
  11. RBM,DBM和DBN之间有什么区别?
  12. 返回固定页面的http服务器
  13. stm32蜂鸣器程序
  14. 【转载】 乙女游戏汇总
  15. #pragma DATA_SECTION的使用
  16. 安师大计算机系导师,安徽师范大学数学计算机科学学院导师介绍:陈付龙
  17. 测试网络SNMP连接的几个方法(我平时调试SNMP程序时用到的几个解决方案)
  18. 计算机专业可取证书名称,职业中专计算机维修专业发的职业资格证书名称叫什..._出版资格_帮考网...
  19. 有关多项式处理的各种算法总结
  20. 基础计算机教学论文,计算机基础教学论文范文

热门文章

  1. 166万人被骗3000万元!最近全网刷屏的网红游戏翻车了?
  2. Ajax——跨域与JSONP
  3. 2022-2028全球与中国环氧模塑料市场现状及未来发展趋势
  4. 来自波哥大的见闻与思考
  5. Web客户端的几种存储方式
  6. notepad++是免费的,网上搜出来收费的不是官网
  7. 实际上我没有选择的余地
  8. 产品经理如何提升沟通能力
  9. 如何复制一个WorkSheet到当前WorkBook WorkSheet.Copy
  10. 秋季喝什么茶对身体好