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