基于ARM9的流媒體播放器的設(shè)計(jì)_第1頁
基于ARM9的流媒體播放器的設(shè)計(jì)_第2頁
基于ARM9的流媒體播放器的設(shè)計(jì)_第3頁
基于ARM9的流媒體播放器的設(shè)計(jì)_第4頁
基于ARM9的流媒體播放器的設(shè)計(jì)_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

61/66基于嵌入式ARM920T的視頻播放器設(shè)計(jì)摘要嵌入式技術(shù)差不多成為了后PC時(shí)代的核心技術(shù),而基于嵌入式技術(shù)的便攜式視頻播放器由于體積小、重量輕、攜帶方便等特點(diǎn),具有極廣的市場前景,因此嵌入式視頻播放器成為了現(xiàn)在IT行業(yè)研究的熱點(diǎn)。本文提出了一種基于ARM9處理器,以嵌入式Linux為底層操作平臺的嵌入式視頻播放器的設(shè)計(jì)方案。本文首先介紹了視頻播放器軟硬件的整體設(shè)計(jì)方案,然后詳細(xì)介紹了如何通過移植Bootload、Linux內(nèi)核和制作根文件系統(tǒng)來完成搭建視頻播放器底層操作平臺的工作,最后通過移植開源的多媒體播放器軟件MPlayer和設(shè)計(jì)相關(guān)控件完成了整個(gè)視頻播放器的設(shè)計(jì)工作。最后,總結(jié)了論文所做的工作,指出了嵌入式播放器所需要進(jìn)一步解決和完善的問題。關(guān)鍵詞:嵌入式,視頻播放器,嵌入式Linux,ARM920TDesignofVideoPlayerBasedonEmbeddedARM920TAbstractEmbeddedtechnologyhasbecomethecoretechnologyofthepost-PCera,andbasedonembeddedtechnologyofportablevideoplayerforsmallvolume,lightweight,convenienttocarryhaveaverywideprospectofmarket,andsoembeddedvideoplayertobecomearesearchfocusoftheITindustry.Thispaperputsforwardakindofembeddedvideoplayerdesignscheme,theschemeisbasedontheARM9processor,andtheEmbeddedLinuxastheunderlyingoperatingplatform.Thispaperfirstintroducedthevideoplayeroveralldesignschemeofsoftwareandhardware,thendetailedindetailhowtotransplantBootloader,Linuxkernelandmakearootfilesystemtocompletetheworktobuildavideoplayerunderlyingoperatingplatform,finally,throughtransplantationofopensourcemultimediaplayersoftwareMPlayeranddesigncontrolstocompletethedesignworkofthevideoplayer.Finally,summarizetheworkofthispaper,pointsouttheembeddedplayerwhichneedtobesolvedandperfectedproblem.Keywords:Embedded,Videoplayer,EmbeddedLinux,ARM目錄第一章引言 11.1研究背景 11.2進(jìn)展?fàn)顩r和研究意義 11.3本文組織結(jié)構(gòu) 2第二章播放器總體設(shè)計(jì)方案介紹 32.1播發(fā)器硬件系統(tǒng)架構(gòu) 32.2播發(fā)器軟件系統(tǒng)架構(gòu) 3第三章系統(tǒng)開發(fā)平臺的構(gòu)建 43.1軟件開發(fā)環(huán)境介紹 43.2Bootloader的移植 53.3Linux內(nèi)核的移植 73.3.1Linux內(nèi)核移植步驟 73.3.2Flash驅(qū)動的移植 83.3.3LCD驅(qū)動的移植 113.3.4UDA1341音頻驅(qū)動的移植 153.4根文件系統(tǒng)的制作 153.4.1根文件系統(tǒng)介紹 163.4.2根文件系統(tǒng)構(gòu)建 16第四章視頻播放器的設(shè)計(jì)與實(shí)現(xiàn) 184.1MPlayer多媒體播放器介紹 184.2MPlayer的移植 194.3播放器按鍵驅(qū)動程序設(shè)計(jì) 204.4播放器操縱程序的設(shè)計(jì) 214.5視頻播放器的測試 23第五章總結(jié) 23參考文獻(xiàn) 24附錄A 26第一章引言1.1研究背景伴隨著半導(dǎo)體技術(shù)、計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)和軟件技術(shù)的飛速進(jìn)展,現(xiàn)現(xiàn)在,我們差不多進(jìn)入了后PC時(shí)代。在這一時(shí)期電子產(chǎn)品的進(jìn)展趨勢是智能化、數(shù)字化、網(wǎng)絡(luò)化、便攜輕巧、易于操作,而嵌入式技術(shù)(EmbeddedTechnology)的進(jìn)展為人們提供了一個(gè)專門好的解決方案。所謂嵌入式是指以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件、硬件可裁剪,適用于應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)[1]。嵌入式技術(shù)差不多被廣泛的應(yīng)用于科學(xué)研究、工程設(shè)計(jì)、軍事領(lǐng)域和文藝商業(yè)的方方面面,嵌入式產(chǎn)品更是隨處可見,比如消費(fèi)電子產(chǎn)品、車載電子設(shè)備、智能家電、MP3、MP4等?,F(xiàn)在人們隨著生活水平的提高,對視聽享受方面的要求也越來越高,人們不單僅僅滿足于在電腦上或電視上觀賞高品質(zhì)的音視頻,也渴望能夠隨時(shí)隨地的觀賞音樂觀看電影,因此基于嵌入式技術(shù)的便攜式多媒體播放器也成為了現(xiàn)今IT界研究的熱點(diǎn)之一。面對寬敞的市場需求,海內(nèi)外的各大廠商也在積極研發(fā)自己的產(chǎn)品以搶占市場?;谶@一背景,本文提出了一款基于嵌入式Linux操作系統(tǒng)和ARM處理器的視頻播放器設(shè)計(jì)方案。1.2進(jìn)展?fàn)顩r和研究意義自從2002年法國的愛可視推出全球第一款MP4——多媒體Jukebox以來,基于嵌入式技術(shù)的便攜式視頻播放器差不多進(jìn)展了十年,通過這十年的進(jìn)展,視頻播放器技術(shù)已日趨成熟,市面上的產(chǎn)品支持的視頻格式也越來越多,功能也越來越強(qiáng)大,專門多MP4都集成了上網(wǎng)、游戲、個(gè)人事務(wù)處理甚至是視頻錄制、數(shù)碼照相等功能。目前。專門多提供視頻播放器處理器的半導(dǎo)體廠商都推出有自己的視頻播放器硬件解決方案,這些方案能夠概括為以下四類:一類是以德州儀器、飛利浦為代表的基于CPU+DSP芯片的解決方案;一類則是以Intel和AMD為代表的基于通用CPU的解決方案;第三種則是以飛思卡爾和深圳安凱為代表的基于MCU芯片的解決方案;第四種是基于雙CPU的解決方案[4]。在軟件方面差不多上市面上的便攜式視頻播放器都帶有嵌入式操作系統(tǒng),要緊的操作系統(tǒng)有Vxworks、PalmOS、WindowsCE、Linux、Android以及廠家自己開發(fā)的操作系統(tǒng)。生產(chǎn)廠商在設(shè)計(jì)自己的產(chǎn)品時(shí)假如采納上述的硬件方案,都要支付一筆不菲的授權(quán)費(fèi)用,而在嵌入式操作系統(tǒng)的選擇上也只有Linux是開源免費(fèi)的,因此產(chǎn)品成本比較高。ARM處理器具有體積小、功耗低、低成本、高性能等優(yōu)點(diǎn),同時(shí)支持Linux系統(tǒng)[6]。因此能夠選用ARM處理器配合Linux進(jìn)行產(chǎn)品的設(shè)計(jì),如此能夠充分的利用Linux開源的特性,依照需要修改和移植一些免費(fèi)的開源軟件,如此不僅能降低產(chǎn)品研發(fā)的難度,加快產(chǎn)品的上市時(shí)刻,還能省去一筆不菲的軟硬件授權(quán)費(fèi)用。1.3本文組織結(jié)構(gòu)本文介紹了一款便攜式視頻播放器的設(shè)計(jì)工作,該視頻播發(fā)器是以ARM處理器為硬件開發(fā)平臺,嵌入式Linux作為操作系統(tǒng),通過移植Linux上的一款優(yōu)秀的開源視頻播放器軟件MPlayer來實(shí)現(xiàn)的。本文共分五章,內(nèi)容安排如下:第一章,引言。介紹了本文的選題背景,當(dāng)前國內(nèi)外的進(jìn)展?fàn)顩r以及研究意義,并對論文的要緊工作進(jìn)行了簡單介紹。第二章,播放器總體設(shè)計(jì)方案介紹。要緊介紹播放器的硬件整體架構(gòu)和軟件系統(tǒng)的層次結(jié)構(gòu)。第三章,系統(tǒng)開發(fā)平臺的構(gòu)建。本章詳細(xì)介紹了Linux系統(tǒng)移植到ARM處理器的過程,Linux的移植要緊包括三個(gè)方面:Booterloader的移植、Linux內(nèi)核的移植和根文件的制作。第四章,視頻播放器的設(shè)計(jì)與實(shí)現(xiàn)。介紹MPlayer的移植過程和播放器相關(guān)控件的設(shè)計(jì)工作。第五章,總結(jié)。 第二章播放器總體設(shè)計(jì)方案介紹2.1播發(fā)器硬件系統(tǒng)架構(gòu)本設(shè)計(jì)將選用國嵌公司生產(chǎn)的GQ2440開發(fā)板作為硬件平臺,GQ2440是一款A(yù)RM9開發(fā)板。GQ2440采納的是三星公司生產(chǎn)的S3C2440A處理芯片,主頻400MHz,最高可達(dá)533MHz。圖2.1為視頻播放器的硬件系統(tǒng)框圖,其中S3C2440處理器除了負(fù)責(zé)對音視頻文件進(jìn)行解碼工作外,還要負(fù)責(zé)對整個(gè)視頻播放器進(jìn)行治理和操縱;LCD為播放器的視頻輸出模塊;UDA1341芯片為音頻的輸出模塊,負(fù)責(zé)將經(jīng)處理器解碼后得到的音頻數(shù)據(jù)轉(zhuǎn)換為模擬信號,并傳遞給麥克風(fēng)等輸出裝置;Flash存儲器負(fù)責(zé)對Linux內(nèi)核、根文件系統(tǒng)、應(yīng)用軟件和視頻文件的存儲工作;按鍵用于完成對視頻播放S3C2440處理器LCD顯示S3C2440處理器LCD顯示音頻(UDA1341)SDRAMFLASH電源按鍵2.2播發(fā)器軟件系統(tǒng)架構(gòu)由于Linux具有源代碼開放、可移植性好、資源豐富、可靠、穩(wěn)定、免費(fèi)等特點(diǎn),因此本文將選用嵌入式Linux作為視頻播放器的底層操作平臺。而視頻播器軟件是通過移植Linux下一款優(yōu)秀的開源視頻播放軟件MPlayer來實(shí)現(xiàn)的。如圖2.2所示為視頻播放器的整個(gè)軟件系統(tǒng)層次圖。其中Linux內(nèi)核中的設(shè)備驅(qū)動負(fù)責(zé)完成LCD顯示器、UDA1314聲卡芯片等設(shè)備的驅(qū)動工作,MPlayer為視頻播放器,處于應(yīng)用層,利用其完成對各種音視頻文件的解碼工作。硬件平臺Linux內(nèi)核 硬件平臺Linux內(nèi)核 設(shè)備驅(qū)動應(yīng)用層MPlayer第三章系統(tǒng)開發(fā)平臺的構(gòu)建3.1軟件開發(fā)環(huán)境介紹在嵌入式系統(tǒng)中,由于硬件資源的有限性、差異性,因此需要開發(fā)者依照不同的硬件資源對嵌入式的操作系統(tǒng)作出相應(yīng)的剪裁,從而定制出能夠運(yùn)行在特定目標(biāo)平臺上的嵌入式操作系統(tǒng)。構(gòu)建一個(gè)嵌入式Linux操作系統(tǒng)要緊包括三個(gè)方面的工作:移植Bootloader,移植Linux內(nèi)核,構(gòu)建Linux根文件系統(tǒng)。 由于嵌入式系統(tǒng)的專門性,其硬件資源十分有限,因此不可能在嵌入式操作系統(tǒng)上安裝開發(fā)工具,也就不可能直接在嵌入式系統(tǒng)上直接進(jìn)行軟件的開發(fā),因此有了交叉開發(fā)模型。交叉開發(fā)模式是指先在主機(jī)上編寫程序,然后通過交叉編譯工具編譯程序,生成目標(biāo)平臺上可運(yùn)行的二進(jìn)制文件,最后下載到具體的目標(biāo)平臺上進(jìn)行運(yùn)行[7]。交叉開發(fā)模型如圖3.1所示。圖3.1交叉開發(fā)模型本文是以紅帽公司發(fā)行的RedHatEnterpriseLinux5作為宿主機(jī)的操作系統(tǒng)進(jìn)行相關(guān)軟件開發(fā)的,使用的交叉編譯工具鏈為友善之臂公司提供的arm-linux-gcc-4.3.2。3.2Bootloader的移植Bootloader是在操作系統(tǒng)運(yùn)行之前執(zhí)行的一小段程序,它在系統(tǒng)上電時(shí)開始執(zhí)行,初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好預(yù)備[6]。能夠把Bootloader當(dāng)成PC機(jī)的BIOS來理解。嵌入式系統(tǒng)的硬件存在專門大的差異性,Bootloader對硬件有專門大的依靠性,同時(shí)Bootloader引導(dǎo)的操作系統(tǒng)也可能不同,因此在嵌入式世界中建立一個(gè)通用的Bootloader是不可能的,只是由于大部分Bootloader任然具有專門多共性,因此某些Bootloader也能支持多種不同架構(gòu)的處理器和操作系統(tǒng)。例如,U-Boot就能夠同時(shí)支持PowerPC、ARM、MIPS和X86等體系結(jié)構(gòu)。U-Boot是遵循GPL條款的開放源碼項(xiàng)目。而今U-Boot作為一個(gè)主流Bootloader,差不多成功地被移植到包括PowerPC、ARM、X86、MIPS、NIOS、XScale等主流體系結(jié)構(gòu)上的百種開發(fā)板,成為功能最多、靈活性最強(qiáng),開發(fā)性最積極的開源Bootloader。本文將選取U-Boot作為開發(fā)板的Bootloader。在開始移植U-Boot之前,應(yīng)該分析手上的U-Boot源代碼差不多支持的開發(fā)板,選擇出硬件配置最接近的開發(fā)板作為參考。選擇的原則為,首先選擇MCU相同的開發(fā)板,假如沒有,則選擇MPU相同的開發(fā)板作為參考,如此能大大的降低移植的難度。本文使用的U-Boot版本為u-boot-2009.06,由于U-Boot目前還不支持S3C2440處理器,因此移植的時(shí)候能夠我們將以SBC2410開發(fā)板為參考,移植的工作確實(shí)是針對S3C2440和s3c2410的不同,以及SBC2410和GQ2440開發(fā)板外設(shè)的不同做相應(yīng)的修改。以下為移植的詳細(xì)步驟:(1)添加新的配置選項(xiàng)。在U-Boot的頂層目錄的Makefile文件中定義了所有開發(fā)板的配置選項(xiàng),首先應(yīng)該為開發(fā)板添加新的配置選項(xiàng),參照SMDK2410的配置,加入如下語句:gq2440_config: unconfig @$(MKCONFIG) $(@:_config=)armarm920tgq2440NULLs3c24x0開發(fā)板配置選項(xiàng)中各項(xiàng)的含義如下:arm:表示CPU的架構(gòu)是ARM體系結(jié)構(gòu)。arm920t:表示CPU的內(nèi)核類型,對應(yīng)cpu、arm920t子目錄。NULL:這位用于表示開發(fā)商者或經(jīng)銷商。S3c24x0:片上系統(tǒng)定義。 (2)在board目錄下創(chuàng)建開發(fā)板目錄,并添加文件。在board目錄下存放著許多U-Boot支持的開發(fā)板的子目錄,進(jìn)行移植時(shí)要為具體的開發(fā)板建立目錄并添加相應(yīng)文件。那個(gè)地點(diǎn)建立gq2440目錄并把用于參考移植的sbc2410x目錄下的內(nèi)容全部拷貝到gq2440目錄下,此外還要把拷貝過來的文件內(nèi)容進(jìn)行修改,進(jìn)入gq2440目錄,把sbc2410x.c文件重命名為gq2440.c。gq2440.c是本文選用的開發(fā)板GQ2440相關(guān)的代碼,它是由sbc2410x.c直接復(fù)制來的因此需要針對GQ2440開發(fā)板的硬件特性做修改。 (3)為開發(fā)板添加新的配置文件。當(dāng)我們修改好gq2440.c文件后,還應(yīng)該進(jìn)入include/configs目錄為我們的開發(fā)板添加配置文件,能夠直接復(fù)制一份SBC2410x開發(fā)板的配置文件sbc2410x.h,再把它重命名為gq2440.h,然后再依照GQ2440開發(fā)板的具體情況進(jìn)行修改。(4)配置和編譯。當(dāng)完成前面的步驟后就能夠進(jìn)行編譯了,執(zhí)行:makegq2440_config命令將會配置好開發(fā)板,接著執(zhí)行:makeCROSS_COMPILE=arm-linux-命令系統(tǒng)將開始編譯U-Boot,編譯成功后會得到U-Boot的映像,即可把其下載到開發(fā)板上。3.3Linux內(nèi)核的移植內(nèi)核移植要緊是指操作系統(tǒng)從一種硬件平臺轉(zhuǎn)移到另一種硬件平臺上運(yùn)行。關(guān)于嵌入式系統(tǒng)來講,有各種體系結(jié)構(gòu)的處理器平臺,使用的外圍硬件也不一樣。嵌入式Linux嚴(yán)峻依靠于具體硬件,因此只要硬件平臺有略微差不,也需要做一些移植的工作。3.3.1Linux內(nèi)核移植步驟在移植內(nèi)核前需要在主機(jī)上安裝好Linux操作系統(tǒng),以完成對內(nèi)核代碼的配置和編譯的工作,本文采納主機(jī)安裝虛擬機(jī)并在虛擬機(jī)安裝Linux的方法。作為主機(jī),虛擬機(jī)安裝的是RetHat公司發(fā)行的RetHatEnterpriseLinux5。本文使用的硬件開發(fā)板是GQ2440,GQ2440是參照友善之臂公司設(shè)計(jì)的Mini2440進(jìn)行擴(kuò)展設(shè)計(jì)的,硬件電路完全相同,自從Linux-2.6-31開始,Linux內(nèi)核差不多官方支持Mini2440,但官方的支持依舊專門有限。事實(shí)上Mini2440是參考三星公司的SMDK2440設(shè)計(jì)而來的,它們的核心電路差不多是一樣的,而且內(nèi)核對SMDK2440的支持特不豐富,因此本文將使用Mini2440的配置并以SMDK2440為參考進(jìn)行移植Linux內(nèi)核的移植。以下將對移植的步驟進(jìn)行詳細(xì)的講解。獵取源代碼。Linux的源代碼是開源的,能夠到Linux的官方網(wǎng)站:/上去下載Linux源代碼,本文使用的源代碼為Linux-2.6-32.2。下載好源代碼后我們能夠把源代碼解壓到指定目錄,例如執(zhí)行以下命令我們能夠把Linux解壓到/home/wusong目錄:tarxvzflinux-2.6-32.2.tar.gz–C/home/wusong。解壓完后,在/home/wusong目錄下將生成一個(gè)Linux-目錄。(2)指定交叉編譯變量。Linux內(nèi)核缺省配置的目標(biāo)平臺是X86的,要使內(nèi)核能在運(yùn)行在ARM平臺上,需要進(jìn)入Linux-目錄,修改總目錄里的Makefile文件。打開Makefile文件找到以下信息:exportKBUILD_BUILDHOST :=$(SUBARCH)ARCH ?=$(SUBARCH)CROSS_COMPILE ?=把它改為:exportKBUILD_BUILDHOST :=$(SUBARCH)ARCH ?=armCROSS_COMPILE ?=arm-linux-其中,ARCH是指定目標(biāo)平臺為ARM,CROSS_COMPILE是指定交叉編譯器,那個(gè)地點(diǎn)指定為系統(tǒng)默認(rèn)的交叉編譯器。(3)替換BSP。Linux關(guān)于特定的硬件平臺的軟件就叫做BSP(BoardSupportPackage)。我們進(jìn)入linux-/arch/arm/mach-s3c2440目錄能夠看到有一個(gè)mach-mini2440.c文件,這確實(shí)是外國的開發(fā)者對Mini2440設(shè)計(jì)的BSP,因?yàn)樗鼘ini2440的支持十分有限,因此能夠不使用它,把它刪掉。而以SMDK2440的BSP為參考,把linux-/arch/arm/mach-s3c2440目錄下得mach-smdk2440.c復(fù)制一份,重命名為mach-mini2440.c,既可使用新的mach-mini2440.c作為GQ2440的BSP。(4)修改BSP。在GQ2440開發(fā)板上使用的晶振是12MHz,而SMDK2440使用的是16.9344MHz,因此我們要修改BSP指定的系統(tǒng)時(shí)鐘源,打開mach-mini2440.c,把staticvoid__initsmdk2440_map_io(void)函數(shù)內(nèi)的16934400改為12000000。再把smdk2440_machine_init(void)函數(shù)中的smdk_machine_init()函數(shù)刪掉。這時(shí)候能夠回到Linux-的源代碼根目錄下分不執(zhí)行如下命令:#makemini2440_defconfig;#makezImage;mini2440_defconfig是官方自帶的對mini2440的配置。執(zhí)行makezImage命令后將開始編譯內(nèi)核,編譯完成后將在在arch/arm/boot目錄下生成內(nèi)核文件在zImage。這時(shí)把zImage下到開發(fā)板里,通過串口終端能夠看到內(nèi)核是能正常啟動的,但由于大部分驅(qū)動都沒添加,也沒有根文件系統(tǒng),因此還無法登陸,開發(fā)板上資源也還不能正常使用。因此接下來還應(yīng)該為具體的硬件移植相應(yīng)的硬件驅(qū)動程序。3.3.2Flash驅(qū)動的移植Flash存儲器在嵌入式系統(tǒng)中是必不可少的,它是Bootloader、Linux內(nèi)核、文件系統(tǒng)和數(shù)據(jù)的最佳載體。在Linux內(nèi)核中,引入了MTD(MemoryTechnologyDevice,內(nèi)存技術(shù)設(shè)備)層為NORFlash和NANDFlash設(shè)備提供統(tǒng)一的接口,從而使得Flash驅(qū)動的設(shè)計(jì)工作大為簡化[9]。在GQ2440開發(fā)板上有256M的NANDFlash存儲芯片。Linux內(nèi)核在MTD的下層實(shí)現(xiàn)了通用的NAND驅(qū)動(要緊通過driver/mtd/nand/nand_base.c文件實(shí)現(xiàn)),因此要實(shí)現(xiàn)NANDFlash的驅(qū)動并不需要太大的工作量。S3C2440的NANDFlash驅(qū)動是以platform驅(qū)動的形式實(shí)現(xiàn)的,在執(zhí)行probe()函數(shù)時(shí),初始化nand_chip實(shí)例并運(yùn)行nand_scan()函數(shù)掃描NANDFlash設(shè)備,最后調(diào)用add_mtd_partitions()函數(shù)添加BSP文件中定義的分區(qū)表。因此只要在mach-mini2440.c中定義和注冊分區(qū)表和相關(guān)硬件信息即可完成NANDFlash的移植工作。 首先應(yīng)在mach-mini2440.c加入的是NANDFlash的分區(qū)表的代碼:staticstructmtd_partitionfriendly_arm_default_nand_part[]={ [0]={ .name ="bootloader", .size =0x00040000, .offset =0, }, [1]={ .name ="param", .offset=0x00040000, .size =0x00020000, }, [2]={ .name ="Kernel", .offset=0x00060000, .size =0x00500000, }, [3]={ .name ="rootfs", .offset=0x00560000, .size =1024*1024*1024,// }, [4]={ .name ="nand", .offset=0x00000000, .size =1024*1024*1024,// }};接下來還應(yīng)把開發(fā)板的NANDFlash設(shè)置表和NANDFlash本身的一些特性注冊進(jìn)內(nèi)核,分不在mach-mini2440.c中加入以下代碼:staticstructs3c2410_nand_setfriendly_arm_nand_sets[]={ [0]={ .name ="NAND", .nr_chips =1, .nr_partitions =ARRAY_SIZE(friendly_arm_default_nand_part), .partitions =friendly_arm_default_nand_part, },};staticstructs3c2410_platform_nandfriendly_arm_nand_info={ .tacls =20, .twrph0 =60, .twrph1 =20, .nr_sets =ARRAY_SIZE(friendly_arm_nand_sets), .sets =friendly_arm_nand_sets, .ignore_unset_ecc=1,};為了使NANDFlash正常工作,還需把NANDFlash設(shè)備注冊到系統(tǒng)中,把NandFlash設(shè)備注冊到系統(tǒng)只要將其放入mach-mini2440.c中定義的mini2440_devices數(shù)組即可。除此外我們還應(yīng)該把NANDFlash的一些特性傳遞給驅(qū)動,首先在driver/mtd/nand目錄下找到NANDFlash的驅(qū)動程序:s3c2410.c,打開文件,在函數(shù)staticints3c2410_nand_setrate(structs3c2410_nand_info*info)中添加如下代碼:structs3c2410_platform_nand*plat=info->platform;再在mach-mini2440.c中的函數(shù)staticvoid__initmini2440_machine_init(void)里面添加如下代碼:S3c_device_nand.dev.platform_data=&mini2440_nand_info;最后重新編譯內(nèi)核即可完成了NANDFlash驅(qū)動的移植。3.3.3LCD驅(qū)動的移植對嵌入式視頻播放器來講。LCD顯示器自然是必不可少的,Linux-內(nèi)核差不多支持S3C2440的LCD操縱器驅(qū)動,只要在mach-mini2440.c中注冊具體的LCD硬件參數(shù)即可完成LCD驅(qū)動的移植工作。GQ2440開發(fā)板使用的是統(tǒng)寶的3.5英寸真彩色TFT液晶屏,分辨率為320x240,帶觸摸屏的。圖3.2為TFT屏的時(shí)序圖:圖3.2TFT屏?xí)r序上圖中的VCLK、HSYNC、VSYNC分不為像素時(shí)鐘信號、行同步信號和幀同步信號,VDEN為數(shù)據(jù)有效標(biāo)志信號,VD為圖像的數(shù)據(jù)信號。圖3.3給出的是S3C2440的LCD操縱器的方框圖,S3C2440的LCD操縱器是用與傳輸視頻數(shù)據(jù)和產(chǎn)生必要的操縱信號,如VFRAME、VLINE、VCL、VM等,此外還有視頻數(shù)據(jù)端口VD[23:0]。圖3.3LCD操縱器方框圖圖3.4給出了LCD操縱器中應(yīng)該設(shè)置的TFT屏的參數(shù),其中的上邊界和下邊界即為幀切換的回掃時(shí)刻,左邊界和右邊界即為行切換的回掃時(shí)刻,水平同步和垂直同步分不是行和幀同步本身需要的時(shí)刻。xres和yres則分不是屏幕的水平和垂直分辨率。圖3.4TFT顯示屏參數(shù)因?yàn)閘inux-差不多支持S3C2440的LCD操縱器驅(qū)動,因此只需在mach-mini2440.c中依照具體的LCD顯示器填充兩個(gè)結(jié)構(gòu)體以完成對LCD顯示器平臺信息的注冊就能夠了。這兩個(gè)結(jié)構(gòu)體是s3c2410fb_mach_info和s3c2410_fb_display。其中s3c2410fb_mach_info用于表示LCD顯示器的平臺信息。s3c2410_fb_display用來表示LCD設(shè)備的機(jī)器信息,例如LCD顯示器的寬度、高度和每個(gè)像素占多少位等信息[6]。因此依照GQ2440開發(fā)板使用的LCD顯示器的特性在mach-mini2440.c中加入如下代碼:#ifdefined(CONFIG_FB_S3C2410_S320240)#defineLCD_WIDTH320#defineLCD_HEIGHT240#defineLCD_PIXCLOCK100000#defineLCD_RIGHT_MARGIN8#defineLCD_LEFT_MARGIN5#defineLCD_HSYNC_LEN6#defineLCD_UPPER_MARGIN8#defineLCD_LOWER_MARGIN3#defineLCD_VSYNC_LEN10#endif#ifdefined(LCD_WIDTH)staticstructs3c2410fb_displayarm2440_lcd_cfg__initdata={#if!defined(LCD_CON5) .lcdcon5 =S3C2410_LCDCON5_FRM565| S3C2410_LCDCON5_INVVLINE| S3C2410_LCDCON5_INVVFRAME| S3C2410_LCDCON5_PWREN| S3C2410_LCDCON5_HWSWP,#else .lcdcon5 =LCD_CON5,#endif .type =S3C2410_LCDCON1_TFT, .width =LCD_WIDTH, .height =LCD_HEIGHT, .pixclock =LCD_PIXCLOCK, .xres =LCD_WIDTH, .yres =LCD_HEIGHT, .bpp =16, .left_margin =LCD_LEFT_MARGIN+1, .right_margin =LCD_RIGHT_MARGIN+1, .hsync_len =LCD_HSYNC_LEN+1, .upper_margin =LCD_UPPER_MARGIN+1, .lower_margin =LCD_LOWER_MARGIN+1, .vsync_len =LCD_VSYNC_LEN+1,};staticstructs3c2410fb_mach_infoarm2440_fb_info__initdata={ .displays =&arm2440_lcd_cfg, .num_displays =1, .default_display=0, .gpccon=0xaa955699, .gpccon_mask=0xffc003cc, .gpcup=0x0000ffff, .gpcup_mask=0xffffffff, .gpdcon=0xaa95aaa1, .gpdcon_mask=0xffc0fff0, .gpdup=0x0000faff, .gpdup_mask=0xffffffff, .lpcsel =0xf82,};#endif然后還要在driver/video/Kconfig中加入如下配置信息:configFB_S3C2410_T240320 Boolean“3.5inch240X320ToppolyLCD” dependsonFB_S3C2410 Help 3.5inch240X320ToppolyLCD接著能夠使用makemenuconfig命令進(jìn)入內(nèi)核配置,選擇相應(yīng)的選項(xiàng)并退出保存,然后重新編譯內(nèi)核即完成了LCD驅(qū)動的移植工作。3.3.4UDA1341音頻驅(qū)動的移植GQ2440開發(fā)板上使用的是UDA1341音頻芯片,Linux-差不多完美的支持UDA1341的驅(qū)動,因此只要在mach-mini2440.c文件中注冊UDA1341平臺設(shè)備的操縱端口就能夠了,在mach-mini2440.c中添加如下代碼:staticstructs3c24xx_uda134x_platform_datas3c24xx_uda134x_data={ .l3_clk=S3C2410_GPB(4), .l3_data=S3C2410_GPB(3), .l3_mode=S3C2410_GPB(2), .model=UDA134X_UDA1341,};staticstructplatform_devices3c24xx_uda134x={ .name="s3c24xx_uda134x", .dev={ .platform_data=&s3c24xx_uda134x_data, }};此外還要把UDA1341設(shè)備添加到mini2440_devices數(shù)組中以UDA1341設(shè)備注冊到內(nèi)核中。接著我們只要使用makemenuconfig命令,選擇相應(yīng)的選項(xiàng)并保存退出,再使用makezImage命令重新編譯內(nèi)核即可。3.4根文件系統(tǒng)的制作對嵌入式系統(tǒng)來講,除了一個(gè)嵌入式操作系統(tǒng)以外,還需要一個(gè)嵌入式文件系統(tǒng)用來治理和存儲數(shù)據(jù)、程序。在Linux文件系統(tǒng)結(jié)構(gòu)中,內(nèi)核層的文件系統(tǒng)實(shí)現(xiàn)是必須的,Linux啟動時(shí),第一個(gè)必須掛載的確實(shí)是根文件系統(tǒng)[8]。若系統(tǒng)正常掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動,因此要為嵌入式系統(tǒng)構(gòu)建一個(gè)根文件系統(tǒng)。3.4.1根文件系統(tǒng)介紹根文件系統(tǒng)是Linux操作系統(tǒng)運(yùn)行需要的一個(gè)文件系統(tǒng)。在嵌入式領(lǐng)域,使用哪種文件系統(tǒng)需要依照存儲芯片的類型來決定,在嵌入式Linux應(yīng)用中,要緊的存儲設(shè)備為RAM(DRAM,SDRAM)和ROM(Flash存儲器),常用的基于Flash存儲設(shè)備的文件系統(tǒng)類型包括jffs2、Yaffs、Cramfs、Romfs、Ramdisk等,而作為根文件系統(tǒng)一般會選用Yaffs和Cramfs。Yaffs是第一個(gè)為NANDFlash存儲器設(shè)計(jì)的嵌入式文件系統(tǒng),適用于大容量的存儲設(shè)備,同時(shí)在GPL協(xié)議下公布,可免費(fèi)獲得其代碼[9]。Yaffs文件系統(tǒng)有4個(gè)要緊優(yōu)點(diǎn):速度快、占用內(nèi)存少、不支持壓縮和只支持Yaffs存儲器。Cramfs是Linux的創(chuàng)始人LinusTorvalds參與開發(fā)的一種只讀的壓縮文件系統(tǒng),也是基于MTD驅(qū)動程序的。在Cramfs文件系統(tǒng)中,每一頁(4k)被單獨(dú)壓縮,可隨機(jī)頁訪問,其壓縮比高達(dá)2:1,為嵌入式系統(tǒng)節(jié)約大量的Flash存儲空間[10]。由于以上特性,Cramfs在前如斯系統(tǒng)中應(yīng)用廣泛,但由因此只讀的屬性,也使得用戶無法進(jìn)行擴(kuò)充?;谝陨媳容^本文將選用yaffs作為根文件系統(tǒng)。根文件系統(tǒng)以樹形結(jié)構(gòu)來組織目錄和文件的結(jié)構(gòu),系統(tǒng)上電后,根文件系統(tǒng)被掛接到根目錄“/”上。根文件系統(tǒng)應(yīng)該包含的目錄和文件遵循FHS標(biāo)準(zhǔn)(FilesystemHierarchyStandard,文件系統(tǒng)層次標(biāo)準(zhǔn)),那個(gè)標(biāo)準(zhǔn)包含了根文件系統(tǒng)中最少應(yīng)該包含哪些目錄和文件,以及這些目錄的組織原則[13]。按照FHS標(biāo)準(zhǔn),根文件系統(tǒng)頂層目錄至少要包含如下的目錄:bin、sbin、boot、root、home、etc、dev、opt、mnt、lib、proc、tmp、usr、var。3.4.2根文件系統(tǒng)構(gòu)建根文件系統(tǒng)除了應(yīng)該以FHS標(biāo)準(zhǔn)的格式組織外,還應(yīng)該包含一些必要的命令。這些命令提供給用戶使用,以使用戶能方便地操作系統(tǒng)。一般來講構(gòu)建根文件系統(tǒng)的方法有兩種。一種是下載相應(yīng)的命令的源代碼,并移植到處理器架構(gòu)平臺上。第二種方法是使用一些開源的工具構(gòu)建根文件系統(tǒng),例如使用BusyBox、TinyLogin和Embutils。BusyBox是最常使用的一個(gè)工具,Busybox能夠把常見的linux命令打包編譯成一個(gè)單一的可執(zhí)行文件[7]。本文就將使用BusyBox來構(gòu)建一個(gè)根文件系統(tǒng),下面將詳細(xì)講解如何使用BusyBox構(gòu)建一個(gè)根文件系統(tǒng)。(1)配置編譯Busybox。Busybox的源代碼能夠從上下載。本文選用的版本是Busybox-1.3.2版。先把下載到的代碼使用如下命令解壓:tarjxvfBusybox-1.3.2.tar.bz2然后進(jìn)入解壓后的Busybox-1.3.2目錄執(zhí)行makemenuconfig命令對Busybox進(jìn)行配置,Busybox的配置菜單如圖3.5所示:圖3.5Busybox的配置菜單當(dāng)選好配置選項(xiàng)后,保存并退出。然后打開Makefile文件找到如下內(nèi)容:ARCH ?=$(SUBARCH)CROSS_COMPILE?=這兩行是表示需要移植的處理器架構(gòu)和編譯使用的交叉編譯器,修改為:ARCH ?=armCROSS_COMPILE?=arm-linux-然后分不執(zhí)行如下命令:#make#makeinstall執(zhí)行makeinstall后,能夠看到在Busybox-1.3.2目錄下多了個(gè)_install目錄,入_install目錄能夠看到有如下目錄:bin、linuxrc、sbin、usr。Bin目錄和sbin目錄中包含了系統(tǒng)命令,usr中包含的是用戶命令。(2)創(chuàng)建其他目錄和文件。先建立一個(gè)系統(tǒng)的根目錄比如rootfs,然后把上一步生成的_install目錄里的內(nèi)容拷貝到rootfs目錄。依照FHS的標(biāo)準(zhǔn)還要在rootfs目錄里面添加如下幾個(gè)目錄:boot、root、home、etc、dev、opt、mnt、lib、proc、tmp、var。此外還要向etc目錄中添加一些必要的配置文件,其中:etc/initttab、etc/init.d/tcS和etc/fstab這三個(gè)文件是必須的。此外還應(yīng)該在dev目錄下創(chuàng)建一些必要的設(shè)備文件。(3)制作根文件系統(tǒng)映像文件。最后還需要使用yaffs文件系統(tǒng)制作工具把rootfs目錄生成根文件系統(tǒng)映像文件,才能下載到開發(fā)上。制作yaffs文件系統(tǒng)的工具是mkyaffs2image,我們能夠從網(wǎng)上下載和安裝好,然后使用如下命令:#makeyaffs2imagerootfsrootfs.img即可生成rootfs.img根文件系統(tǒng)映像,把rootfs.img下載到開發(fā)板Flash存儲器的指定位置即可工作。第四章視頻播放器的設(shè)計(jì)與實(shí)現(xiàn)4.1MPlayer多媒體播放器介紹本設(shè)計(jì)是以嵌入式Linux作為程序的開發(fā)平臺的,因此能夠充分利用開源代碼的特性,對與應(yīng)用程序的設(shè)計(jì)能夠通過移植目前已有的成熟穩(wěn)定的開源軟件來實(shí)現(xiàn),如此不僅極大的降了低產(chǎn)品的設(shè)計(jì)難度,提高研發(fā)速度,還能大大的降低產(chǎn)品開發(fā)的成本。MPlayer是Linux下的一款優(yōu)秀的開源播放器軟件,MPlayer不僅支持X86平臺,也支持ARM平臺,因此本文選擇了移植MPlayer播放器進(jìn)行移植。MPlayer是一款開源的多媒體播放器,以GNU通用公共許可證公布,MPlayer具有占用資源低、支持格式廣泛和輸出設(shè)備支持多的特點(diǎn)。MPlayer幾乎能播放所有流行的音視頻格式文件,例如MPEG、AVI、WMV、MOV、FLV、RMVB、VOB、OGG等[14][15][16]。MPlayer具有廣泛的輸出設(shè)備支持,它能夠在X11、Xv、DGA、OpenGl、SVGAlib、fbdev、AAlib、DirectFB下工作,而且也能使用GGI和SDL以及一些低級的硬件相關(guān)的驅(qū)動模式。4.2MPlayer的移植 要使MPlayer能運(yùn)行在ARM平臺上,需要在宿主機(jī)上對MPlayer源代碼進(jìn)行針對性的配置和編譯,在進(jìn)行移植工作之前首先應(yīng)該獲得MPlayer的源代碼,能夠到MPlayer的官方網(wǎng)站:http://www.mplayerhq.hu/下載需要的版本代碼,本文選用的版本為MPlayer-1.0rc2。下面將詳細(xì)的介紹MPlayer的移植過程。 (1)配置MPlayer。 因?yàn)橐筂Player在ARM平臺上工作,因此需要依照硬件進(jìn)行配置。先把下載的MPlayer源代碼解壓,進(jìn)入解壓后得到的Mplayer-1.0rc2目錄,假如對MPlayer的配置選項(xiàng)不熟悉,能夠如下執(zhí)行命令:#./configure–help系統(tǒng)將列出MPlayer的所有配置選項(xiàng),并附有簡要的介紹,了解MPlayer的配置選項(xiàng)后就能夠依照自己的需求對MPlayer進(jìn)行配置了,本文的配置為:./configure--prefix=/home/player--host-cc=gcc--cc=arm-linux-gcc--target=arm--enable-static--disable-win32dll--disable-ivtv--disable-dvdread--disable-dvdread-internal--disable-dvdnav--disable-libdvdcss-internal--enable-fbdev--disable-mencoder--disable-live--disable-mp3lib--enable-mad--with-extraincdir=/opt/toolchains/arm920t-eabi/lib/include--with-extralibdir=/opt/toolchains/arm920t-eabi/lib/lib--enable-libavcodec_a--disable-live2>&1|teelogfile (2)配置好MPlayer就能夠?qū)Player進(jìn)行編譯了,這時(shí)候只要執(zhí)行make命令就能夠了。 (3)編譯好后,執(zhí)行makeinstall命令將會在指定的目錄下生成MPlayer的可執(zhí)行文件mplayer,只要把mplayer下載到開發(fā)板上就能使用它來播放多媒體文件了。當(dāng)把mplayer下載到開發(fā)板后能夠先利用串口終端對mplayer進(jìn)行測試,看看是否能正常播放視頻文件,在mplayer所在的目錄執(zhí)行如下命令即可播放相應(yīng)的視頻文件了:#./mplayerfilename4.3播放器按鍵驅(qū)動程序設(shè)計(jì)移植好MPlayer后,還應(yīng)該為其編寫一個(gè)操縱程序,如此才能方便地操作和使用視頻播放器。本文將利用GQ2440上的按鍵來操縱播放器的工作,例如操縱視頻播放器開始播放或者是停止播放等。要使按鍵能正常工作,首先還需要為按鍵編寫一個(gè)驅(qū)動程序。GQ2440開發(fā)板有6個(gè)按鍵,它們均從CPU中斷引腳直接引出,屬于低電平觸發(fā),下表為各按鍵和中斷源的對應(yīng)關(guān)系。表4.1按鍵和中斷源的對應(yīng)關(guān)系按鍵KEY1KEY2KEY3KEY4KEY5KEY6中斷EINT8EINT11EINT13EINT14EINT15EINT19對應(yīng)GPIOGPG0GPG3GPG5GPG6GPG7GPG11在按鍵驅(qū)動程序中將通過中斷來實(shí)現(xiàn)按鍵的檢測,按鍵檢測的流程如圖4.1所示。在驅(qū)動程序中會注冊每個(gè)按鍵所對應(yīng)的中斷,每當(dāng)有按鍵按下的時(shí)候就會進(jìn)入到中斷處理函數(shù),在中斷處理函數(shù)里將記錄具體是哪個(gè)按鍵被按下。應(yīng)用程序能夠通過對按鍵驅(qū)動的設(shè)備文件進(jìn)行讀取來獲知按鍵的狀態(tài),并依照相應(yīng)的按鍵狀態(tài)進(jìn)視頻播放器進(jìn)行操縱。申請中斷申請中斷等待中斷中斷到來?初始化記錄按鍵狀態(tài)NY圖4.1按鍵檢測流程圖4.4播放器操縱程序的設(shè)計(jì)視頻播放器將通過按鍵來實(shí)現(xiàn)開始播放、暫停播放、接著播放、播放下一個(gè)文件和播放上一個(gè)文件的功能。圖4.2為程序設(shè)計(jì)的流程圖:第一次按下?1第一次按下?1鍵按下?開始讀取音視頻文件1鍵按下開始或暫停開始播放監(jiān)聽按鍵2鍵按下播放下一文件3鍵按下播放上一文件4鍵按下停止播放NYNY圖4.2播放器操縱程序流程圖如流程圖所示本視頻播放器將使用4個(gè)按鍵進(jìn)行操縱,其中1鍵用于操縱視頻播放器的開始和暫停,及第一次按下1鍵時(shí),視頻播放器將播放當(dāng)前目錄的第一個(gè)多媒體文件,假如視頻播放器正在工作時(shí)1鍵被按下,播放器將暫停當(dāng)前文件的播放,重新按下1鍵時(shí)可恢復(fù)播放。按下2號鍵時(shí)播放器會自動的播放下一個(gè)文件,按下4號鍵則將播放上一文件。4鍵為停止鍵,當(dāng)被按下時(shí)播放器將停止工作,需要重新按1鍵才能開始工作。詳細(xì)的程序設(shè)計(jì)請參考參考附件A。4.5視頻播放器的測試在前面差不多分不移植好了Bootload、Linux內(nèi)核,構(gòu)建了根文件系統(tǒng),同時(shí)移植了MPlayer,為視頻播放器編寫了按鍵驅(qū)動和操縱應(yīng)用程序,我們先把他們分不下到開發(fā)板NandFlash存儲器的指定位置,如此就完成了視頻播放器的總體的設(shè)計(jì)工作了,接下來將對播放器的整體功能進(jìn)行測試。要緊測試的是播放器的應(yīng)用程序能否按要求工作,關(guān)于常見的視頻格式是否能支持,為此預(yù)備了以下幾種多媒體格式的文件進(jìn)行測試:MP4、MP3、AVI、WMV、MOV、。通過測試按鍵操縱程序是能正常工作的,同時(shí)關(guān)于以上幾種視頻格式也能正常的播放,總體上達(dá)到了視頻播放器的設(shè)計(jì)要求。下圖為視頻播放器播放視頻的畫面。 圖4.3播放效果第五章總結(jié)本文要緊介紹的是基于ARM處理器硬件平臺,結(jié)合嵌入式Linux的開源特性,通過移植MPlayer多媒體播放器軟件設(shè)計(jì)出一款性能穩(wěn)定的便攜式視頻播放器。其中詳細(xì)的介紹了如何把Linux移植到ARM平臺上,這當(dāng)中包括Bootload的移植,Linux內(nèi)核的移植和根文件系統(tǒng)的制作等內(nèi)容,也詳細(xì)的介紹了如何的移植MPlayer播放器,同時(shí)為視頻播放器編寫了按鍵操縱程序,本文差不多完成了一個(gè)嵌入式視頻播放器的設(shè)計(jì)工作。盡管本文差不多完成了設(shè)計(jì)要求,但由于個(gè)人能力不足,本設(shè)計(jì)作品依舊有專門多的不足,最要緊的一點(diǎn)是沒有為視頻播放器設(shè)計(jì)一個(gè)友好的圖形用戶界面。要完成這一步工作本人還需要進(jìn)一步的學(xué)習(xí)。參考文獻(xiàn)[1]弓雷.ARM嵌入式linux系統(tǒng)開發(fā)詳解[M].北京.清華大學(xué)出版社,2010.1:10.[2]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京.人民郵電出版社,2008.8:[3]李偉強(qiáng).嵌入式多媒體播放器的設(shè)計(jì)與實(shí)現(xiàn)[D].吉林大學(xué),2009.[4]鄭強(qiáng).Linux驅(qū)動開發(fā)入門與實(shí)戰(zhàn)[M].北京.清華大學(xué)出版社,2011.1:65.[5]張綺文,王廷廣.ARM嵌入式應(yīng)用開發(fā)完全自學(xué)手冊[M].北京:電子工業(yè)出版社,2009.[6]張協(xié)國.嵌入式Linux在ARM9上的移植研究與實(shí)現(xiàn)[D].哈爾濱工程大學(xué),2007. [7]王新.朱鵬飛.萬時(shí)華.家庭智能多媒體終端的設(shè)計(jì)與應(yīng)用[J].廣播與電視術(shù),2011,(09)38-40.[8]白玉霞.基于嵌入式Linux的多媒體信息終端技術(shù)的研究與應(yīng)用[D].西安電子科技大學(xué),2006.[9]王衛(wèi)東.嵌入式系統(tǒng)中多媒體播放器的設(shè)計(jì)與實(shí)現(xiàn)[D].東南大學(xué),2006.[10]顏回中.基于ARM的AVS-M視頻播放器的設(shè)計(jì)與實(shí)現(xiàn)[D].暨南大學(xué),2011.附錄A#include<stdio.h>#include<unistd.h>#include<dirent.h>#include<sys/types.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/ioctl.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/select.h>#include<sys/time.h>#include<signal.h>#include<sys/wait.h>#include<sys/shm.h>#include<sys/ipc.h>#defineMAX40#defineWORD40#defineFORMAT_NUM10 //支持的視頻格式總數(shù)intfirst_press=1;intplay_flags=0;intid_test; //子進(jìn)程IDchar*format[FORMAT_NUM]={ ".mp4", ".flv", ".avi", ".mov", ".rmvb", ".wmv", ".3gp", ".wma", ".wav", ".mp3" };typedefstructlist_node{chars_name[WORD];structlist_node*next;structlist_node*prev;}node,*pnode;structshare{ longid_tmp; charname_tmp[WORD];};/*創(chuàng)建雙向循環(huán)鏈表,將媒體文件添加入鏈表中*/pnodecreate_list(charpara[][40],intn){ inti; pnodehead=NULL; pnodenew=NULL; pnodetmp=NULL;head=(pnode)malloc(sizeof(node));if(head==NULL){perror("malloc");exit(EXIT_FAILURE);} head->next=NULL;head->prev=NULL; strcpy(head->s_name,para[0]); tmp=head; for(i=1;i<n;i++){ new=(pnode)malloc(sizeof(node)); if(new==NULL){ perror("malloc"); exit(EXIT_FAILURE); } strcpy(new->s_name,para[i]); tmp->next=new; new->prev=tmp; new->next=NULL; tmp=new; } head->prev=tmp; tmp->next=head;returnhead;}/*遍歷鏈表,返回當(dāng)前播放文件所對應(yīng)的節(jié)點(diǎn)*/pnodesearch_list(pnodehead,charpara[]){ pnodetmp=NULL; tmp=head->next; if(strcmp(head->s_name,para)==0){ returnhead; } else{ while(tmp!=head) { if(strcmp(tmp->s_name,para)==0){ returntmp; } else{ tmp=tmp->next; } } } returnNULL;}/*打印雙向鏈表每個(gè)節(jié)點(diǎn)的值*/voidprint_list(pnodehead){ pnodetmp=head->next; printf("\nThesongofCurrentdirectory:\n\n"); printf("head:%s\n",head->s_name); while(tmp!=head){ printf("node:%s\n",tmp->s_name); tmp=tmp->next; }}/*播放函數(shù)*/voidplay(intmem_id,pnodepara){ pnodenode_tmp; void*shmadd=(void*)0; structshare*share_para; node_tmp=para->prev; while(1) { node_tmp=node_tmp->next; if(fork()==0){ /*映射共享內(nèi)存*/ if((shmadd=shmat(mem_id,(void*)0,0))==NULL){ if(shmctl(mem_id,IPC_RMID,NULL)==-1) perror("Failedtoremovememorysegment"); exit(EXIT_FAILURE); } /*將ID和文件名信息存入共享內(nèi)存*/ share_para=(structshare*)shmadd; strcpy(share_para->name_tmp,node_tmp->s_name); share_para->id_tmp=getpid(); if(execlp("/media/mplayer","mplayer",node_tmp->s_name,NULL)<0) perror("execlp"); } else wait(NULL); }}//開始播放voidstart_play(intmem_id,pnodehead){ printf("\nk1downstart\n"); play_flags=1;id_test=fork(); //創(chuàng)建子進(jìn)程用于播放文件 //該子進(jìn)程操縱循環(huán)播放,當(dāng)文件播放完成后,創(chuàng)建一個(gè)新的孫子進(jìn)程來播放if(id_test==0){ play(mem_id,head);}elseif(id_test>0){ }}//暫停播放voidpause_play(pid_tpid_tmp){ play_flags=0; printf("\nkey1down,pause\n"); kill(pid_tmp,SIGSTOP);}//接著播放voidcontinue_play(pid_tpid_tmp){ play_flags=1; printf("\nk1down,continue\n"); kill(pid_tmp,SIGCONT);}//播放下一文件voidnext_play(structshare*share_tmp,intmem_id,pnodehead){pnodenode_tmp;play_flags=1;printf("\nk4downnext\n");/*kill原來的子進(jìn)程和孫子進(jìn)程*/kill(share_tmp->id_tmp,SIGKILL);kill(id_test,SIGKILL); //strcpy(next_name,share_tmp->name_tmp);/*獵取原孫子進(jìn)程文件名在鏈表中的位置*/node_tmp=search_list(head,share_tmp->name_tmp);if(node_tmp==NULL){printf("onlyonefile\n"); } else{/*節(jié)點(diǎn)后移一位*/ node_tmp=node_tmp->next;} id_test=fork(); if(id_test==0){ play(mem_id,node_tmp); } elseif(id_test>0){ }}//播放上一文件voidpre_play(structshare*share_tmp,intmem_id,pnodehead){ pnodenode_tmp; play_flags=1; printf("\nkey3downprev\n"); kill(share_tmp->id_tmp,SIGKILL); kill(id_test,SIGKILL); node_tmp=search_list(head,share_tmp->name_tmp); if(node_tmp==NULL){ printf("onlyonesong\n"); } else{ /*節(jié)點(diǎn)前移一位*/ node_tmp=node_tmp->prev; } id_test=fork(); if(id_test==0){ play(mem_id,node_tmp); } elseif(id_test>0){ }}//退出播放程序voidstop_play(structshare*share_tmp){ first_p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論