1.幀緩衝的基本原理通過 framebuffer ,應用程式用 mmap 把顯存映射到應用程式虛擬位址空間,將要顯示的資料寫入這個記憶體空間就可以在螢幕上顯示出來; 驅動程式分配系統記憶體作為顯存;實現 file_operations 結構中的介面,為應用程式服務;實現 fb_ops 結構中的介面,控制和操作 LCD 控制器; 驅動程式將顯存的起始地址和長度傳給 LCD 控制器的寄存器 (一般由 fb_set_var 完成) 。 LCD 控制器會自動的將顯存中的資料顯示在 LCD 屏上。2.register_framebuffer(struct fb_info *fb_info)unregister_framebuffer(struct fb_info *fb_info)底層驅動程式的工作基本上是填充 fb_info 結構,然後註冊它3. OMAP 的 DSS顯示DSS(Display sub system)顯示子系統顯示子系統的庫在drivers/video/omap2/dss目錄中,主要包含了core.c, dispc.c, display.c, dpi.c, dss.c ,manager.c omapdss.c, overlay.c venc.ccore.c中定義了platform_driverstatic struct platform_driver omap_dss_driver = {.driver = {.name = "omapdss",.owner = THIS_MODULE,},}它和arch/arm/mach-omap2中定義的平台裝置相匹配static struct platform_device my_dss_device = {.name = "omapdss",.id = -1,.dev = {.platform_data = &my_dss_data,},};檔案系統的資訊包含在以下目錄中/ # ls sys/devices/platform/omapdss/ueventmodaliassubsystempowerdrivermanager0manager1overlay0overlay1overlay2microamps_requested_vdda_dacdisplay2display1display0----------------------------------------------------overlay0目錄中為基本顯示層的資訊overlay1和overlay2分別目錄中分別是兩個疊加顯示層的資訊manager0和manager1中則提供了管理方面的功能查看sys檔案系統/ # cat sys/devices/platform/omapdss/overlay0/name gfxgfx為graphics的含義,表示overlay0的名稱為圖形層,檔案enable是一個可又控制的# echo 0 > sys/devices/platform/omapdss/overlay0/enabled 關屏# echo 1 > sys/devices/platform/omapdss/overlay0/enabled 開屏4. 主顯示驅動的framebufferdrivers/video/omap2/omapfbomafb.c, omapfb-sysfs.c, omapfb-ioctl.c, omapfb-main.comapfb-main.c定義了platform_driver#define MODULE_NAME"omapfb"static struct platform_driver omapfb_driver = {.probe= omapfb_probe,.remove= omapfb_remove,.suspend= omapfb_suspend,.resume= omapfb_resume,.driver= {.name= MODULE_NAME,.owner= THIS_MODULE,},};與arch/arm/plat-omap/fb.c中的platform_device相匹配static struct platform_device omap_fb_device = {.name= "omapfb",.id= -1,.dev = {.dma_mask= &omap_fb_dma_mask,.coherent_dma_mask= ~(u32)0,.platform_data= &omapfb_config,},.num_resources = 0,};omapfb-main.c的調用static int omapfb_probe(struct platform_device *pdev){struct omapfb2_device *fbdev = NULL;omapfb_create_framebuffers(fbdev);/*調用 framebuffer_alloc 為fb_info結構體分配記憶體*/}static int omapfb_create_framebuffers(struct omapfb2_device *fbdev){struct fb_info *fbi;struct omapfb2_device *fbdev = NULL;fbdev = kzalloc(sizeof(struct omapfb2_device), GFP_KERNEL);fbi = framebuffer_alloc(sizeof(struct omapfb_info),fbdev->dev);...omapfb_fb_init(fbdev, fbdev->fbs[i]);//初始化//註冊framebufferfor (i = 0; i < fbdev->num_fbs; i++) {r = register_framebuffer(fbdev->fbs[i]);return r;}}static int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi){fbi->fbops = &omapfb_ops;}static struct fb_ops omapfb_ops = {.owner = THIS_MODULE,.fb_open = omapfb_open,.fb_release = omapfb_release,.fb_fillrect = cfb_fillrect,.fb_copyarea = cfb_copyarea,.fb_imageblit = cfb_imageblit,.fb_blank = omapfb_blank,.fb_ioctl = omapfb_ioctl,.fb_check_var = omapfb_check_var,.fb_set_par = omapfb_set_par,.fb_pan_display = omapfb_pan_display,.fb_mmap= omapfb_mmap,.fb_setcolreg= omapfb_setcolreg,.fb_setcmap= omapfb_setcmap,/*.fb_write= omapfb_write,*/};