基于ARM LinuxQT的掌上多媒體系統(tǒng)的設(shè)計和實現(xiàn)
首先定制裁剪并移植了Linux2.6的內(nèi)核,然后為使各硬件能正常工作編寫了鍵盤驅(qū)動、LCD驅(qū)動、觸摸屏驅(qū)動、音頻驅(qū)動、USB驅(qū)動等驅(qū)動。多功能掌上多媒體系統(tǒng)的正常工作首先是進(jìn)入ARM-Linux操作系統(tǒng),然后加載各個硬件的驅(qū)動程序并初始化各外圍設(shè)備,接著就進(jìn)入基于QT/Embedded庫的Qtopia桌面系統(tǒng)編寫的GUI圖形界面程序的播放器,最后選擇要進(jìn)行的操作。
對于Linux內(nèi)核的移植首先要移植bootloader,系統(tǒng)采用的是VIVI,其功能包括:分區(qū)管理、參數(shù)管理、啟動Linux操作系統(tǒng)、文件系統(tǒng)管理、支持網(wǎng)絡(luò)、通過串口下載程序到Flash或者RAM等。建立嵌入式開發(fā)環(huán)境,使得能夠交叉編譯源代碼,對VIVI的源代碼進(jìn)行交叉編譯,生成能在ARM Linux上運行的bin文件,通過開發(fā)板的JTAG口將其燒寫到開發(fā)板的Flash中。
對內(nèi)核的移植首先要對內(nèi)核進(jìn)行修改MAKEFILE文件指定編譯器以及目標(biāo)平臺,然后配置內(nèi)核,交叉編譯生成內(nèi)核鏡像,通過UART口(串口)下載到開發(fā)板上。移植相應(yīng)的文件系統(tǒng)。文件系統(tǒng)中的文件是數(shù)據(jù)的集合,不僅包含著文件中的數(shù)據(jù),而且還有文件系統(tǒng)的結(jié)構(gòu),所有Linux用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。在設(shè)計過程中把文件系統(tǒng)設(shè)置為可讀寫,這樣操作性強一些,在投入到生產(chǎn)中的時候應(yīng)該把文件系統(tǒng)設(shè)置為只讀的,這樣整個掌上多功能媒體播放器的操作系統(tǒng)就加載好了。
2.2 驅(qū)動程序的設(shè)計
本系統(tǒng)共涉及到鍵盤驅(qū)動、觸摸屏驅(qū)動、LCD驅(qū)動、音頻驅(qū)動和USB驅(qū)動等驅(qū)動。因為多媒體功能是本系統(tǒng)的重點,所以播放器部分很重要,這里主要介紹音頻驅(qū)動的編寫。
目前Linux下常用的音頻驅(qū)動程序主要有兩種類型:OSS(Open Sound System) 和ALSA。最早出現(xiàn)的Linux上的編程接口是OSS,它由一套完整的內(nèi)核驅(qū)動程序模塊組成,可為大多數(shù)音頻芯片驅(qū)動提供統(tǒng)一的編程接口。在嵌入式系統(tǒng)中,對于特定的處理器(如本系統(tǒng)采用的S3C2410),可以按照OSS接口標(biāo)準(zhǔn)來編寫音頻驅(qū)動程序,以滿足Linux上的應(yīng)用程序。OSS接口已經(jīng)足夠簡單,需要完成的主要的工作就是對音頻設(shè)備(本系統(tǒng)采用的是Philips的UDA1314TS)的read,write和ioctl等操作。
系統(tǒng)音頻驅(qū)動主要是對UDA1314TS進(jìn)行驅(qū)動編寫,包括對UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申請兩個DMA(Direct Memory Access)通道用于音頻傳輸(音頻數(shù)據(jù)的發(fā)送和接收都通過一個先入先出的隊列FIFO,但是只靠FIFO要保證音頻的連續(xù)播放是很困難的,所以申請DMA通道來解決此問題)。OSS標(biāo)準(zhǔn)中由兩個最基本的音頻設(shè)備:混音器(Mixer)和數(shù)字信號處理器(DSP)又稱編解碼器,其中混音器主要用來控制輸入輸出音量的大小,只有open和release以及幾個接管OSS標(biāo)準(zhǔn)的iotcl。而DSF設(shè)備驅(qū)動的方法比較復(fù)雜,主要包括open、release、read、write、poll、ioctl。其中主要在write和read方法中實現(xiàn)音頻的播放和錄音。以播放音頻來說明DSP驅(qū)動程序的編寫,對應(yīng)了驅(qū)動程序中的open和write方法,它們利用DMA實現(xiàn)了音頻的播放。在open中,首先判斷設(shè)備打開的方法:讀取、寫入和讀/寫,分別對應(yīng)音頻的錄音、播放以及錄音同時回放,然后申請兩個與音頻DMA緩沖區(qū)相關(guān)的,在初始化DMA時要用到,最后程序可以根據(jù)設(shè)備打開模式的初始化S3C2410的工作模式,并清空所需的DMA緩沖區(qū)(在write方法被調(diào)用時創(chuàng)建)的數(shù)據(jù)結(jié)構(gòu),把它留給緩沖區(qū)創(chuàng)建。在這里,因為使用了兩個DMA音頻數(shù)據(jù)傳輸,DMA緩沖的建立發(fā)生在第一次調(diào)用wri te將音頻數(shù)據(jù)傳送到設(shè)備,而OSS驅(qū)動的調(diào)用者通常要在打開音頻設(shè)備時就期望獲得DMA緩沖的信息,然而因為緩沖尚未建立,會使得緩沖大小為0這個結(jié)果,解決辦法時在兩個與音頻DMA緩沖區(qū)相關(guān)的程序部分一定不能少了以下代碼:
if(!output_stream.bufferaudio_setup_buf(&out stream))
return-ENOMEM;
在Write方法中首先判斷設(shè)備文件打開的方式,具有write特性打開的設(shè)備才可以寫入,然后判斷是否沒有建立DMA緩沖區(qū),若沒有,則通過audio_setup_buf()來創(chuàng)建,定義一個結(jié)構(gòu)體(audio_stream_t)的指針如下:
2.3 Gu l程序的設(shè)計與播放器的實現(xiàn)
2.3.1 GUI程序的設(shè)計和實現(xiàn)
播放器的圖形界面在Qtopia視窗環(huán)境下運行,采用Qt/Embedded2.3.7作為底層圖形庫,用于生成用戶界面。QT是一個跨平臺的c++圖形用戶界面庫,Qt/Embedded是面向嵌入式系統(tǒng)的版本,其最大的特點就是使信號和槽用于對象間的通信,Qt的窗口部件有多個預(yù)定義的信號,槽是一個可以被調(diào)用處理特定信號的函數(shù)。Qt的窗口部件有多個預(yù)定義的槽,當(dāng)一個特定事件發(fā)生的時候,一個信號被發(fā)射,對應(yīng)感興趣的槽就會調(diào)用對應(yīng)的相應(yīng)函數(shù)。播放器界面主要包括主界面窗口、文件操作窗口、播放列表窗口。主界面窗口有一個顯示屏和一些控制按鈕,包括播放、暫停、快進(jìn)、快退、下一首、上一首、音量調(diào)整以及播放進(jìn)度條和播放時間顯示。文件操作窗口可以使用戶選擇要播放的文件。播放列表用來播放最近播放的五個多媒體文件。
2.3.2 播放器的實現(xiàn)
Linux下的播放器Mplayer是Linux上最優(yōu)秀的多媒體播放器,它能夠使用眾多的編解碼器,支持多種輸出設(shè)備??梢圆シ攀忻嫔蠋缀跛械囊粢曨l格式。本系統(tǒng)選擇其作為播放器,對其進(jìn)行優(yōu)化和移植。進(jìn)行的優(yōu)化主要有:
(1)Mplayer在系統(tǒng)上運行的時候顏色會有偏差,因此編程校正Mplayer的色彩;
(2)Mplayer正常模式不能在FramBuffer的中間顯示,帶-fs的全屏參數(shù)播放后,只能將播放位置移到中間,并不放大,修改播放顯示位置,讓它和Nplayer圖形界面的調(diào)用相符合;
(3)編程實現(xiàn)播放時對鍵盤事件正?;?;
(4)Mplayer采用的自帶的mp3lib浮點音頻解碼庫的解碼效率很低,在播放音頻時會很卡,通過采用使用定點運算的libmad音頻解碼庫替代原來的mp3lib庫進(jìn)行音頻解碼;
(5)使用Mplayer的-input選項,通過FIFO從GUI向后端程序傳遞控制信息。通過優(yōu)化后,對Mplayer交叉編譯,移植到系統(tǒng)上可以流暢地播放mp3等音頻文件以及mpeg-1、mpeg-2、avi等視頻格式。
2.4 影音錄制
影音錄制的系統(tǒng)框架見圖2。通過擴展用于視頻錄制的Philips的視頻解碼芯片SAA7113和ADI的JPEG壓縮芯片來實現(xiàn)。首先輸入的模擬視頻信號經(jīng)過SAA7113轉(zhuǎn)換為數(shù)字信號,然后傳輸給ADI的JPEG壓縮芯片JPEG2000,壓縮為JPEG圖像信號,并通過擴展的總線接口傳輸?shù)较到y(tǒng)上。音頻信號則直接通過音頻輸入接口送到音頻解碼芯片,并轉(zhuǎn)化為數(shù)字信號進(jìn)行編碼。編寫應(yīng)用程序使傳到的音視頻數(shù)字信號一起轉(zhuǎn)化為Motion JPEG編碼的AVI格式的多媒體文件,并存入擴展的存儲設(shè)備(微硬盤或者M(jìn)MC/SD卡),這樣就可以被Mplayer播放。
評論