linux应用程序_1_文本浏览器_4_display_2_两种显示设备

 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;
}



发布了71 篇原创文章 · 获赞 4 · 访问量 7227

猜你喜欢

转载自blog.csdn.net/floatinglong/article/details/86635090