什麼是framebuffer 設備:
framebuffer 是一種能夠提取圖形的硬件設備,是用戶進入圖形界面很好的接口。
有了framebuffer,用戶的應用程序不需要對底層的驅動的深入瞭解就能夠做出很好的圖形。
對於用戶而言,它和 /dev 下面的其他設備沒有什麼區別,用戶可以把 framebuffer 看成一塊內存,既可以向這塊內存中寫入數據,也可以從這塊內存中讀取數據。
第一個被註冊的 framebuffer 的 minor 等於0,第二個被註冊的 framebuffer的minor 等於 1,以此類推。其 major 都為 29。
framebuffer 內部結構說明:
相關檔案:
linux/include/linux/fb.h
linux/drivers/video/fbmem.c
fb_var_screeninfo 是用來描述圖形卡的特性的。通常是被用戶設置的。
struct fb_var_screeninfo /* Timing: All values in pixclocks, except pixclock (of course) */ |
fb_fix_screeninfo 定義了圖形卡的硬件特性,是不能改變的,用戶選定了哪一個圖形卡,那麼它的硬件特性也就定下來了。
struct fb_fix_screeninfo |
fb_cmap 描述設備無關的顏色映射信息。可以通過 FBIOGETCMAP 和 FBIOPUTCMAP 對應的 ioctl操作設定或獲取顏色映射信息。
struct fb_cmap |
fb_info 定義了當前圖形卡 framebuffer 設備的獨立狀態,一個圖形卡可能有兩個 framebuffer, 在這種情況下,就需要兩個 fb_info 結構。這個結構是唯一在內核空間可見的。
struct fb_info { |
#include <stdio.h> #include "bitmap.h" int main() |
** 參考資料 **
http://moto.debian.org.tw/viewtopic.php?p=56374
http://www.91linux.com/html/article/kernel/20071204/8805.html
fb_ops 用戶應用可以使用 ioctl() 系統調用來操作設備,這個結構就是用一支持 ioctl() 的這些操作的。 (跟我在程式碼裡面看到的不太一樣??)
struct fb_ops |
LCD Frame buffer 函式呼叫順序:
s3c2410fb_probe():
- s3c2410fb_map_video_memory()
- s3c2410fb_init_registers()
- s3c2410fb_check_var()
s3c2410fb_set_par() -> s3c2410fb_activate_var():
- s3c2410fb_calculate_tft_lcd_regs()
- s3c2410fb_set_lcdaddr()
對 framebuffer 操作:
dd if=/dev/fb0 of=fbfile
可以將 fb0 中的內容保存下來存到 fbfile 裡
如果顯示模式是 1024*768 的 8 位色
dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
可以清空 framebuffer (螢幕全黑)
dd if=fbfile of=/dev/fb0
將 fbfile 內的資料寫回 framebuffer
程式內對 framebuffer 操作: