Linux Framebuffer驅動剖析之一—軟體需求

2022-01-26 嵌入式企鵝圈

嵌入式企鵝圈將以本文作為2015年的終結篇,以回應第一篇《Linux字符設備驅動剖析》。嵌入式企鵝圈一直專注於嵌入式Linux和物聯網IOT兩方面的原創技術分享,稍後會發布嵌入式企鵝圈的2015年的年終總結和2016年的分享計劃。

本系列文章將分析Linux Framebuffer驅動的作用(需求)、框架、接口實現和使用。按筆者一直倡導的Linux學習理念—從軟體需求的角度去理解Linux,對於Linux各個子系統,我們首先要理解其軟體需求,從中自然會清楚其存在的價值和作用;接下來是理解子系統在Linux整個驅動框架中的層次、角色和如何交互;最後是理解驅動的接口如何實現軟體需求,明確接口如何在各種場景中使用。

一、Linux設備驅動和裸設備驅動的關係

理解framebuffer的軟體需求之前,我們先理解Linux設備驅動和裸設備驅動的關係:

例如,對於LCD液晶屏,其可以由三星研發的SOC S5PV210(Cortex A8 arm核)的多媒體硬體模塊所支持。而對於具體某種LCD液晶屏,涉及到解析度、時延參數等不同,需要通過軟體來設置相應的SOC多媒體硬體寄存器,以達到控制顯示的目的。這個軟體設置就是SOC編程,其不管是SOC上運行的是Linux,還是Windows,或者是IOS,軟體設置的最終結果體現到寄存器上都是一樣的。一般地,嵌入式都是C語言開發,而高級處理器的寄存器是統一編址的,因此裸設備驅動外圍設備的C語言代碼基本是一樣的。

在帶作業系統運行時,為了安全考慮,系統一般分為用戶態和內核態。那麼,SOC編程是硬體編程,只能在內核態完成,並且需要向用戶態程序提供一個接口以進行調用。對於不同的作業系統而言,從用戶態的接口開始到進行最終的SOC編程接口調用的過程中,會經過不同的軟體層次。對於Linux作業系統,設備驅動的接口調用過程就是Linux設備驅動框架所決定的。詳見《Linux字符設備驅動剖析》、《Linux 設備文件的創建和mdev》、《總線、設備和驅動》和《字符設備驅動、設備驅動模型、sysfs、平臺設備驅動的關係》。

從上面分析可以看出,任何Linux設備驅動都有兩個層次,一個是偏底層硬體的SOC寄存器編程,一個是偏上層應用的Linux子系統軟體接口,前者負責和硬體的交互,後者負責跟上層應用交互。Linux為了給用戶提供統一的編程接口,在所有的設備驅動之上再架設一層公共接口層,如所有驅動都可以通過open、read、write來進行操作,其是Linux設備驅動框架的組成部分。因此,一般地,Linux設備驅動都有三個層次。

當然,各個子系統內部還會通過分層來解耦內部的需求和實現。

二、Linux Framebuffer的軟體需求

Linux Framebuffer的需求就是驅動LCD屏顯示。所以其自然也有兩個層次,偏底層硬體的SOC寄存器編程和偏上層應用的寫屏接口。本文的重點是為了分析Linux framebuffer驅動的偏上層應用的接口實現,而不是闡述如何進行SOC編程,因為SOC編程是針對某個具體的SOC寄存器來進行的。

1. LCD屏的驅動需求

SOC和LCD屏的連接示意圖如下:

1) SOC編程是為了支持多種不同的LCD屏,以使該SOC的應用場景最大化。因此SOC的多媒體Display模塊需要考慮不同的屏幕解析度、位圖深度、行切換和幀切換的時延等等。這些參數的設置最終使得LCD控制器(硬體引擎)產生匹配的時鐘和數據輸出到LCD引腳上。這些設置的編程方式和其他字符設備(如滑鼠、串口等)都是差不多的。所以,LCD的驅動需求是通過寄存器設置支持各種不同的LCD屏。

2)唯一有一點不同的就是,LCD屏驅動器內部有個大的fifo(跟解析度有關,可能是幾百K字節,甚至M字節級)。Fifo中存放LCD屏的顯示數據,LCD驅動器內部顯示電路會自動將FIFO的數據刷新到LCD屏上。由於FIFIO很大,通過CPU寫總線的方式來將內存數據寫到fifo的方式是不可行的,這樣會加重CPU負擔。現代高級SOC處理器都使用DMA的方式,由DMA直接將內存數據搬到FIFO。DMA可以理解為一個專職搬運工,與CPU、GPU一樣是獨立工作的,只需要告訴它源地址、目的地址和長度就可以了。源地址就是物理內存地址,目的地址就是FIFO映射地址。DMA工作不經過MMU,所以它只認物理內存地址。

那麼,LCD的另一個驅動需求是CPU將用戶數據寫到DMA所認的物理內存地址上。CPU寫好用戶數據到物理內存地址上,顯示專用DMA就自動搬運到顯示FIFO上。

2. LCD屏驅動的實現思路

從上面分析可以看出,LCD屏的設備驅動可以是一個字符設備驅動。第一個需求通過寄存器設置支持各種不同的LCD屏是很容易實現的。而第二個需求通過write接口也是很容易實現的。

寫接口就是將用戶圖像數據(0-3G進程虛擬空間buffer, 對應實際的物理內存地址1)拷貝到內核虛擬地址空間(對應實際的物理內存地址2)。

一般地,我們在用戶進程中是申請一塊物理連續的內存塊(返回地址是0-3G的進程虛擬地址空間),並將多個圖像資源數據(如文字,圖像等)放到這個內存中。我們把這次資源數據拷貝到內存塊稱為一次拷貝。然後通過寫接口拷貝到實際的顯示物理內存,稱為二次拷貝。

虛擬地址空間和物理地址空間的映射是通過MMU(內存管理單元)來進行映射和管理的。MMU機制請看《SoC嵌入式軟體架構設計之二:內存管理單元的軟、硬體協同設計》。簡單的理解就是程序運行的空間是4G虛擬地址空間,而實際的物理內存可能是1G內存,代碼和數據是真正存儲在實際的物理內存上的。如何通過虛擬地址找到對應的實際物理內存地址就是MMU的作用。

3. Framebuffer的軟體需求

從上面分析,圖像數據顯示要經歷兩次拷貝。那麼,有沒有方法做到一次拷貝就可以顯示了呢?很好,Framebuffer就是利用MMU機制來實現一次拷貝即可顯示。

它的顯示示意圖是:

可見,當用戶圖像數據buffer和內核虛擬地址空間buffer對應的都是同一塊物理內存。當資源數據拷貝到用戶圖像數據buffer時,即是直接拷貝到顯示物理內存了。

所以,framebuffer驅動最重要的功能就是給用戶提供一個進程空間映射到實際的顯示物理內存的接口(mmap)。它跟進程間通信的共享變量的原理是一致的。

另外,考慮到一臺設備可能要支持多個輸出,例如HDMI接口、VGA,或者類似視頻監控需求,一個屏幕上有好多個監控窗口。如何更好地管理多個顯示緩存。Framebuffer在內部進行了抽象,即其向上層應用統一抽象為一個字符主設備,而不同的窗口顯示緩存即視為不同的字符從設備。Framebuffer支持多達32個從設備。

接下來會從代碼級詳細分析Linux Framebuffer驅動的框架組成、mmap和其他接口實現、接口使用場景。透徹理解以上framebuffer驅動的軟體需求,再來跟蹤分析Linux Framebuffer驅動是不難的。

敬請關注後續的分析文章!

相關焦點

  • Linux Framebuffer驅動剖析之二—驅動框架、接口實現和使用
    本文繼上一篇文章《Linux Framebuffer驅動剖析之一—軟體需求》,深入分析Linux Framebuffer子系統的驅動框架
  • Linux驅動分析之Framebuffer驅動
    前面我們了解了LCD的基本架構《Linux驅動分析之
  • 「正點原子Linux連載」第五十九章Linux LCD驅動實驗
    第五十九章Linux LCD驅動實驗LCD是很常用的一個外設,在裸機篇中我們講解了如何編寫LCD裸機驅動,在Linux下LCD的使用更加廣泛,在搭配QT這樣的GUI庫下可以製作出非常精美的UI界面。本章我們就來學習一下如何在Linux下驅動LCD屏幕。
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    B、關於可移植性可移植性指與軟體從某一環境轉移到另一環境下的難易程度。為獲得較高的可移植性,在設計過程中常採用通用的程序設計語言和運行支撐環境。儘量不用與系統的底層相關性強的語言。可移植性是軟體質量之一,良好的可移植性可以提高軟體的生命周期。代碼的可移植性主題是軟體;可移植性是軟體產品的一種能力屬性,其行為表現為一種程度,而表現出來的程度與環境密切相關。
  • Linux替代Windows系統軟體大比拼
    最近一直在堅持使用linux,說堅持是因為還是向我說的那樣有很多的不便。  當然使用了ubuntu版後,對於我的本本來說很是不錯,驅動沒有需要我做什麼,就全部安裝到位。我想這是因為linux對於inter蕊片支持有關。估計採用其它蕊片的電腦就難說這樣順利。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    本文引用地址:http://www.eepw.com.cn/article/257106.htm1.實驗目的該實驗是編寫最簡單的字符驅動程序,這裡的設備也就是一段內存,實現簡單的讀寫功能,並列出常用格式的Makefile以及驅動的加載和卸載腳本。
  • Linux驅動程序學習步驟經典收藏
    了解linux驅動程序技巧學習的方法很重要,學習linux作業系統時,你可能會遇到關於驅動方面的問題,這裡將介紹學習linux
  • 玩轉Linux設備驅動你需要弄懂這些問題
    它能運行主要的UNIX工具軟體、應用程式和網絡協議。它支持32位和64位硬體。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡作業系統。想要深入理解linux設備驅動,你必須明確以下幾個問題:• 應用程式、庫、內核、驅動程序的關係• 設備類型• 設備文件、主設備號與從設備號• 驅動程序與應用程式的區別• 用戶態與內核態• Linux驅動程序功能1) 應用程式調用一系列函數庫,通過對文件的操作完成一系列功能。
  • 德國軟體公司出品,Linux 下微軟 Office 的免費替代品之一
    點擊上方藍字 ● 關注Linux公社 Microsoft Office 的最佳免費替代品之一是 FreeOffice,它由德國軟體公司
  • Linux嵌入式驅動開發——ioctl接口
    第三個分區 16-29 表示傳遞的數據大小第四個分區 30-31 代表讀寫的方向00:表示用戶程序和驅動數據沒有數據傳遞10:表示用戶程序從驅動裡面讀取數據01:表示用戶程序向驅動裡面寫入數據11:先寫數據到驅動,然後再從驅動把數據讀出來(不常用)命令的合成宏與分解宏合成宏
  • 跟我一起寫驅動--linux的framebuffer驅動簡介
    用戶不必關心物理顯示緩衝區的具體位置及存放方式,這些都是由幀緩衝設備驅動本身來完成。對於幀緩衝設備而言,只要在顯示緩衝區與顯示點對應的區域寫入顏色值,對應的顏色會自動在屏幕上顯示,下一小節重點講解各種模式下緩衝區與顯示點的對應關係。     幀緩衝設備為標準字符設備,主設備號為29,對應於/dev/fbn設備文件。應用程式可以通過打開讀寫此設備文件,將視頻及圖像數據輸出到顯示設備上。
  • Linux內核學習:簡單的字符設備驅動
    學習Linux內核最好的入門方式之一是從字符設備驅動開始模仿(來自於《奔跑吧 Linux內核——入門篇》)。對於我們日常生活中存在的大量設備,如攝像頭,USB充電器,藍牙,Wi-Fi等,這些設備在電氣特性和實現原理均不相同,對Linux系統來說如何抽象和描述他們呢?Linux很早就根據設備共同特徵將其劃分為三大類型:1,字符設備;塊設備;網絡設備。
  • linux字符設備驅動基本框架
    對於Linux的驅動程序,需要遵循一定的框架結構。嵌入式Linux的學習其實並不難,只要深入理解Linux的框架,寫起來也可以得心應手。1.linux函數調用過程1.1 系統函數調用的意義在Linux的中,有一個思想比較重要:一切皆文件。也就是說,在應用程式中,可以通過open,write,read等函數來操作底層的驅動。
  • 基於Linux平臺下的FPGA的ARM驅動開發方法
    為此,本文以S3C2410上使用Altera公司的EP2S30F67214為例,系統地介紹了在Linux系統環境下的FPGA的驅動方法。1基本原理Linux下的設備驅動程序通常是一個存在於應用程式和實際設備間的軟體層。
  • Linux驅動實踐:你知道【字符設備驅動程序】的兩種寫法嗎?
    如何使用新的API函數來編寫字符設備驅動程序,下一篇文章再詳細討論。以下所有操作的工作目錄,都是與上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。創建驅動目錄和驅動程序$ cd linux-4.15/drivers/$ mkdir my_driver1$ cd my_driver1$ touch driver1.cdriver1.c 文件的內容如下(不需要手敲,文末有代碼下載連結):
  • | Linux 驅動
    DRM Driver 的驅動開發人員有必要了解 KMS api,這樣才能理解 DRM Driver 的設計目的,從而編寫出正確的驅動程序;理解原理,可以協助我們定位圖形應用不穩定或者性能相關的問題,尤其是嵌入式 Linux 領域,顯示相關的功能複雜且容易出現異常;如果你想要為開源軟體 Wayland 或者 Kodi 做貢獻的話,則需要了解
  • 全面掌握Linux驅動框架——字符設備驅動、I2C驅動、總線設備驅動、NAND FLASH驅動
    眾所周知,字符設備是Linux驅動基礎也是重點,還沒學到字符設備那章的同學當做預習,已經學完了的可以很好複習,試想一下,關掉書和視頻,你能參考內核自帶的驅動寫出LED字符設備驅動來嗎?以下是Linux字符設備驅動框架圖:
  • 將平板、手機作為電腦第二屏幕(Linux系統下)
    Intel 集顯進行圖形顯示、NVIDIA 獨顯進行數據計算的教程,因為我沒有這方面的需求就沒有折騰。如果開啟了獨顯要麼該功能無法用,要麼驅動錯誤無法加載驅動進不去圖形界面,需要進入恢復模式刪除配置文件。所以務必關閉獨顯!!重啟後可以打開終端輸入命令xrandr查看有沒有開啟成功。
  • Linux DNS 查詢剖析(第三部分) | Linux 中國
    在 Linux DNS 查詢剖析(第一部分)[1]中,我們介紹了:而在 Linux DNS 查詢剖析(第二部分)[2],我們介紹了:◈ systemd 和對應的 networking 服務剖析進展如下:(大致)準確的關係圖很可惜,故事還沒有結束,還有不少東西也會影響 DNS 查詢。
  • 最小的Linux系統製作過程詳解
    系統的內核原代碼和編譯工具,利用busybox內建的強大功能,在一張軟盤上做的一個很小的linux系統.他具備一個linux系統的基本特徵,支持linux系統最常用的一百多個命令,支持多種文件系統,支持網絡等等,你可以把他當做一張linux起動盤和修復盤來用,你也可以把他當做一個靜態路由的路由器軟體,當然,你也可以把他當做一個linux玩具,向你的朋友炫耀 linux可以做的多麼小.我把他叫做BabyLinux