www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件

隨著高性能嵌入式處理器的普及和硬件成本的不斷降低,尤其是ARM 系列處理器的推出,嵌入式系統(tǒng)的功能越來越強。單色LCD也因為色彩單調(diào),存儲信息小,處理速度慢而不能符合人們的需求。

  在多媒體應用的推動下,彩色LCD越來越多地應用到了嵌入式系統(tǒng)中 如新一代手機和掌上電腦多采用TFT顯示器件,該顯示器件支持彩色圖形界面和視頻媒體播放。Linux作為開放源代碼的操作系統(tǒng)也在市場中占據(jù)了一席之地。由于Linux成本低廉,源代碼開放,因此成為國內(nèi)外廠商極力發(fā)展的操作系統(tǒng)。在應用需求的推動下,Linux下也出現(xiàn)了許多圖形界面軟件包,如MiniGUI、Trolletech公司的Embedded QT等,其圖形界面及開發(fā)工具與Windows CE不相上下。在圖形軟件包的開發(fā)和移植工作中都牽涉到底層LCD的驅(qū)動問題。筆者有幸參與了Linux操作系統(tǒng)下LCD部分的開發(fā),其主要功能是點亮液晶屏,將在攝像頭上采集的BMP圖片在液晶屏上顯示并將BMP 格式壓縮成JPEG格式,使得存儲量減少。因此筆者就在開發(fā)過程中遇到的問題一一闡述。

  背景知識

  在切入正題之前,先來了解在做驅(qū)動過程中需要預先知道的知識。

  1 硬件平臺

  MC9328MX1(以下簡稱MX1)是Motorola 公司基于ARM核心的第一款MCU,主要面向高端嵌入式應用。內(nèi)部采用ARM920T內(nèi)核,并集成了SDRAM/Flash、LCD,USB、藍牙.多媒體閃存卡(MMC/SD、Memory Stick)和CMOS攝像頭等控制器。

  LCD控制器的功能是產(chǎn)生顯示驅(qū)動信號,驅(qū)動LCD顯示器。用戶只需要通過讀寫一系列的寄存器,完成配制和顯示控制。MX1中的LCD控制器可支持單色/彩色LCD 顯示器。支持彩色TFT時,可提供4/8/12/16位顏色模式,其中16位顏色模式下可以顯示64k種顏色。配置LCD控制器重要的一步是指定顯示緩沖區(qū),顯示的內(nèi)容就是從緩沖區(qū)中讀出的,其大小由屏幕分辨率和顯示顏色數(shù)決定。在本例中,采用KYocera 公司的KCS057QV1AJ液晶屏,在240×320分辨率下可提供8位彩色顯示,即最大256色位圖。

  2.Linux下的設備驅(qū)動

  在Linux操作系統(tǒng)下有兩類主要的設備文件類型,一種是字符設備,另一種是塊設備。字符設備和塊設備的主要區(qū)別是在對字符設備發(fā)出讀/寫請求時,實際的硬件I/O一般就緊接著發(fā)生了,塊設備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當用戶進程對設備請求讀/寫時,它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)能滿足用戶的要求,就返回請求的數(shù)據(jù),如果不能,就調(diào)用請求函數(shù)來進行實際的I/O操作。

  Linux的設備管理是和文件系統(tǒng)解密結(jié)合的,各種設備都以文件的形式存放在/dev目錄下,稱為設備文件。應用程序可以打開、關閉和讀寫這些設備文件,完成對設備的操作,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設備,系統(tǒng)為設備編了號,每個設備號又分為主設備號和次設備號。主設備號用來區(qū)分不同種類的設備,而次設備號標識使用同一個設備驅(qū)動程序的不同的硬件設備,比如有兩個軟盤,就可以用從設備號來區(qū)分它們。設備文件的主設備號必須與設備驅(qū)動程序在登記時申請的主設備號一致,否則用戶進程將無法訪問到驅(qū)動程序。幀緩沖設備為標準字符設備,主設備號為29,次設備號則從0到31。

  3.Linux的幀緩沖設備

  幀緩沖區(qū)是出現(xiàn)在Linux 2.2.xx及以后版本內(nèi)核當中的一種驅(qū)動程序接口,這種接口將顯示設備抽象為幀緩沖區(qū)設備區(qū)。它允許上層應用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。這種操作是抽象的、統(tǒng)一的,用戶不必關心物理顯存的位置、換頁機制等具體細節(jié)。這些都由Framebufer設備驅(qū)動來完成。幀緩沖設備對應的設備文件為/dev/fb*,如果系統(tǒng)有多個顯示卡,Linux下還可支持多個幀緩沖設備,最多可達32個,分別為/dev/fb0到/dev/fb31,而/dev/fb則為當前缺省的幀緩沖設備,通常指向/dev/fb0。當然在嵌入式系統(tǒng)中支持一個顯示設備就夠了。在使用Framebufer時,Linux是將顯卡置于圖形模式下的.在應用程序中,一般通過將Frame-Buffer設備映射到進程地址空間的方式使用,對于幀緩沖來說,可以把它看成是一段內(nèi)存,用于讀寫內(nèi)存的函數(shù)均可對這段地址進行讀寫,只不過這段內(nèi)存被專門用于放置要在LCD上顯示的內(nèi)容,其目的就是通過配置LCDC寄存器在一段指定內(nèi)存與LCD 之間建立一個自動傳輸?shù)耐ǖ?。這樣,任何程序只要修改這段內(nèi)存中的數(shù)據(jù),就可以改變LCD 上的顯示內(nèi)容。

  FrameBuffer設備驅(qū)動基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c這兩個文件,下面就詳細分析這兩個文件。

  首先分析linux/include/linux/fb.h文件,幾乎主要的結(jié)構(gòu)都是在這個文件中定義的。這些結(jié)構(gòu)包括:

◆ fb_var_screeninfo 這個結(jié)構(gòu)描述了顯示卡的特性,記錄了幀緩沖設備和指定顯示模式的可修改信息。其中變量xres定義了屏幕一行所占的像素數(shù),yres定義了屏幕一列所占的像素數(shù),bits_per_pixel定義了每個像素用多少個位來表示。
◆ fb_fix_screeninfon 這個結(jié)構(gòu)在顯卡被設定模式后創(chuàng)建,它描述顯示卡的屬性,并且系統(tǒng)運行時不能被修改;比如FrameBuffer內(nèi)存的起始地址。
◆ struct fb_info Linux為幀緩沖設備定義的驅(qū)動層接口。它不僅包含了底層函數(shù),而且還有記錄設備狀態(tài)的數(shù)據(jù)。每個幀緩沖設備都與一個fb_info結(jié)構(gòu)相對應。其中成員變量modename為設備名稱,fontname為顯示字體,fbops為指向底層操作的函數(shù)的指針。
◆ fb_cmap描述設備無關的顏色映射信息。可以通過FBIOGETCMAP 和FBIOPUTCMAP 對應的ioctl操作設定或獲取顏色映射信息。然后分析fbmem.h文件。

  幀緩沖設備屬于字符設備,采用“文件層-驅(qū)動層”的接口方式。在文件層為之定義了以下數(shù)據(jù)結(jié)構(gòu):
Static struct file_operations
fb_fops={
ower:THIS_MODULE,
read:fb_read,/*讀操作*/
write:fb_write,/*寫操作*/
ioctl:fb_ioctl,/*I/O操作*/
mmap:fb_mmap,/*映射操作*/
open:fb_open,/*打開操作*/
release:fb_release,/*關閉操作*/}

  其成員函數(shù)都在linux/driver/video/fbmem.c中定義,其中的函數(shù)對具體的硬件進行操作,對寄存器進行設置,對顯示緩沖進行映射。

  對于/dev/fb,對顯示設備的操作主要有以下幾種:

  ◆ 讀/寫(read/write)/dev/fb 相當于讀/寫屏幕緩沖區(qū)。

  ◆ 映射(map)操作 由于Linux工作在保護模式和每個應用程序里都有自己的虛擬地址空間,在應用程序中是不能直接訪問物理緩沖區(qū)地址的。因此,Linux在文件操作file_operations結(jié)構(gòu)中提供了mmap函數(shù),可將文件的內(nèi)容映射到用戶空間。對于幀緩沖設備,則可通過映射操作,可將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區(qū),在屏幕上繪圖。

  ◆ I/O控制 對于幀緩沖設備,對設備文件的ioctl操作可讀取/設置顯示設備及屏幕的參數(shù),如分辨率、顯示顏色數(shù)和屏幕大小等。ioctl的操作是由底層的驅(qū)動程序來完成的。

  在應用程序中,操作/dev/fb的一般步驟為首先打開/dev/fb設備文件,然后用ioctl操作取得當前顯示屏幕的參數(shù),如屏幕分辨率,每個像素點的比特數(shù),根據(jù)屏幕參數(shù)可計算屏幕緩沖區(qū)的大小。接下來,將屏幕緩沖區(qū)映射到用戶空間。最后,映射后就可以直接讀寫屏幕緩沖區(qū),進行繪圖和圖片顯示了。典型程序段如下:
#include
int main(){
int fb=0;
struct fb_var_screeninfo vinfo;
struct fb_flx_screeninfo finfo;
long int screensize=0;
fb=open("/dev/fbO",O_RDWR);
/*打開設備文件*/
inctl(fb,FBIOGET_FSCREENINFO,&finfo);
/*取得屏幕相關參數(shù)*/
inctl(fb,FBIOT_VSCREENINFO,&vinfo);
ioctl(current_vt,KDSETMODE,KD_GRAPHICS);//console就進入了圖形模式,不顯示文本光標也不回顯
/*計算屏幕緩沖區(qū)大小*/
screensize=vinfo.xres*vinfo.
yres*vinfo.bits_per_pixel/8;
/*映射屏幕緩沖區(qū)到用戶地址空間*/
fop=(char*)mmap(0,screensize,
PROT_READ|PROT_WRITE,
MAP_SHARED,fb,0);
/*下面可通過fop指針讀寫緩沖區(qū)*/
……)

  由于準備在LCD 上顯示一幅256色BMP圖片,關于BMP 圖片方面的知識請見相關鏈接。

  4.幀緩沖驅(qū)動的縮寫

  了解了上述知識后,在編寫驅(qū)動的時候就簡單多了。源程序共將程序分為初始化幀緩沖模塊fb_init(),調(diào)色板獲取色彩模塊get_cmap(),圖片顯示模塊display_bmp(),main函數(shù)4個函數(shù)。其中調(diào)色板獲取色彩模塊的功能是從文件中獲得圖像顯示色彩,重置系統(tǒng)調(diào)色板,使圖像能正確的顯示色彩。
static void ge_cmap(struct
fb_cmap *cmap,int fb){
memset(cmap,0,sizeof
(struct fb_cmap));//為cmap分配內(nèi)存
cmap->start=0;
cmap->len=256;
cmap->red=calloc(256,sizeof(_u16));
cmap->green=calloc(256,sizeof(_u16));
cmap->blue=calloc(256,sizeof(_u16));
ioctl(fb,FBIOGETCMAP,cmap);}

  圖片顯示函數(shù)部分重要代碼為:

  lseek(fp_bmp,pos+1024,SEEK_SET);//將當前文件指針定位在BMP圖形數(shù)據(jù)區(qū)開始讀取數(shù)據(jù)信息
read(fp_bmp,tp,76800);//320*240
for(size=0;size<76800;size++)
*(lcd_base+size)=*(tp+76800-size);//數(shù)據(jù)是從下往上放置
free(tp);

  在主函數(shù)中,建立一個進程調(diào)用圖片顯示函數(shù)
pid_t pid;
pid=fork();
if(fork>1){if(fb_init()) break;
memset(lcd_bas,0x3f,320*240);
display_bmp("/tmp/cat01.bmp",fb);}
……}

  至此LCD的驅(qū)動程序就編寫完成了,經(jīng)過調(diào)試,編譯鏈接,然后用串口下載到實驗板上,一幅256色BMP圖片就可以出現(xiàn)在液晶屏幕上了。

  5.應用價值

  液晶屏點亮了,這只是第一步,我們可以在此基礎上進一步進行應用程序的開發(fā),比如筆者將此應用在一個視頻監(jiān)控系統(tǒng)中。在這個視頻監(jiān)控系統(tǒng)中,圖像處理占很大的比重,基本的圖像處理構(gòu)成如下:

  ◆ 圖像采集模塊圖像采集模塊需要兩種裝置,一種是將光信號轉(zhuǎn)換成電信號的物理器件,如攝像機;另一種是能夠?qū)⒛M電信號轉(zhuǎn)換成數(shù)字信號的器件,如圖像采集卡。
  ◆ 圖像處理模塊對圖像的處理一般可用算法的形式描述,但是對于特殊的問題需要特殊的解決方法,圖像處理模塊中不但包含了對圖像的一般處理方法,也包括一些特殊的算法處理。
  ◆ 圖像顯示模塊對于采集得到的圖像,經(jīng)過處理以后,最終需要顯示給用戶看。在系統(tǒng)的實時采集部分中,需要對展開的圖像進行滾屏顯示:在圖像編輯部分中,需要瀏覽所要拼接的圖像。所以圖像顯示對于系統(tǒng)來說非常重要。
  ◆ 圖像儲存模塊由于圖像中包含有大量的信息,并且由于系統(tǒng)所采用8位真彩色格式,因此需要大量的空間。因此,在本系統(tǒng)中需要大容量和快速的圖像存儲器。
  ◆ 圖像通信模塊隨著網(wǎng)絡的建設和發(fā)展,圖像通信傳輸也得到極大的重視。另外,圖像傳輸可以使不同的系統(tǒng)共享圖像數(shù)據(jù)資源,快速地將結(jié)果反映到遠處系統(tǒng),所以極大推動了圖像在各個方面的應用。

  在這五步中,首先在點亮液晶屏之后,才能做下一步工作。比如說筆者能夠在LCD顯示一幅圖畫,但由于這幅圖是BMP格式的,它的存儲量非常驚人,一幅320×240的BMP格式就有320×240×8/8=76800,也就是77KB,這對于系統(tǒng)資源相對短缺的嵌入式設備來說占用系統(tǒng)RAM 太大了,因此我們就要將BMP格式的圖片壓縮成占用系統(tǒng)資源少的圖片格式,比如JPEG 格式或PNG格式,可以有效地減少存儲量。

  由于篇幅所限,不可能把完整的源代碼均做一番解釋,但主要的過程就是這些,在此拋磚引玉。隨著液晶屏在嵌入式設備中的用途越來越廣,會有很大的空間值得我們?nèi)パ芯俊?BR>
  欲知詳情,請登錄維庫電子市場網(wǎng)()

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉