學習framebuffer過程中,最大的困惑不是fb層的各個資料結構的互動,而是stm32驅動lcd時的畫點,畫線,畫圈這樣的函式上哪去了。。。直到了解了lcd控制器的原理,總算知道了為什麼沒了。原來給lcd控制器承包了!
在說framebuffer之前,得先提一下lcd控制器。如下圖:
那麼我們要怎麼在應用程式設計中控制lcd呢?
這就是framebuffer的作用了。
framebuffer子系統的層次結構如下:
在應用層中反映為/dev/fbx,儲存著一幀影象,可以操作試試:
# dd if=/dev/zero of=/dev/fbx // 清屏
# cat /dev/fbx > text // 截圖(未編碼)
# cat text > /dev/fbx // 顯示text到螢幕上
從結構圖中可以看到framebuffer重要**在fbmem.c和***fb.c;
struct fb_info *fb_info 描述了乙個framebuffer device相關一系列資訊
struct fb_ops *fb_ops 描述了乙個framebuffer device的操作函式集合,具體到對硬體的操作,比如清屏,畫圓等
static
const
struct file_operations fb_fops 檔案操作函式集合,當應用程式開啟裝置時,使用者可以read,write,ioctl等
struct fb_var_screeninfo var 描述lcd硬體可變引數
struct fb_fix_screeninfo fix 描述lcd硬體不可變引數,如視訊記憶體的首尾位址
主要作用是
註冊占用主裝置號29,
獲得info結構體,以呼叫info->fb_ops的lcd硬體操作函式。
mmap將fb=>vma虛擬位址空間–程序空間。
首先看init函式中:
static
int __init fbmem_init
(void
)
可以看到init中用了字元裝置驅動模型:register_chrdev( 29 , 」fb」 , &fb_fops ),建立並占用主裝置號29。以fb_fops作為操作函式,主要作用是獲取info結構體,它才儲存了具體的lcd驅動函式。
static
const
struct file_operations fb_fops =
;
很典型的乙個字元裝置驅動模型。應用層對裝置檔案開啟讀寫呼叫對應函式。首先看看fb_open函式主要內容:
fb_open
(struct inode *inode,
struct file *file)
fb_mman主要內容:
fb_mmap
(struct file *file,
struct vm_area_struct * vma)
/* 將獲得的info結構體中的framebuffer空間賦給vma虛擬位址空間 */..
.}
同樣首先看到init函式:
static
int __init nxp_fb_init
(void
)
這是乙個典型的platform匯流排-裝置-驅動模型,註冊了乙個platform驅動,驅動結構如下:
static
struct platform_driver fb_plat_driver =,}
;
platform匯流排特點是當有裝置註冊並且與驅動的「dev_name_fb」相同時完成匹配,呼叫nxp_fb_probe函式,所以接下來看到這個函式:
static
intnxp_fb_probe
(struct platform_device *pdev)
這裡申請framebuffer的函式中執行了:
device_create
(fb_class, fb_info->device,
mkdev
(fb_major, i)
,null
,"fb%d"
, i)
;
在類中建立乙個裝置dev(29,i),並且在/dev/下建立了乙個fbx**用層操作。
以上,就是對於framebuffer子系統的解釋;
後面再做一篇lcd驅動開發
FrameBuffer(LCD裝置層程式設計)
大部分驅動程式都是核心自帶的,主要是為了進行驅動移植。驅動模型分為驅動層和裝置層。現在核心已經帶有驅動層帶 還缺少裝置層 我們可以根據核心提供的lcd驅動程式,分析出裝置層 在 平台裝置驅動之平台裝置 中,可以知道裝置層步驟 1.裝置占用的資源 2.裝置的平台資料結構struct platform ...
SpringCloud Stream訊息驅動概述
簡介 如果系統裡同時存在多種mq,可以使用使用cloud stream,只需要和stream互動就可以進行管理。一句話,遮蔽底層訊息中介軟體的差異,降低切換成本,統一訊息的程式設計模型 官網 中文手冊 官方定義springcloud stream是乙個構建訊息驅動微服務的框架 應用程式通過input...
SpringCloud Stream訊息驅動
遮蔽底層訊息中介軟體的差異,降低切換成本,統一訊息的程式設計模型。在沒有binder這個概念的情況下,springboot應用要直接與訊息中介軟體進行資訊互動的時候,由於各訊息中介軟體構建的初衷不同,他們的實現細節上有較大差異,通過定義binder作為中間層,完美實現了應用程式與訊息中介軟體細節之間...