LCD工作的硬件需求:
要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅動器,而且還需要相應的LCD控制器。在通常情況下,生產廠商把LCD驅動器會以COF/COG的 形式與LCD玻璃基板製作在一起,而LCD控制器則是由外部的電路來實現,現在很多的MCU內部都集成了LCD控制器,如S3C2410/2440等。通 過LCD控制器就可以產生LCD驅動器所需要的控制信號來控制STN/TFT屏了。
幀緩衝(FrameBuffer):
FrameBuffer是Linux爲顯示設備提供的一個接口,它把一些顯示設備描述成一個緩衝區,允許應用程序通過 FrameBuffer定義好的接口訪問這些圖形設備,從而不用去關心具體的硬件細節。對於幀緩衝設備而言,只要在顯示緩衝區與顯示點對應的區域寫入顏色值,對應的顏色就會自動的在屏幕上顯示。
Linux中由Struct fb_info這結構體記錄幀緩衝設備的全部信息,包括設備的設置參數、狀態、以及對底層硬件操作的函數指針。其中,最重要的兩個成員是:struct fb_var_screeninfo var和struct fb_fix_screeninfo fix
struct fb_var_screeninfo:主要是記錄用戶可以修改的控制器可變參數
struct fb_fix_screeninfo fix:就是固定的控制器配置,比如屏幕緩衝區的物理地址和長度
FrameBuffer 設備提供了若干 ioctl 命令,通過這些命令,可以獲得顯示設備的一些固定信息(比如顯示內存大小)、與顯示模式相關的可變信息(比如分辨率、象素結構、每掃描線的字節寬度),以及僞彩色模式下的調色板信息等等。
LCD初始化:
(1)首先打開 /dev/fb0 或 /dev/fb1設備;
(2)通過framebuffer提供的 ioctl 命令獲取LCD設備信息,如分辨率、像素位數等;
(3)通過 mmap 系統調用進行地址映射,隨後用 memset 將屏幕清空。
typedef struct lcdParam
{
int lcdWidth;
int lcdHeight;
int lcdBitsPerPixel;
int lcdLineWidth;
unsigned char *lcdFrameBufferMem;
}T_lcdParam,*PT_lcdParam;
int LcdDeviceInit(PT_lcdParam pt_lcdParam)
{
int iError;
int ifd;
int lcdScreenSize;
struct fb_var_screeninfo tFBVar;
struct fb_fix_screeninfo tFBFix;
ifd = open("/dev/fb0",O_RDWR); //打開framebuffer設備
iError = ioctl(ifd, FBIOGET_VSCREENINFO, &tFBVar);
if (iError < 0)
{
DBG_PRINTF("can't get fb's var\n");
return -1;
}
iError = ioctl(ifd, FBIOGET_FSCREENINFO, &tFBFix);
if (iError < 0)
{
DBG_PRINTF("can't get fb's fix\n");
return -1;
}
lcdScreenSize = tFBVar.xres * tFBVar.yres * tFBVar.bits_per_pixel / 8; //計算LCD屏幕有多少Bytes
pt_lcdParam->lcdFrameBufferMem= (unsigned char *)mmap(NULL , lcdScreenSize,PROT_READ | PROT_WRITE, MAP_SHARED, ifd, 0);//映射FrameBuffer給打開的LCD設備ifd
if (0 > pt_lcdParam->lcdFrameBufferMem)
{
DBG_PRINTF("can't mmap\n");
return -1;
}
memset(pt_lcdParam->lcdFrameBufferMem,0,lcdScreenSize);
return 0;
}