- 电子量产工具——2-4显示系统_单元测试
- 软件总框架
一、单元测试:规范代码结构、添加测试程序
二、代码
- 1.display(有两个 disp_manager.c和framebuffer.c)
- 2.include(disp_manager.h)
- 3.unittest(测试文件disp_test.c)
- 总结
软件总框架
一、单元测试:规范代码结构、添加测试程序
二、代码 1.display(有两个 disp_manager.c和framebuffer.c)
disp_manager.c
#include
#include
#include
/* 管理底层的LCD、WEB */
static PDispOpr g_DispDevs = NULL;
static PDispOpr g_DispDefault = NULL;
static DispBuff g_tDispBuff;
static int line_width;
static int pixel_width;
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 RegisterDisplay(PDispOpr ptDispOpr)
{
ptDispOpr->ptNext = g_DispDevs;
g_DispDevs = ptDispOpr;
}
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();
if (ret)
{
printf("DeviceInit err\n");
return -1;
}
ret = g_DispDefault->GetBuffer(&g_tDispBuff);
if (ret)
{
printf("GetBuffer err\n");
return -1;
}
line_width = g_tDispBuff.iXres * g_tDispBuff.iBpp/8;
pixel_width = g_tDispBuff.iBpp/8;
return 0;
}
PDispBuff GetDisplayBuffer(void)
{
return &g_tDispBuff;
}
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff)
{
return g_DispDefault->FlushRegion(ptRegion, ptDispBuff);
}
void DisplayInit(void)
{
extern void FramebufferInit(void);
FramebufferInit();
}
framebuffer.c
#include
#include
#include
/* 管理底层的LCD、WEB */
static PDispOpr g_DispDevs = NULL;
static PDispOpr g_DispDefault = NULL;
static DispBuff g_tDispBuff;
static int line_width;
static int pixel_width;
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 RegisterDisplay(PDispOpr ptDispOpr)
{
ptDispOpr->ptNext = g_DispDevs;
g_DispDevs = ptDispOpr;
}
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();
if (ret)
{
printf("DeviceInit err\n");
return -1;
}
ret = g_DispDefault->GetBuffer(&g_tDispBuff);
if (ret)
{
printf("GetBuffer err\n");
return -1;
}
line_width = g_tDispBuff.iXres * g_tDispBuff.iBpp/8;
pixel_width = g_tDispBuff.iBpp/8;
return 0;
}
PDispBuff GetDisplayBuffer(void)
{
return &g_tDispBuff;
}
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff)
{
return g_DispDefault->FlushRegion(ptRegion, ptDispBuff);
}
void DisplayInit(void)
{
extern void FramebufferInit(void);
FramebufferInit();
}
2.include(disp_manager.h)1.display 初始化 {//2.调用framebuffer初始化}
3.注册LCD硬件相关的结构体
4.注册LCD硬件相关函数 放入 g_DispDevs 链表
5.对应不同的显示方式 ——》SelectDefaultDisplay
6.来选择默认的输出设备
7.来初始化默认的设备 ————》》然后去调用 PutPixel
8.绘制想要的图片 ————》》 更新到硬件上去 FlushDisplayRegion
9.绘制好的区域 更新(刷)到硬件上去
disp_manager.h
#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H
#ifndef NULL
#define NULL (void *)0
#endif
typedef struct DispBuff {
int iXres;
int iYres;
int iBpp;
char *buff;
}DispBuff, *PDispBuff;
typedef struct Region {
int iLeftUpX;
int iLeftUpY;
int iWidth;
int iHeigh;
}Region, *PRegion;
typedef struct DispOpr {
char *name;
int (*DeviceInit)(void);
int (*DeviceExit)(void);
int (*GetBuffer)(PDispBuff ptDispBuff);
int (*FlushRegion)(PRegion ptRegion, PDispBuff ptDispBuff);
struct DispOpr *ptNext;
}DispOpr, *PDispOpr;
void RegisterDisplay(PDispOpr ptDispOpr);
void DisplayInit(void);
int SelectDefaultDisplay(char *name);
int InitDefaultDisplay(void);
int PutPixel(int x, int y, unsigned int dwColor);
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff);
PDispBuff GetDisplayBuffer(void);
#endif
3.unittest(测试文件disp_test.c)1.DispBuff 数据结构抽象 显示屏BUFFER
2.Region 数据结构抽象 更新到硬件
3.DispOpr 数据结构抽象 显示屏硬件 *** 作
disp_test.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define FONTDATAMAX 4096
static const unsigned char fontdata_8x16[FONTDATAMAX] ={...省略...}
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); /* 黑 */
}
}
}
}
int main(int argc, char **argv)
{
Region region;
PDispBuff ptBuffer;
DisplayInit();
SelectDefaultDisplay("fb");
InitDefaultDisplay();
lcd_put_ascii(100, 100, 'A');
region.iLeftUpX = 100;
region.iLeftUpY = 100;
region.iWidth = 8;
region.iHeigh = 16;
ptBuffer = GetDisplayBuffer();
FlushDisplayRegion(®ion, ptBuffer);
return 0;
}
总结
makefile 编译
然后各种调试
要清除LCD的GUI
目前只能显示一个字母
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)