基于ARM的MPEG-4數字錄像機的設計實現
【關鍵詞】ARMEP9315IME6400MPEG-4Linux設備驅動
【Abstract】 In this paper, designing and implementing a digital video recorder which is based on the processor ARM9 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 MPEG-4 Linux Module Driver
隨著科技的飛速發展,消費類電子,通信,電視電影廣播與計算機技術緊密結合起來。而數字化信息,尤其是數字化視頻信息,具有數據量大,存儲傳輸困難的特點,是制約人類獲得信息的主要瓶頸。這種形勢對數字視頻記錄設備的研制提出了新的要求:大批量的應用要求降低監控記錄設備成本,多樣的應用環境、分散、孤立的監控點要求監控記錄設備盡可能一體化、小型化、獨立、便攜、低功耗、供電方便、性能可靠。針對這些新問題和新要求,作者設計實現了一種基于嵌入式系統和MPEG-4編碼標準的數字錄像機,系統集成度高、體積小、功耗低、獨立、便攜,適合大量的各類視頻監控和記錄應用。
1 系統框架及原理說明
本系統選用的主要模塊是低功耗ARM9系列微處理器EP9315和專業視頻壓縮編碼處理芯片IME6400,周圍外部設備有SAA7118 A/D數模轉換芯片,RAM芯片,ROM芯片,網絡模塊和電源模塊。系統電路原理圖如圖1所示。整個電路采用5V電源供電,系統啟動后,外部輸入的視頻和音頻信號分別經過視頻數模轉換模塊和音頻模塊進行解碼,隨后通過IIC總線送入IME6400視頻處理芯片生成MPEG-4視頻音頻復合數據流,系統控制芯片EP9315從IME6400的HOST總線將數據流取出存放到硬盤中,并且控制與外部設備的通信。
圖1:系統總體框圖
2 MPEG-4標準
2.1 MPEG-4壓縮算法的基本原理
MPEG-4視頻壓縮算法采用了基于對象的處理方案,對視頻圖像中的每個目標進行單獨處理,能夠在保證圖像質量的情況下,極大的降低碼率。在相同的圖像質量下,MPEG-4的輸出碼流可以比MPEG-2降低一半。正因為如此,MPEG-4壓縮算法已得到了廣泛的應用。MPEG-4中視頻對象(VO)可能是場景中的某一物體、某個區域、也可能是計算機產生的二維、三維圖形等。VO的選定依賴于具體的應用和系統所處的環境:在要求超低比特率的情況下,VO可以是一個矩形幀,與以前的MPEG-1、H.263標準兼容;對于基于內容的應用,每一個VO有三類信息描述:運動信息、形狀編碼、紋理編碼。MPEG-4的編碼結構中,首先是從原始視頻流中分割出VO,之后由編碼控制機制為不同的VO及相應的3種類型的信息分配碼率,然后是各個VO獨立編碼,最后將各VO的碼流復合成一個位流。解碼過程是編碼的逆過程。編碼的圖2所示:
2.2 MPEG-4碼流的形成
如圖3所示,MPEG-4壓縮算法將一幅圖象分為多個對象,這些對象按不同的層,每個層又分為不同的平面按順序變換為視頻碼流。它的基本視頻流格式如圖3所示。每個視頻對象分為多個視頻對象層,每個視頻對象層形成一個基本流,這一基本流類似與MPEG-2中的GOP。每個基本流都有自己的視頻對象序列頭,不同的視頻對象序列頭可以分別按不同的順序傳送,這就極大地提高了MPEG-4傳送流的靈活性。
圖3 MPEG-4視頻碼流的基本構成
3 硬件設計
3.1 控制模塊設計
系統控制模塊選用CIRRUS LOGIC公司的EP9315A微處理器,此處理器是基于ARM920T內核,高性能,低功耗,32位CPU,自帶MMU,16k指令cache和16k數據cache和Maverick Crunch數學協處理器;主頻200MHz,系統總線100MHz;所支持的操作系統包括WINCE , Linux【1】。為了便于設計和調試,硬件設計上采用核心板加底板的模塊化設計方法,在核心板上集成了基于EP9315的最小系統,通過底板來擴展外部功能。在核心板上主要配置了64MB的NAND Flash 和64MB的SDRAM及提供RTC時鐘和工作時鐘的晶體,并將其豐富的外設接口資源引出。在底板上擴展出USB主機接口、以太網口、UART接口、IDE接口等,以實現與外部設備間的數據傳輸和通信。
EP9315支持硬盤的掛載,可以通過外部IDE接口將視頻數據直接存入硬盤,但在開發初期采用通過與PC機服務器網絡掛載方式,將記錄數據通過網絡協議存入PC機硬盤中,便于回放和調試。IME6400的HOST接口映射到處理器的第6個Memory Bank中,將EP9315的nGCS3片選管腳直接連接IME6400的nCS,地址線ADD[1:5]通過總線驅動芯片后與HOST接口的HA[0:4]相連【2】,同時將IME6400異步模式下的中斷管腳GPIO0與EP9315的中斷管腳FPGIO1相連。
3.2 視頻音頻編解碼模塊設計
視頻A/D芯片選用Philips公司的高性能可編程解碼芯片SAA7118,該芯片支持多種輸入模式,具有抗混疊濾波、自動鉗位、自動增益變換、亮度、對比度、飽和度調整等功能,其工作時鐘為24.576MHz。通過設定SAA7118的內部的配置寄存器93H[6]為1使能其HOST端口,實現與IME6400的無縫連接。音頻A/D芯片采用BURR-BROWN公司的PCM1800,它對模擬音頻進行高信噪比20bit數字采樣,生成PCM數字音頻流。
壓縮編碼采用INTIME公司的MPEG-4編碼芯片IME6400。該芯片是一款高性能的單片多通道MPEG-4數字壓縮編碼芯片,它支持多種編碼模式和比特率控制,并提供了豐富的外圍硬件接口。IME6400總線具有四種工作模式,通過mode管腳定義,在這里mode[1:0]設定為11,即異步工作模式。在這種模式下,當IME6400將GPIO0管腳置低電平時,FIFO緩沖區中存滿NFIFOSIZE=1k大小的輸出數據流,外部接口在得到GPIO0下降沿電平后便可以從IME6400的HOST接口寄存器Encodedstream中讀取數據流。GPIO0管腳直接與EP9315的中斷管腳FGPIO相連,在處理器獲取下降沿信號后便中斷當前操作,從IME6400讀取數據。在讀取完畢后,EP9315要向IME6400的HOST總線寄存器USER4發送一個不同值,通知IME6400數據讀取完成。隨后IME6400可以在FIFO中裝載新的壓縮數據流以保證EP9315的繼續讀取【3】。
4 軟件設計
Linux系統具有穩定、高效、易定制、易裁減、開放源碼等優點,因此本系統選用嵌入式Linux作為操作系統,在芯片中植入Linux系統作為視頻記錄的應用環境。編寫Linux環境下的硬件設備接口程序主要分兩個部分:硬件設備驅動程序和應用程序,驅動程序需要在視頻錄像前加載到Linux內核中,然后運行記錄程序,本系統采用的動態加載驅動的方式。在前面說過用網絡掛載硬盤來記錄視頻可以便于測試視頻錄像質量和調試軟硬件,具體的操作是:在PC服務器上用nfs協議共享一個硬盤空間作為記錄硬盤,然后通過minicom串口通信定義EP9315啟動時首先通過網絡掛載記錄硬盤,
fconfig
fis load zImage
exec -c "root=/dev/nfs nfsroot=主機地址:共享硬盤空間 ip=嵌入式系統地址console=ttyS0,57600 devfs=mount"
隨后視頻錄像數據的處理就相當于在PC機上進行操作,可以克服嵌入式操作系統功能不全,可視化程度不高的缺點【4】。
4.1 驅動程序編寫
編寫linux驅動程序的最主要工作就是file_operations結構中各入口點的實現,即對應于open()、release()、read()、write()、ioctrl()等系統調用子函數的編寫【5】。
Open函數ime6400_open(struct inode *inode, struct file *filp),IME6400打開后用于模塊加載后的計數,防止系統非法釋放模塊資源。
Read函數ime6400_read(struct file *fp, char *buf, size_t size),在IME6400數據緩沖區讀滿后從內核空間傳送到用戶空間。
Write函數ime6400_write(struct file * fp, const char * buf, size_t size, loff_t *ppos),將攝像頭獲取數據從用戶空間傳送到內核空間。
Ioctrl函數ime6400_ioctl(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg),用于從用戶空間向內核空間傳遞定義參數。
此外,驅動程序中還包括:
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)。
根據硬件手冊,這里將中斷定義為中斷8,用于在IME6400存入內核緩沖區后通知EP9315讀取數據流。
4.2 應用程序編寫
本系統應用程序主要實現在加載設備驅動后將視頻流從硬件接口層拷到存儲設備,具體操作上運用了多線程設計方法,這種方法的優點在于可以共享進程資源,線程間的轉換和調用時間短,效率高,聲明的幾個線程可以相互獨立地完成各自任務,并進行實時通信,傳遞參數。這里主要創建了三個線程:讀數據線程,寫數據線程,串口監聽線程。
pthread_create(t1,NULL,(void *)read_thread,NULL);
pthread_create(t2,NULL,(void *)write_thread,NULL);
pthread_create(t1,NULL,(void *)listen_thread,NULL);
系統啟動后,系統首先通過IIC初始化EP9315和IME6400,然后串口監聽線程listen_thread()調用函數偵測是否有來自串口的控制指令輸入,如果沒有輸入指定指令將無限期等待,如果得到輸入指令則向讀線程read_thread()發送信號量sem,通知讀線程準備調用讀取數據函數IME6400_read()。在IME6400中FIFO緩沖區內記錄數據滿后系統獲得中斷,中斷程序將數據流拷入內核空間,若緩沖區滿則讀線程調用ime_read()拷貝數據到用戶空間,并向IME6400寄存器USER4發送新的值通知IME6400可以存入新的記錄數據流,從而進行下一步編碼。ime_read()拷貝完成后返回,由讀線程向寫線程發送信號量sem1通知寫線程write_thread()調用fwrite()函數將數據寫到硬盤,完成后發送信號量sem2通知讀線程,然后再由讀線程進行下一輪類似前面的操作。與此同時,監聽線程一直在偵測是否有串口輸入的用戶指令,如果有則調用中止函數或重新初始化函數來退出程序或重新啟動系統。
5 結論
該錄像系統已經基本完成了測試工作,可以選擇8種分辨率和兩種幀率,最高標準可以達到720576分辨率,25fps。在選擇640480分辨率,25fps錄制模式時,圖像質量最好,圖像顯示穩定,對于快速運動的物體可以無碼字丟失;在選擇720576,全幀率模式時,硬盤可以連續錄制4~5個小時。目前系統需要解決的問題是改進錄制高質量圖像的碼流的穩定性問題,可以考慮在EP9315和硬盤之間加驅動芯片以提高處理器掛載能力。
參考文獻:
【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操作系統的設備驅動程序開發,微計算機信息,2004.09, 131-133
評論