分配、设置、注册DispOpr结构体,由Display_manager.c通过链表管理。
DispOpr结构体包含显示设备的 属性 和 操作函数。
其中FBShowPixel主要用于显示字体点阵,ShowPage主要用于显存管理。
typedef struct DispOpr {
char *name; /* 显示模块的名字 */
int iXres; /* X分辨率 */
int iYres; /* Y分辨率 */
int iBpp; /* 一个象素用多少位来表示 */
int iLineWidth; /* 一行数据占据多少字节 */
unsigned char *pucDispMem; /* 显存地址 */
int (*DeviceInit)(void); /* 设备初始化函数 */
int (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor); /* 把指定座标的象素设为某颜色 */
int (*CleanScreen)(unsigned int dwBackColor); /* 清屏为某颜色 */
int (*ShowPage)(PT_VideoMem ptVideoMem); /* 显示一页,数据源自ptVideoMem */
struct DispOpr *ptNext; /* 链表 */
}T_DispOpr, *PT_DispOpr;
};
"framebuffer显示设备"的初始化函数
static int FBDeviceInit(void){
g_fd = open(FB_DEVICE_NAME, O_RDWR); //打开设备
ioctl(g_fd, FBIOGET_VSCREENINFO, &g_tFBVar); //获取可变参数
ioctl(g_fd, FBIOGET_FSCREENINFO, &g_tFBFix); //获取固定参数
g_dwScreenSize = g_tFBVar.xres * g_tFBVar.yres * g_tFBVar.bits_per_pixel / 8; //屏幕大小
g_pucFBMem = (unsigned char *)mmap(NULL , g_dwScreenSize, PROT_READ | PROT_WRITE, MAP_SHARED, g_fd, 0); //内存映射
//设置T_DispOpr的属性成员
g_tFBOpr.iXres = g_tFBVar.xres;
g_tFBOpr.iYres = g_tFBVar.yres;
g_tFBOpr.iBpp = g_tFBVar.bits_per_pixel;
g_tFBOpr.iLineWidth = g_tFBVar.xres * g_tFBOpr.iBpp / 8;
g_tFBOpr.pucDispMem = g_pucFBMem;
g_dwLineWidth = g_tFBVar.xres * g_tFBVar.bits_per_pixel / 8;
g_dwPixelWidth = g_tFBVar.bits_per_pixel / 8;
return 0;
}
设置FrameBuffer的指定象素为某颜色
static int FBShowPixel(int iX, int iY, unsigned int dwColor){
unsigned char *pucFB;
unsigned short *pwFB16bpp;
unsigned int *pdwFB32bpp;
unsigned short wColor16bpp; /* 565 */
int iRed,iGreen,iBlue;
if ((iX >= g_tFBVar.xres) || (iY >= g_tFBVar.yres)){
DBG_PRINTF("out of region\n");
return -1;
}
pucFB = g_pucFBMem + g_dwLineWidth * iY + g_dwPixelWidth * iX;
pwFB16bpp = (unsigned short *)pucFB;
pdwFB32bpp = (unsigned int *)pucFB;
switch (g_tFBVar.bits_per_pixel){
case 8:{
*pucFB = (unsigned char)dwColor;
break;
}
case 16:{
/* 从dwBackColor中取出红绿蓝三原色,构造为16Bpp的颜色*/
iRed = (dwColor >> (16+3)) & 0x1f;
iGreen = (dwColor >> (8+2)) & 0x3f;
iBlue = (dwColor >> 3) & 0x1f;
wColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;
*pwFB16bpp = wColor16bpp;
break;
}
case 32:{
*pdwFB32bpp = dwColor;
break;
}
default :{
DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);
return -1;
}
}
return 0;
}
"framebuffer显示设备"的清屏函数
static int FBCleanScreen(unsigned int dwBackColor){
unsigned char *pucFB;
unsigned short *pwFB16bpp;
unsigned int *pdwFB32bpp;
unsigned short wColor16bpp; /* 565 */
int iRed,iGreen,iBlue;
int i = 0;
pucFB = g_pucFBMem;
pwFB16bpp = (unsigned short *)pucFB;
pdwFB32bpp = (unsigned int *)pucFB;
switch (g_tFBVar.bits_per_pixel){
case 8:{
memset(g_pucFBMem, dwBackColor, g_dwScreenSize);
break;
}
case 16:{
/* 从dwBackColor中取出红绿蓝三原色,构造为16Bpp的颜色*/
iRed = (dwBackColor >> (16+3)) & 0x1f;
iGreen = (dwBackColor >> (8+2)) & 0x3f;
iBlue = (dwBackColor >> 3) & 0x1f;
wColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;
while (i < g_dwScreenSize){
*pwFB16bpp = wColor16bpp;
pwFB16bpp++;
i += 2; //2字节
}
break;
}
case 32:{
while (i < g_dwScreenSize){
*pdwFB32bpp = dwBackColor;
pdwFB32bpp++;
i += 4; //4字节
}
break;
}
default :{
DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);
return -1;
}
}
return 0;
}
把PT_VideoMem中的颜色数据在FrameBuffer上显示出来,参数为VideoMem结构体,直接复制memcpy。
static int FBShowPage(PT_VideoMem ptVideoMem){
memcpy(g_tFBOpr.pucDispMem, ptVideoMem->tPixelDatas.aucPixelDatas, ptVideoMem->tPixelDatas.iTotalBytes);
return 0;
}