<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM的MPEG-4數(shù)字錄像機的設(shè)計實現(xiàn)

          基于ARM的MPEG-4數(shù)字錄像機的設(shè)計實現(xiàn)

          作者: 時間:2008-04-17 來源:網(wǎng)絡(luò) 收藏
          【摘要】文章介紹了嵌入式9微處理器EP9315硬件平臺和Linux軟件平臺的視頻,討論了總體原理和架構(gòu),核心硬件模塊的和Linux設(shè)備驅(qū)動程序和應(yīng)用程序的。
          【關(guān)鍵詞】EP9315IME6400Linux設(shè)備驅(qū)動

          Abstract In this paper, designing and implementing a digital video recorder which is based on the processor 9 hardware series EP9315 and Linux software is achieved; the paper’s content include the general function and structure of the system, the designing of core hardware module and the designing of corresponding devices Linux drivers and application.

          Keyword ARM EP9315 IME6400 Linux Module Driver

          隨著科技的飛速發(fā)展,消費類電子,通信,電視電影廣播與計算機技術(shù)緊密結(jié)合起來。而化信息,尤其是化視頻信息,具有數(shù)據(jù)量大,存儲傳輸困難的特點,是制約人類獲得信息的主要瓶頸。這種形勢對視頻記錄設(shè)備的研制提出了新的要求:大批量的應(yīng)用要求降低監(jiān)控記錄設(shè)備成本,多樣的應(yīng)用環(huán)境、分散、孤立的監(jiān)控點要求監(jiān)控記錄設(shè)備盡可能一體化、小型化、獨立、便攜、低功耗、供電方便、性能可靠。針對這些新問題和新要求,作者設(shè)計了一種嵌入式系統(tǒng)和MPEG-4編碼標(biāo)準(zhǔn)的數(shù)字,系統(tǒng)集成度高、體積小、功耗低、獨立、便攜,適合大量的各類視頻監(jiān)控和記錄應(yīng)用。

          1 系統(tǒng)框架及原理說明

          本系統(tǒng)選用的主要模塊是低功耗ARM9系列微處理器EP9315和專業(yè)視頻壓縮編碼處理芯片IME6400,周圍外部設(shè)備有SAA7118 A/D數(shù)模轉(zhuǎn)換芯片,RAM芯片,ROM芯片,網(wǎng)絡(luò)模塊和電源模塊。系統(tǒng)電路原理圖如圖1所示。整個電路采用5V電源供電,系統(tǒng)啟動后,外部輸入的視頻和音頻信號分別經(jīng)過視頻數(shù)模轉(zhuǎn)換模塊和音頻模塊進行解碼,隨后通過IIC總線送入IME6400視頻處理芯片生成MPEG-4視頻音頻復(fù)合數(shù)據(jù)流,系統(tǒng)控制芯片EP9315從IME6400的HOST總線將數(shù)據(jù)流取出存放到硬盤中,并且控制與外部設(shè)備的通信。

          圖1:系統(tǒng)總體框圖

          2 MPEG-4標(biāo)準(zhǔn)

          2.1 MPEG-4壓縮算法的基本原理

          MPEG-4視頻壓縮算法采用了對象的處理方案,對視頻圖像中的每個目標(biāo)進行單獨處理,能夠在保證圖像質(zhì)量的情況下,極大的降低碼率。在相同的圖像質(zhì)量下,MPEG-4的輸出碼流可以比MPEG-2降低一半。正因為如此,MPEG-4壓縮算法已得到了廣泛的應(yīng)用。MPEG-4中視頻對象(VO)可能是場景中的某一物體、某個區(qū)域、也可能是計算機產(chǎn)生的二維、三維圖形等。VO的選定依賴于具體的應(yīng)用和系統(tǒng)所處的環(huán)境:在要求超低比特率的情況下,VO可以是一個矩形幀,與以前的MPEG-1、H.263標(biāo)準(zhǔn)兼容;對于基于內(nèi)容的應(yīng)用,每一個VO有三類信息描述:運動信息、形狀編碼、紋理編碼。MPEG-4的編碼結(jié)構(gòu)中,首先是從原始視頻流中分割出VO,之后由編碼控制機制為不同的VO及相應(yīng)的3種類型的信息分配碼率,然后是各個VO獨立編碼,最后將各VO的碼流復(fù)合成一個位流。解碼過程是編碼的逆過程。編碼的圖2所示:

          2.2 MPEG-4碼流的形成

          如圖3所示,MPEG-4壓縮算法將一幅圖象分為多個對象,這些對象按不同的層,每個層又分為不同的平面按順序變換為視頻碼流。它的基本視頻流格式如圖3所示。每個視頻對象分為多個視頻對象層,每個視頻對象層形成一個基本流,這一基本流類似與MPEG-2中的GOP。每個基本流都有自己的視頻對象序列頭,不同的視頻對象序列頭可以分別按不同的順序傳送,這就極大地提高了MPEG-4傳送流的靈活性。

          圖3 MPEG-4視頻碼流的基本構(gòu)成

          3 硬件設(shè)計

          3.1 控制模塊設(shè)計

          系統(tǒng)控制模塊選用CIRRUS LOGIC公司的EP9315A微處理器,此處理器是基于ARM920T內(nèi)核,高性能,低功耗,32位CPU,自帶MMU,16k指令cache和16k數(shù)據(jù)cache和Maverick Crunch數(shù)學(xué)協(xié)處理器;主頻200MHz,系統(tǒng)總線100MHz;所支持的操作系統(tǒng)包括WINCE , Linux【1。為了便于設(shè)計和調(diào)試,硬件設(shè)計上采用核心板加底板的模塊化設(shè)計方法,在核心板上集成了基于EP9315的最小系統(tǒng),通過底板來擴展外部功能。在核心板上主要配置了64MB的NAND Flash 和64MB的SDRAM及提供RTC時鐘和工作時鐘的晶體,并將其豐富的外設(shè)接口資源引出。在底板上擴展出USB主機接口、以太網(wǎng)口、UART接口、IDE接口等,以與外部設(shè)備間的數(shù)據(jù)傳輸和通信。

          EP9315支持硬盤的掛載,可以通過外部IDE接口將視頻數(shù)據(jù)直接存入硬盤,但在開發(fā)初期采用通過與PC機服務(wù)器網(wǎng)絡(luò)掛載方式,將記錄數(shù)據(jù)通過網(wǎng)絡(luò)協(xié)議存入PC機硬盤中,便于回放和調(diào)試。IME6400的HOST接口映射到處理器的第6個Memory Bank中,將EP9315的nGCS3片選管腳直接連接IME6400的nCS,地址線ADD[1:5]通過總線驅(qū)動芯片后與HOST接口的HA[0:4]相連【2】,同時將IME6400異步模式下的中斷管腳GPIO0與EP9315的中斷管腳FPGIO1相連。

          3.2 視頻音頻編解碼模塊設(shè)計

          視頻A/D芯片選用Philips公司的高性能可編程解碼芯片SAA7118,該芯片支持多種輸入模式,具有抗混疊濾波、自動鉗位、自動增益變換、亮度、對比度、飽和度調(diào)整等功能,其工作時鐘為24.576MHz。通過設(shè)定SAA7118的內(nèi)部的配置寄存器93H[6]為1使能其HOST端口,實現(xiàn)與IME6400的無縫連接。音頻A/D芯片采用BURR-BROWN公司的PCM1800,它對模擬音頻進行高信噪比20bit數(shù)字采樣,生成PCM數(shù)字音頻流。

          壓縮編碼采用INTIME公司的MPEG-4編碼芯片IME6400。該芯片是一款高性能的單片多通道MPEG-4數(shù)字壓縮編碼芯片,它支持多種編碼模式和比特率控制,并提供了豐富的外圍硬件接口。IME6400總線具有四種工作模式,通過mode管腳定義,在這里mode[1:0]設(shè)定為11,即異步工作模式。在這種模式下,當(dāng)IME6400將GPIO0管腳置低電平時,F(xiàn)IFO緩沖區(qū)中存滿NFIFOSIZE=1k大小的輸出數(shù)據(jù)流,外部接口在得到GPIO0下降沿電平后便可以從IME6400的HOST接口寄存器Encodedstream中讀取數(shù)據(jù)流。GPIO0管腳直接與EP9315的中斷管腳FGPIO相連,在處理器獲取下降沿信號后便中斷當(dāng)前操作,從IME6400讀取數(shù)據(jù)。在讀取完畢后,EP9315要向IME6400的HOST總線寄存器USER4發(fā)送一個不同值,通知IME6400數(shù)據(jù)讀取完成。隨后IME6400可以在FIFO中裝載新的壓縮數(shù)據(jù)流以保證EP9315的繼續(xù)讀取3。

          4 軟件設(shè)計

          Linux系統(tǒng)具有穩(wěn)定、高效、易定制、易裁減、開放源碼等優(yōu)點,因此本系統(tǒng)選用嵌入式Linux作為操作系統(tǒng),在芯片中植入Linux系統(tǒng)作為視頻記錄的應(yīng)用環(huán)境。編寫Linux環(huán)境下的硬件設(shè)備接口程序主要分兩個部分:硬件設(shè)備驅(qū)動程序和應(yīng)用程序,驅(qū)動程序需要在視頻錄像前加載到Linux內(nèi)核中,然后運行記錄程序,本系統(tǒng)采用的動態(tài)加載驅(qū)動的方式。在前面說過用網(wǎng)絡(luò)掛載硬盤來記錄視頻可以便于測試視頻錄像質(zhì)量和調(diào)試軟硬件,具體的操作是:在PC服務(wù)器上用nfs協(xié)議共享一個硬盤空間作為記錄硬盤,然后通過minicom串口通信定義EP9315啟動時首先通過網(wǎng)絡(luò)掛載記錄硬盤,

          fconfig

          fis load zImage

          exec -c "root=/dev/nfs nfsroot=主機地址:共享硬盤空間 ip=嵌入式系統(tǒng)地址console=ttyS0,57600 devfs=mount"

          隨后視頻錄像數(shù)據(jù)的處理就相當(dāng)于在PC機上進行操作,可以克服嵌入式操作系統(tǒng)功能不全,可視化程度不高的缺點【4】。

          4.1 驅(qū)動程序編寫

          編寫linux驅(qū)動程序的最主要工作就是file_operations結(jié)構(gòu)中各入口點的實現(xiàn),即對應(yīng)于open()、release()、read()、write()、ioctrl()等系統(tǒng)調(diào)用子函數(shù)的編寫5。

          Open函數(shù)ime6400_open(struct inode *inode, struct file *filp),IME6400打開后用于模塊加載后的計數(shù),防止系統(tǒng)非法釋放模塊資源。

          Read函數(shù)ime6400_read(struct file *fp, char *buf, size_t size),在IME6400數(shù)據(jù)緩沖區(qū)讀滿后從內(nèi)核空間傳送到用戶空間。

          Write函數(shù)ime6400_write(struct file * fp, const char * buf, size_t size, loff_t *ppos),將攝像頭獲取數(shù)據(jù)從用戶空間傳送到內(nèi)核空間。

          Ioctrl函數(shù)ime6400_ioctl(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg),用于從用戶空間向內(nèi)核空間傳遞定義參數(shù)。

          此外,驅(qū)動程序中還包括:

          IME6400片選的聲明

          #define BASE_ADDR 0x28000000

          將IME6400的片選信號映射到片選4(ncs4管腳)。

          IME6400中斷的申請

          set_external_irq(IRQ_EINT8,EXT_FALLING_EDGE,GPIO_PULLUP_DIS); request_irq(IRQ_EINT8, ime6400_irq, SA_INTERRUPT,"ime6400", NULL)。

          根據(jù)硬件手冊,這里將中斷定義為中斷8,用于在IME6400存入內(nèi)核緩沖區(qū)后通知EP9315讀取數(shù)據(jù)流。

          4.2 應(yīng)用程序編寫

          本系統(tǒng)應(yīng)用程序主要實現(xiàn)在加載設(shè)備驅(qū)動后將視頻流從硬件接口層拷到存儲設(shè)備,具體操作上運用了多線程設(shè)計方法,這種方法的優(yōu)點在于可以共享進程資源,線程間的轉(zhuǎn)換和調(diào)用時間短,效率高,聲明的幾個線程可以相互獨立地完成各自任務(wù),并進行實時通信,傳遞參數(shù)。這里主要創(chuàng)建了三個線程:讀數(shù)據(jù)線程,寫數(shù)據(jù)線程,串口監(jiān)聽線程。

          pthread_create(t1,NULL,(void *)read_thread,NULL);

          pthread_create(t2,NULL,(void *)write_thread,NULL);

          pthread_create(t1,NULL,(void *)listen_thread,NULL);

          系統(tǒng)啟動后,系統(tǒng)首先通過IIC初始化EP9315和IME6400,然后串口監(jiān)聽線程listen_thread()調(diào)用函數(shù)偵測是否有來自串口的控制指令輸入,如果沒有輸入指定指令將無限期等待,如果得到輸入指令則向讀線程read_thread()發(fā)送信號量sem,通知讀線程準(zhǔn)備調(diào)用讀取數(shù)據(jù)函數(shù)IME6400_read()。在IME6400中FIFO緩沖區(qū)內(nèi)記錄數(shù)據(jù)滿后系統(tǒng)獲得中斷,中斷程序?qū)?shù)據(jù)流拷入內(nèi)核空間,若緩沖區(qū)滿則讀線程調(diào)用ime_read()拷貝數(shù)據(jù)到用戶空間,并向IME6400寄存器USER4發(fā)送新的值通知IME6400可以存入新的記錄數(shù)據(jù)流,從而進行下一步編碼。ime_read()拷貝完成后返回,由讀線程向?qū)懢€程發(fā)送信號量sem1通知寫線程write_thread()調(diào)用fwrite()函數(shù)將數(shù)據(jù)寫到硬盤,完成后發(fā)送信號量sem2通知讀線程,然后再由讀線程進行下一輪類似前面的操作。與此同時,監(jiān)聽線程一直在偵測是否有串口輸入的用戶指令,如果有則調(diào)用中止函數(shù)或重新初始化函數(shù)來退出程序或重新啟動系統(tǒng)。

          5 結(jié)論

          該錄像系統(tǒng)已經(jīng)基本完成了測試工作,可以選擇8種分辨率和兩種幀率,最高標(biāo)準(zhǔn)可以達到720576分辨率,25fps。在選擇640480分辨率,25fps錄制模式時,圖像質(zhì)量最好,圖像顯示穩(wěn)定,對于快速運動的物體可以無碼字丟失;在選擇720576,全幀率模式時,硬盤可以連續(xù)錄制4~5個小時。目前系統(tǒng)需要解決的問題是改進錄制高質(zhì)量圖像的碼流的穩(wěn)定性問題,可以考慮在EP9315和硬盤之間加驅(qū)動芯片以提高處理器掛載能力。

          參考文獻:

          【1】 EP9315 User`s Guide. CIRRUS LOGIC, Inc. 2004

          【2】 EP9315 User`s Guide. CIRRUS LOGIC, Inc. 2004

          【3】 IME6400 firmware manual. Intime Corporation. 2003

          【4】 FS-EP9315 USER GUIDE ISSUE 1.8. Shenzhen uCdragon Technology Co. Ltd. 2005.6

          【5】 錢晨 徐榮華 王欽若,基于linux操作系統(tǒng)的設(shè)備驅(qū)動程序開發(fā),微計算機信息,2004.09, 131-133



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();