基于linux的全彩LED顯示屏脫機控制系統設計
所有的顯示項目,無(wú)論其內容如何,都可以抽象為一個(gè)隨時(shí)間變化的狀態(tài)機。每個(gè)顯示項目在時(shí)間的推移下在其所屬的區域中完成自身的顯示,也就是完成一個(gè)從初始化到結束的狀態(tài)轉換過(guò)程。因此,playitem是一個(gè)抽象基類(lèi)。每種類(lèi)型的顯示項目只需重新實(shí)現playitem提供的公共調用接口即可。
每個(gè)區域具有一個(gè)播放線(xiàn)程,該線(xiàn)程不斷地從playlist中取出一個(gè)顯示項目,執行其狀態(tài)轉換接口完成顯示過(guò)程。這種設計允許不同類(lèi)型的顯示項目混合排列在同一個(gè)顯示列表下,極大的增加了播放過(guò)程安排的靈活性。
多區域顯示設計模型如圖2示。
圖2 多區域顯示模型
4.2.2基于SM501的2D加速顯示接口設計
顯示層的設計旨在提供一套可移植的、使用方便的2D顯示接口,包括基于區域內部坐標的應用顯示層接口和基于屏幕坐標而與硬件無(wú)關(guān)的底層顯示接口。應用顯示層給顯示項目playitem提供簡(jiǎn)單的基于區域坐標的顯示接口?;谄聊蛔鴺说牡讓语@示直接工作在SM501硬件之上,最大化利用了SM501硬件加速能力,同時(shí)還提供了可移植的接口。在移植到其他的2D硬件上只需要重新實(shí)現底層顯示接口即可。
由于硬件設計上SM501處于slave mode與S3C2440連接,SM501不能訪(fǎng)問(wèn)系統內存,所有要進(jìn)行加速操作的顯示內容必須存放在SM501的獨立顯存上,這樣不方便移植 DirectFB作為底層顯示接口。因此本文按照通用的2D顯示接口,獨立實(shí)現了一套基于屏幕坐標的通用底層2D顯示接口。
在實(shí)現上通過(guò)mmap把SM501的控制寄存器和獨立顯存全部從內核空間映射到用戶(hù)空間,這樣在程序中可以直接訪(fǎng)問(wèn)SM501的寄存器和管理本地顯存,避免了在顯示時(shí)應用程序與內核之間的數據交換,顯示加速作用得以充分發(fā)揮?;趯M501的直接訪(fǎng)問(wèn),底層顯示層實(shí)現了一套基本接口,包括顯存分配與釋放和基本2D加速操作如畫(huà)線(xiàn)(line)、矩形填充(fill_rect),位圖復制(bitblt)、縮放(bitblt_stretch)、色空間轉換(CSC)等。其中對視頻播放性能影響最大的是縮放和色空間轉換。
SM501的繪圖引擎(Draw Engine)包括兩個(gè)部分,2D繪圖引擎和CSC顏色空間轉換模塊。2D繪圖引擎主要用來(lái)繪制直線(xiàn)(基于Bresenham算法),矩形填充,復制(Bitblt),旋轉復制(Rotation bitblt)??s放與顏色空間轉換功能都是通過(guò)CSC模塊來(lái)實(shí)現。CSC模塊可以實(shí)現YUV422,YUV420,RGB565,RGB888幾種色彩空間及格式轉換到RGB565和RGB888,色空間轉換隱含了縮放功能。
顯存分配與釋放管理是對映射到用戶(hù)空間的Frame buffer進(jìn)行的。實(shí)現上使用空閑鏈表的方法,并且采用最先適應的原則。最先適應分配算法有利于保留更大的連續內存塊給那些一次性?xún)却嫘枨罅看蟮姆峙湔埱?。由于視頻解碼后色空間轉換和縮放必須使用硬件加速來(lái)實(shí)現,因此總是預留1M的顯存空間給視頻顯示使用。在顯存不足的情況下,通過(guò)malloc分配系統內存。相應的所有顯示層接口的地址參數均被設計成為自動(dòng)識別地址屬于系統內存還是獨立顯存,如果地址屬于系統內存,則表明當前顯存不足,于是使用軟件的方法實(shí)現繪圖操作。在釋放顯存時(shí),程序若識別參數地址為系統內存,將調用free去完成釋放。
在多個(gè)顯示區域同時(shí)顯示的情況下,顯存的分配與釋放管理以及所有的基于硬件加速的2D操作均被互斥地調用,以避免多線(xiàn)程同時(shí)對SM501資源進(jìn)行爭用帶來(lái)的與時(shí)間相關(guān)的執行錯誤。
由于SM501加速操作只能使用本地幀存的物理地址,而通過(guò)mmap映射得到的是進(jìn)程空間的虛擬地址,顯存分配得到的地址也是基于映射后的地址,因此寫(xiě)入SM501寄存器中作為地址的操作數必須將進(jìn)程空間地址轉化為實(shí)現的幀存物理地址。轉化方法就是用顯
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)led顯示器相關(guān)文章:led顯示器原理
評論