基於S3C2440的USB攝像頭應用簡單實現之LCD初始化(二)

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

疑問點:Linux提供的FrameBuffer接口是如何與LCD設備聯繫起來,將在以後詳述。

下一步:USB攝像頭初始化

發佈了22 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章