linux应用程序_1_文本浏览器_4_display_2_两种显示设备
显示设备:
1、ARM板连接的LCD
2、linux中的控制台(图片模式)
以on_pc.c为例分析
设置显示结构体
static T_DispOpr g_tOnpucDispOpr = {
.pcName = "onpc",
.iBpp = BPP;
.iXres = XRES;
.iYres = YRES;
.DeviceInit = OnpucDeviceInit,
.DeviceExit = OnpucDeviceExit,
.ShowPixel = OnpucShowPixel,
.CleanScreen = OnpucCleanScreen,
};
设备初始化:
初始化vga库
进入图片模式(320*200,8位真彩色)
static int OnpucDeviceInit(void)
{
vga_init();
vga_setmode(G320x200x256);
return 0;
}
设备出口:
切换为文本显示模式
static void OnpucDeviceExit(void)
{
vga_setmode(TEXT);
}
设置调色板(顺便取色):
在画点、清屏之前,先设置调色板、并选择颜色,再进行操作
static void SetPalette(unsigned int dwColor, unsigned int iNum)
{
int iR, iG, iB;
iR = (dwColor >> 16) & 0xff;
iG = (dwColor >> 8) & 0xff;
iB = (dwColor >> 0) & 0xff;
gl_setpalettecolor(iNum, iR>>2, iG>>2, iB>>2);
vga_setcolor(iNum);
}
对于fb.c,这里只分析设备初始化:
1、打开设备
2、获取不变参数fix、可变参数var
3、设置结构体参数,供上层使用
static int FBDeviceInit(void)
{
g_iFBFd = open(FB_DEVICE_NAME,O_RDWR);
if(g_iFBFd < 0)
{
DBG_PRINT("can't open /dev/fb0\r\n");
return -1;
}
if(ioctl(g_iFBFd,FBIOGET_VSCREENINFO,&g_tVar))
{
DBG_PRINT("can't get g_tVar\r\n");
return -1;
}
if(ioctl(g_iFBFd,FBIOGET_FSCREENINFO,&g_tVFix))
{
DBG_PRINT("can't get g_tVFix\r\n");
return -1;
}
g_iScreenZize = g_tVar.xres * g_tVar.yres * g_tVar.bits_per_pixel / 8;
g_ucFbMem = (unsigned char *)mmap(NULL,g_iScreenZize,PROT_READ | PROT_WRITE , MAP_SHARED, g_iFBFd, 0);
if(g_ucFbMem == (unsigned char *)-1)
{
DBG_PRINT("can't mmap\r\n");
return -1;
}
g_tFBDispOpr.iXres = g_tVar.xres;
g_tFBDispOpr.iYres = g_tVar.yres;
g_tFBDispOpr.iBpp = g_tVar.bits_per_pixel;
DBG_PRINT("xres:%d , yres:%d , bpp:%d\r\n", g_tFBDispOpr.iXres, g_tFBDispOpr.iYres, g_tFBDispOpr.iBpp);
g_iPixelWidth = g_tVar.bits_per_pixel / 8;
g_iLineWidth = g_tVar.xres * g_iPixelWidth;
return 0;
}
完整代码:
fb.c
#include <config.h>
#include <disp_manager.h>
#include <fonts_manager.h>
#include <encoding_manager.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>
static int FBDeviceInit(void);
static int FBShowPixel(int iPenX, int iPenY,unsigned int dwColor);
static int FBCleanScreen(unsigned int dwColor);
static int g_iFBFd;
static struct fb_var_screeninfo g_tVar;
static struct fb_fix_screeninfo g_tVFix;
static int g_iPixelWidth;
static int g_iLineWidth;
static int g_iScreenZize;
static unsigned char *g_ucFbMem;
static T_DispOpr g_tFBDispOpr = {
.pcName = "fb",
.DeviceInit = FBDeviceInit,
.ShowPixel = FBShowPixel,
.CleanScreen = FBCleanScreen,
};
static int FBDeviceInit(void)
{
g_iFBFd = open(FB_DEVICE_NAME,O_RDWR);
if(g_iFBFd < 0)
{
DBG_PRINT("can't open /dev/fb0\r\n");
return -1;
}
if(ioctl(g_iFBFd,FBIOGET_VSCREENINFO,&g_tVar))
{
DBG_PRINT("can't get g_tVar\r\n");
return -1;
}
if(ioctl(g_iFBFd,FBIOGET_FSCREENINFO,&g_tVFix))
{
DBG_PRINT("can't get g_tVFix\r\n");
return -1;
}
g_iScreenZize = g_tVar.xres * g_tVar.yres * g_tVar.bits_per_pixel / 8;
g_ucFbMem = (unsigned char *)mmap(NULL,g_iScreenZize,PROT_READ | PROT_WRITE , MAP_SHARED, g_iFBFd, 0);
if(g_ucFbMem == (unsigned char *)-1)
{
DBG_PRINT("can't mmap\r\n");
return -1;
}
g_tFBDispOpr.iXres = g_tVar.xres;
g_tFBDispOpr.iYres = g_tVar.yres;
g_tFBDispOpr.iBpp = g_tVar.bits_per_pixel;
DBG_PRINT("xres:%d , yres:%d , bpp:%d\r\n", g_tFBDispOpr.iXres, g_tFBDispOpr.iYres, g_tFBDispOpr.iBpp);
g_iPixelWidth = g_tVar.bits_per_pixel / 8;
g_iLineWidth = g_tVar.xres * g_iPixelWidth;
return 0;
}
static int FBShowPixel(int iPenX, int iPenY,unsigned int dwColor)
{
unsigned char *pucPen8 = g_ucFbMem + iPenY * g_iLineWidth + iPenX * g_iPixelWidth;
unsigned short *pwPen16;
unsigned int *pdwPen32;
unsigned int dwR,dwG,dwB;
pwPen16 = (unsigned short *)pucPen8;
pdwPen32 = (unsigned int *)pucPen8;
switch(g_tVar.bits_per_pixel)
{
case 8:
{
*pucPen8 = dwColor;
break;
}
case 16:
{
dwR = (dwColor>>19) & 0x1f;
dwG = (dwColor>>10) & 0x3f;
dwB = (dwColor>>3) & 0x1f;
dwColor = (dwR<<11) | (dwG<<5) | (dwB);
*pwPen16 = dwColor;
break;
}
case 32:
{
*pdwPen32 = dwColor;
break;
}
default:
{
DBG_PRINT("can't support %dbpp\r\n",g_tVar.bits_per_pixel);
return -1;
}
}
return 0;
}
static int FBCleanScreen(unsigned int dwColor)
{
unsigned char *pwPen8 = g_ucFbMem;
unsigned short *pwPen16 = (unsigned short *)pwPen8;
unsigned int *pdwPen32 = (unsigned int *)pwPen16;
unsigned int dwR,dwG,dwB;
int i;
switch(g_tVar.bits_per_pixel)
{
case 8:
{
memset(pwPen8,dwColor,g_iScreenZize);
break;
}
case 16:
{
dwR = (dwColor>>19) & 0x1f;
dwG = (dwColor>>10) & 0x3f;
dwB = (dwColor>>3) & 0x1f;
dwColor = (dwR<<11) | (dwG<<5) | (dwB);
for(i = 0;i < g_iScreenZize;i+=2)
{
*pwPen16 = dwColor;
pwPen16++;
}
break;
}
case 32:
{
for(i = 0;i < g_iScreenZize;i+=4)
{
*pdwPen32 = dwColor;
pdwPen32++;
}
break;
}
default:
{
DBG_PRINT("can't support %dbpp\r\n",g_tVar.bits_per_pixel);
break;
}
}
return 0;
}
int FBInit(void)
{
RegisterDispOpr(&g_tFBDispOpr);
return 0;
}
on_pc.c
#include <config.h>
#include <disp_manager.h>
#include <fonts_manager.h>
#include <encoding_manager.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>
#define XRES 320
#define YRES 200
#define BPP 8
static int OnpucDeviceInit(void);
static int OnpucShowPixel(int iPenX, int iPenY,unsigned int dwColor);
static int OnpucCleanScreen(unsigned int dwColor);
static void OnpucDeviceExit(void);
static T_DispOpr g_tOnpucDispOpr = {
.pcName = "onpc",
.iBpp = BPP;
.iXres = XRES;
.iYres = YRES;
.DeviceInit = OnpucDeviceInit,
.DeviceExit = OnpucDeviceExit,
.ShowPixel = OnpucShowPixel,
.CleanScreen = OnpucCleanScreen,
};
static int OnpucDeviceInit(void)
{
vga_init();
vga_setmode(G320x200x256);
return 0;
}
static void OnpucDeviceExit(void)
{
vga_setmode(TEXT);
}
static void SetPalette(unsigned int dwColor, unsigned int iNum)
{
int iR, iG, iB;
iR = (dwColor >> 16) & 0xff;
iG = (dwColor >> 8) & 0xff;
iB = (dwColor >> 0) & 0xff;
gl_setpalettecolor(iNum, iR>>2, iG>>2, iB>>2);
vga_setcolor(iNum);
}
static int OnpucShowPixel(int iPenX, int iPenY,unsigned int dwColor)
{
SetPalette(dwColor, 5);
vga_drawpixel(iPenX, iPenY);
return 0;
}
static int OnpucCleanScreen(unsigned int dwColor)
{
int iX,iY;
SetPalette(dwColor, 4);
for(iY = 0;iY < g_tOnpucDispOpr.iYres;iY++)
for(iX = 0;iX < g_tOnpucDispOpr.iXres;iX++)
vga_drawpixel(iX, iY);
return 0;
}
int OnpucInit(void)
{
RegisterDispOpr(&g_tOnpucDispOpr);
return 0;
}