Framebuffer LCD驅動介紹

2021-10-07 06:24:26 字數 2547 閱讀 5170

學習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作為中間層,完美實現了應用程式與訊息中介軟體細節之間...