Framebuffer(幀緩衝)提供統一的圖形介面,讓應用程式無需關心底層硬體細節即可繪圖。本文系統介紹 Linux Framebuffer 驅動架構、核心資料結構、開發步驟、核心配置選項,並以實際驅動碼片段說明關鍵實作細節。
struct fb_infostruct file_operationsfile_operations 函數fb_ops 函數操作硬體fb_ops 指標fb_drivers[] 中的 xxxfb_init() 初始化| 檔案 | 角色 |
|---|---|
fb.h | 定義結構體、巨集、變數 |
fbmem.c | 實現裝置入口、file_operations |
xxxfb.c | 廠商自訂驅動,實現 fb_info、fb_ops |
使用者可設定:解析度(xres/yres)、色深(bits_per_pixel)、時序參數。
硬體固定屬性:螢幕緩衝區物理位址、長度、型號等,不可修改。
modename:裝置名稱fontname:字體名稱fbops:指向底層操作函數指標fb_info
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif
};
static struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
};
static struct fb_ops xxxfb_ops = {
.owner = THIS_MODULE,
.fb_open = xxxfb_open,
.fb_release = xxxfb_release,
.fb_get_fix = fbgen_get_fix,
.fb_get_var = fbgen_get_var,
.fb_set_var = fbgen_set_var,
.fb_get_cmap = fbgen_get_cmap,
.fb_set_cmap = fbgen_set_cmap,
.fb_pan_display = fbgen_pan_display,
.fb_ioctl = xxxfb_ioctl,
};
xxxfb.c 定義顯存大小:#define VIDEOMEMSIZE (1*1024*1024)xxxfb_set_var() 依硬體調整 var 參數make menuconfig → Character devices → Virtual terminalSupport for console on virtual terminal*,模組選 M)啟動後 /dev/fb0(major 29, minor 0)即可使用。