視頻信息在現代信息化戰爭發揮日益重要的作用,在視頻監控、偵察、機載或車載視頻記錄等方面都得到了越來越廣泛應用,這種形勢對數字視頻監控記錄設備的研制提出了新的要求:大批量的應用要求降低監控記錄設備成本,多樣的應用環境、分散、孤立的監控點要求監控記錄設備盡可能一體化、小型化、獨立、便攜、低功耗、供電方便、性能可靠。針對這些新問題和新要求,筆者設計實現了一種基于嵌入式系統和MPEG-4編碼標準的數字錄像機,系統集成度高、體積小、功耗低、獨立、便攜,適合大量的各類視頻監控和記錄應用。 1 系統總體設計及原理 本系統選擇嵌入式微處理器加專用壓縮編碼芯片的方案,系統電路主體框圖如圖1所示,主要由視音頻解碼芯片、視音頻壓縮編碼芯片、核心微處理器控制模塊、電源模塊以及各種外部接口等組成。系統采用單一5V電源供電,正常啟動后,視頻、音頻解碼芯片SAA7114和PCM1800分別對對輸入的模擬視頻、音頻信號進行解碼,并分別送入壓縮編碼芯片IME6400進行壓縮生成MPEG-4復合流,控制芯片S3C2410從ime6400的HOST接口接收數據并以文件的形式存儲至硬盤,并完成系統的總體控制。 2 硬件設計 2.1 視頻音頻解碼及壓縮編碼部分設計 視頻A/D芯片選用Philips公司的SAA7114,該芯片支持多種輸入模式,具有抗混疊濾波、自動增益變換、亮度、對比度調整等功能。通過設定SAA7114的內部的配置寄存器93H[6]為1使能其HOST端口,實現與IME6400的無縫連接。音頻A/D芯片采用BURR-BROWN公司的PCM1800,它對模擬音頻進行高信噪比20bit數字采樣,生成PCM數字音頻流。 壓縮編碼采用INTIME公司的MPEG-4編碼芯片IME6400。該芯片是一款高性能的單片多通道MPEG-4數字壓縮編碼芯片,它支持多種編碼模式和比特率控制,并提供了豐富的外圍硬件接口。其外部HOST接口有四種模式,由MODE引腳來決定,本系統選用異步模式:MODE[1:0] pin = 11。在此模式下,IME6400對輸入的視頻音頻流進行壓縮和復合,產生MPEG-4的系統流,然后經過輸出端口大小為1K的FIFO緩沖進行數據的輸出,當FIFO滿,其GPIO0腳就產生一個下降沿的中斷通知主機讀取FIFO中的數據,主機通過512次(16bit主機)讀IME6400 HOST端口的EncodedStream寄存器完成數據的讀取,外部主機通過寫一個不同的值到USER4寄存器來通知IME6400數據傳輸已完成。 2.2 控制、接口及存儲部分設計 系統控制模塊選用三星的S3C2410微處理器,這是一個采用ARM920T內核,高性能、低功耗、低成本的32位微處理器。為了提高設計和應用的靈活性,硬件設計上采用核心板加底板的模塊化設計方法,在核心板上集成了基于S3C2410的最小系統,通過底板來擴展外部功能。在核心板上主要配置了64MB的NANDFlash 和64MB的SDRAM及提供RTC時鐘和工作時鐘的晶體,并將其豐富的外設接口資源引出。在底板上擴展出USB主機接口、以太網口、UART接口、IDE接口等,以實現與外部設備間的數據傳輸和通信。 S3C2410并不帶有IDE控制模塊,接口電路需另行設計,圖2是IDE接口電路示意圖。電路利用S3C2410的第5個BANK的片選信號nGCS4和地址信號ADD4和ADD5相或后形成IDE接口的兩個片選信號nIDE_CS0、nIDE_CS1,S3C2410的讀寫信號nOE、nWE 則直接用于IDE接口讀寫信號nIOR、nIOW。該方法將IDE接口映射到了S3C2410的第5個Memory Bank中, S3C2410將IDE設備視為普通的存儲器,以相同的方式訪問,這大大降低了系統軟件開發的復雜度。 采用類似IDE接口的方式將IME6400的HOST接口映射到處理器的第6個Memory Bank中。系統存儲部分采用體積小、抗震性好、溫度范圍寬的電子硬盤作為存儲器。 3 軟件設計 由于Linux系統具有穩定、高效、易定制、易裁減、開放源碼等優點,本系統選用嵌入式Linux作為操作系統,在此系統下實現IME6400驅動程序設計和相關應用程序設計。 Linux 將設備當作文件處理,編寫linux驅動程序的最主要工作就是file_operations結構中各入口點的實現,即對應于open()、release()、read()、write()、ioctrl()等系統調用子函數的編寫。同時本系統的設備驅動程序采用靈活性較好的動態加載方式,驅動程序還應包括模塊初始化函數和模塊注銷函數。下面介紹幾個主要函數及其功能: 模塊初始化函數在驅動程序被加載的時候被調用,主要完成以下功能: 申請掛載總線上的視頻編碼芯片的實際物理地址空間并且將它映射到虛擬地址空間: request_region(BASE_ADDR,0x100,"IME6400") vbase = ioremap_nocache(BASE_ADDR,0x100) 注冊設備并獲取主設備號: ret=register_chrdev(IME6400_MAJOR,"ime6400",&ime6400_fops) 設置并且申請中斷及注冊中斷處理函數: set_external_irq(IRQ_EINT19, EXT_FALLING_EDGE, GPIO_PULLUP_DIS) request_irq(IRQ_EINT19, &ime 6400_irq, SA_INTERRUPT,"ime6400", NULL) 注冊設備文件系統: ime6400_devfs_dir= devfs_register(NULL,"ime6400",DEVFS_FL_DEFAULT,IME6400_MAJOR,0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP,&ime6400_fops, NULL) l OPEN函數遞增模塊使用計數,防止沒有釋放設備就把模塊卸載了。 l READ函數阻塞等待數據緩沖區滿,然后把數據從內核空間復制到用戶空間。 l IOCTRL函數實現從用戶空間向內核空間傳遞參數,用于設置IME6400工作模式。 l 中斷處理函數讀取IME6400輸出的MPEG-4碼流數據存入內核緩沖區,并通知IME6400數據讀取完畢。Linux將中斷處理函數分為兩部分:頂半部(top half)是實際響應中斷的例程,底半部(bottom half)是一個被頂半部調用在稍后安全的時間內運行的例程。Linux采用Tasklet機制實現底半部處理,通過宏DECLARE_TASKLET可以聲明Tasklet: static DECLARE_TASKLET(ime_tasklet,do_tasklet,NULL),其中do_tasklet函數實際處理中斷,從IME6400讀取數據至內核緩沖區。通過函數tasklet_schedule()可以調度一個Tasklet運行:tasklet_schedule(&ime_tasklet) 。 本系統應用程序主要實現從驅動層接收MPEG-4碼流數據并存儲至硬盤,主要采用多線程編程的方式,主程序創建了讀和寫線程兩個線程:首先,用戶程序讀線程調用read(),此時編碼尚未開始,驅動進行ime6400_read()無數據可讀,進入睡眠態,用戶進程被阻塞。此后中斷到來,中斷處理程序從IME6400讀取數據存入內核緩沖區,若緩沖區滿則喚醒睡眠的ime6400_read(),并往IME6400的USER4寄存器寫入一個新值,通知IME6400數據已讀取完畢,啟動新一輪的編碼。ime6400_read()被喚醒后,將內核緩沖區數據拷貝到用戶緩沖區,然后返回并等待用戶進程的下一次調用。ime6400_read()返回后,用戶空間讀到編碼數據退出阻塞狀態,然后讀線程以信號量通知寫線程,由寫線程完成將緩沖區數據存儲至硬盤。 4 結束語 系統目前已完成了初步調試,可實時壓縮存儲最大分辨率為720x576全幀率的4:2:2的彩色視頻,采用2G的電子硬盤,在720x576分辨率下可記錄2小時以上,且圖像質量較好。同時系統還具有較好的靈活性,可以通過設置視頻圖像分辨率大小、量化系數、幀率等參數,來達到對圖像大小、圖像質量及碼率等方面的不同要求,以滿足不同場合應用的需要。 |