近幾年,隨著計算機技術和電了技術的飛躍式發展,通過不斷的系統功能集成和優化,網絡覆蓋面積和傳輸穩定性日益增加,將傳統模擬視頻監控系統中的模擬信號部分已舍棄,完成了全數字化的視頻監控系統,并加入了AD轉換功能,使整個視頻數據能在網絡上進行傳輸,滿足了各類行業部門及家庭對網絡可視化業務的需求。這種全數字化的視頻監控系統存系統設備規模和系統功能性上,較之前的模數混合型系統,有了巨大的變化和升級。一般網絡視頻監控系統只需要攝像機、路由器和計算機就能搭建,拓撲結構簡單。利用計算機的強大的處理能力,改善了監控系統的控制效率、提高了監控系統的智能化和采集圖像的質量。基于網絡技術搭建的系統結構,結構清晰、布線簡單、系統擴展性強,并且一臺主控計算機再也不會像DVR一佯對于搭載的攝像機設備有數量限制,同時這種拓撲結構也降低了大型監控系統的管理難度和維護維修成本。對于系統應用層而的開發能在計算機這種統一的設計平臺上進行,大大簡化了對于特殊監控系統的開發難度。
本設計決定選用行業內較為成熟的TI公司DaVinci設計框架。該設計方案集成了ARM和DSP兩個部分,這種設計結構將系統中的圖像處理模塊和攝像機控制模塊結合起來。
文中將描述基于TMS320DM365網絡攝像機的底層程序,包括了系統的內核、驅動、啟動程序等,攝像機系統基于DaVinci框架。整個硬件基礎可以參考之前發表的文章《基于TMS320DM365的網絡視頻監控系統》。
1 DaVinci框架下的網絡攝像機結構
1.1 DaVinci框架簡介
DaVinci(達芬奇)框架是一套由TI公司提出的集成了DSP處理器、軟件、工具的綜合型解決方案系列,非常適合用于開發各類數字視頻終端設備,包括了數字音頻、視頻、成像、視覺應用等。該技術的目的是讓開發廠商能夠更輕松、更快速地開發各種低成本的創新型數字視頻產品。Davinci技術系列組件,其中不僅包括了相應的處理器、軟件、工具,還提供一系列的解決方案和技術支持等。由于基于DaVinci框架下設計出的產品之間兼容性和共通性很高,所以很多大型的公司也樂于使用TI的DaVinci解決方案,以增加自身產品在周邊行業內的兼容性。并且DaVinci框架擁有一套全方位的軟件支持,提供了下至一般的操作系統驅動,上至應用程序接口API,甚至DSP的編碼程序也是作為一個固有程序包,集成在BIOS和Code Server中。
1.2 DaVinci硬件基礎
作為底層驅動軟件的基礎,這里需要詳細對DaVinci框架的硬件結構進行描述。DaVinci數字視頻處理芯片是整個DaVinci技術框架的的核心,其最大特點為整個處理芯片集成了ARM和DSP兩種核心,實現了兩種核心的并行工作和通信機制。TMS320DM365作為DaVinci技術框架下的一款新型芯片,也和之前系列芯片擁有相同的系統,一個通用的DaVinci系統結構如圖1所示。
DSP即數字信號處理器,其主要特點就是能夠進行大量的乘加運算,擁有高速計算能力,并且DSP的數據和程序分離存儲,這樣充分利用了所有線寬,進一步加速了DSP的處理速度,在數字攝像機中DSP專門用于計算量龐大的圖像處理算法。DSP其功能包括了VPSS(Video Process ing Subsystem)和VICP(Video Image Collaborative Processer)兩個部分。視頻處理系統VPSS是DM365的視頻信號采集模塊,與其他攝像機控制芯片相比,最顯著的特點是DM365帶有一個ISIF模塊,可以直接獲取CCD和CMOS的輸出圖像。相較于一般圖像處理芯片需要先一步進行A /D處理,DM365能更加快速地獲取圖像信號。視頻/影像協處理器(VICP)作為DM365芯片中DSP部分的主體,主要功能是視頻圖像的壓縮算法,一般使用的H.264壓縮方式,其中還包括了運動補償、對象識別等算法,這些圖像處理算法占整個系統運算量的600%~80%。
ARM處理器盡管沒有DSP那么快速的圖像處理速度,但是ARM較大的程序存儲量和迅速的任務切換能力,使得它適合復雜的、多線程的任務調控,支持實時的操作系統。ARM子系統管理和協調芯片內其他功能模塊的工作,采用流水線的工作方式執行系統控制任務,例如系統的初始化、參數配置、電源管理和用戶功能等。
兩者之間的通訊方式如圖2所示,芯片中ARM可以訪問DSP的片內存儲器,包括L2RAM和L1 P/D,DSP也可以訪問ARM的片內存儲器,并且ARM和DSP共享DDR2和AEMIF,其中AEMIF是指異步的外接存儲器接口(Asynchronous External MemoryInterface)。因此通常情況下ARM只需要將處理數據的地址指針傳遞給DSP,而不需要大量的數據傳輸。系統中的DSP和ARM通過2個內核相互中斷實現通信,ARM使用DSP的4個通用中斷和1個不可屏蔽中斷來控制DSP;而DSP通過兩個中斷來中斷ARM。DSP的電源、時鐘、復位都是由ARM進行控制。
2 網絡攝像機的軟件結構
由于DaVinci系統雙處理核心的硬件結構,整個DaVinci的軟件框架也類似于硬件框架分為ARM核心的軟件和DSP部分的軟件。整個軟件框架圖如圖3所示,ARM內核中的軟件主要為操作系統、驅動和應用層面的軟件,DSP內核里運行音視頻編解碼算法處理,ARM通過TI的Codec Eng ine機制調用DSP完成編解碼。
在DSP部分,軟件由最底層的DSP/BIOSTM內核,內核上層是Codec engine,用于和ARM端的Linux通信,最頂層是圖像處理箅法。針對圖像處理算法,DaVinci框架提供了數字信號處理算法接口標準(XDAIS)和針對流媒體的XDM。所有符合XDAIS和XDM標準的圖像處理算法包都可以被用于DaVinci的DSP中。并且在XDAIS和XDM中也包括了一套流程完整的基礎的圖像處理算法,用戶可以按照其標準進行修改,或者自行重新開發。再加上由第三方開發的符合XDM標準的軟件包,地豐富了整個DSP圖像處理軟件部分的資源。
ARM部分的軟件系統使用基于Linux的嵌入式軟件系統,軟件結構如圖4所示。整個系統基于Linux的實時操作系統,在Linux上需要加入文件系統、圖形用戶接口和任務管理,最頂層是應用層面的軟件,在應用軟件中DaVinci系統只提供常用的API。
Linux實時操作系統中,應用程序、引導加載程序(Boot Loader)、驅動程序(Driver)和操作系統(Operating System)的內核鏡像都是相互獨立的,可以單獨編譯修改。只要符合各個部分特有的接口和程序存放位置,就能被整個系統識別并且調用。引導程序是UBL和u-boot,用于初始化硬件系統,引導Linux操作系統的加載,完成內核文件加載后,將控制權交給操作系統。操作系統的內核鏡像uImage,是一個基礎的操作系統平臺,調用驅動程序和應用程序,實現多線程機制,完成了系統調用等工作。驅動程序和應用程序是事先存儲在操作系統特定文件夾內的,被操作系統Linux按順序調用,開發者可以根據自己的需要自行修改。Linux內的文件系統主要提供內核中所有文件的存儲、檢索和更新等功能,同樣包括了驅動程序和應用程序的文件操作。一般不提供保護和加密等安全機制。文件系統通過調用和命令方式提供文件的各種操作,主要包括設置、修改對文件和目錄的用戶權限;提供針對目錄的創建、修改和刪除等功能;提供針對文件的創建、打開、讀寫、關閉和撤銷等功能。
對于應用層面的開發而言,并不需要考慮DSP部分的圖像處理實現算法,直接將DSP部分作為一個黑箱進行處理,通過圖像服務接口,從ARM部分通過語句進行調用。圖像服務的接口提供了用戶調用DSP中的圖像處理程序的接口,整個服務接口使用Codec中間框架系統。Linux端的程序通過Codec引擎訪問DSP處理器中的Codec Server。整個Codec框架包括了多種API和SPI,從軟件角度可以看做是一個介于應用程序和DSP中圖像處理算法之間的接口,如圖5所示。這樣ARM端的應用程序開發者,可以不用去考慮DSP中復雜的音視頻算法。
這種ARM和DSP分開的軟件結構,使得整個Davinci框架下的系統的軟件開發被分成了四個部分:圖像算法開發、Codec Server集成開發、CodecEngine集成開發和應用程序開發。基礎的圖像算法可以通過TI提供的CCS開發工具,圖像的編碼算法被存儲為.lib的庫文件。而Codec Server的開發是調用一系列的.lib算法庫,實現各種庫文件的對ARM部分的接口。Ciodec Engine是開發調用Codec Server的Stuh和Skelet on,完善整個圖像處理功能的調用,而面向廠商或是使用者的應用程序的開發,只需要針對不同應用情況編譯基于Linux的應用程序,其中圖像處理算法等內容,作為黑箱供這些使用者調用。
3 網絡攝像機底層軟件
3.1 Linux系統內核
Linux系統內核使用的linux-2.6.32,相較于之前的版本增添了虛擬化內存、改進了文件系統、支持低傳輸延遲時間模式、內存控制器支持SOFtlimits、支持S+Core架構、支持Intel Moorestown及其新的固件接口、支持運行時電源管理、以及新的驅動。常用的LINUX操作系RADHAT Enterprise 6,ubuntu-10.04.debian 6.穩定版本,這些都是使用linux-2.6.32內核。Linux-2.632作為ARM部分所使用的基層操作系統,在TI上也有提供,不過所提供的是一個非常寬泛的、適用于多種DaVinci框架內核產品的一個完整內核,無論是功能還是驅動都非常完善,但是缺點是啟動時間長、容量大,所以我們必須存原有的TI系統內核的基礎上進行一定的修改。整個修改基于Linux操作系統運行。
第一步是系統內核的精簡開始。整個精簡過程主要是在內核文件中刪除自己不需要使用東西,如平臺信息、芯片信息和驅動等,并且在Kconfig和Makefile里面將刪除信息屏蔽。首先完成在內核系統中平臺信息和芯片信息的文件刪減,然后通過Makefile文件重新修改編譯方法,經過重新編譯以后,內核的精簡已經完成,在Linux環境中使用tar jcf或tar zcf壓縮的Linux內核,整個內核的大小下降到了51M,相當于原來尺寸的二分之一。當然可以化簡的還可以包括了include和driver里面的一些不需要使用的驅動,但是由于大小并不是很大,所以這里也就沒有去除。
第二步開始內核系統的配置。因為之前已經修改了內核系統文件的內容,選項即使都已經按照默認的方式配置完畢,但是存細部還需要一定的修改,使用make linux_config進入內核配置界面。首先需要修改的是“General setup”內的晶振,將原本27000000所表示27MHz時鐘參數,改為硬件使用的24MHz時鐘。然后在“Device Drivers”中配置NAND flash的大小、分塊信息;USB的驅動設置一般設定為主機用于,識別U盤等其他USB設備;在選擇視頻傳輸的方式的時候,需要選擇以太網絡的“10M or 100M Ethernet MAC support”傳輸方式:并且開啟I2C和串口功能等。
第三步檢測核對程序內核,確保底層功能程序與硬件設備的匹配。最重要的machdavinci\dm365.c,內部都是管腳定義包括了I/O口的
復用。sound\soc\codecs有tlv320aicxx.c等音頻芯片驅動:soc\davinci里有PCM、I2S等驅動。完成所有檢測核對之后,用make指令編輯linux內核,生產一個bin文件,燒錄到DM365處理器中,即可運行系統內核。
3.2 啟動程序
Bootloader是嵌入式系統啟動之后加載的第一段程序,也就是俗稱的啟動程序,這段代碼一般用于初始化處理芯片,映射內存空間,完成系統基本硬件設置,為之后的操作系統內核提供運行環境及。所以這段程序的長度和運行時間都非常短,但對于整個系統來說是非常重要的。文中使用u-boot作為Bootloader程序,作為一種通用程序,它支持多種體系結構的處理器。其功能涵蓋了flash燒寫、操作系統內核啟動等功能。整個u-boot的軟件流程如圖6所示。
整個u-boot的啟動過程可以分為三個階段。首先在flash中啟動代碼,設置異常的入口地址和異常處理函數、配置系統主頻、I/O寄存器初始化、初始化存儲空間,然后將之后的程序加載到RAM中,起始地址設定,并在RAM中運行,設置硬件系統結構類型、啟動參數地址、打開芯片外圍設備的使能端、設置內核參數、復制鏡像文件和設置入口函數。最后運行嵌入式系統內核鏡像。
將u-boot系列文件導入攝像機后開啟電源,通過RS232串口,可以讀取系統的啟動信息。整個啟動過程可以分為三個不同階段。第一階段首先u-boot驅動先確定啟動的ubl版本和啟動方式,檢測Flash和總線狀態,一般傳統的啟動方式為NANDFlash啟動。第二階段確認RAM等基本傳輸硬件狀態,檢測時鐘信號,接下來開始將Flash中的u-boot啟動程序轉入RAM中。最后一階段檢測所有的硬件信息,并將這些信息傳給Linux內核,然后運行Linux內核,當硬件信息有錯誤時,會跳出錯誤報告。所檢測的硬件信息主要有:CPU內核和狀態、PLL狀態、RAM存儲器、TCP網絡協議、I/O口等。這一步驟結束后,系統地控制權將完全轉交給Linux。啟動一系列內核文件后,會出現Linux的用戶登錄界面。
完成所有硬件檢測和驅動安裝以后,高清網絡攝像機的所有硬件都開始工作,并且擁有最基本的功能,能夠傳輸模擬視頻信號,并且可以登錄網絡,自動獲得IP地址。但是通過游覽器進行圖像的獲取,需要進一步燒錄應用程序。同時,還可以通過串口實時地設置攝像機內Linux內核的設置。
3.3 驅動程序移植
驅動程序是硬件運行功能實現的基礎。由于所設計的DM365網絡攝像機配有USB等多功能通用硬件接口,所以即使是成品之后,處于擴展的原因,新硬件的添加也會非常頻繁,這里就必須讓設備驅動也更新。這里我們想使用一個最簡便的GPIO驅動程序來作為一個驅動程序移植的范例。
驅動移植的一個整體流程,是將針對某一硬件功能的驅動軟件加入Linux嵌入式調用的特殊語句,并且存放在內核操作系統特定的存放位置,修改內核配置文件,使這個驅動能被調用。完成這些修改之后,就能在應用程序層面使用這個硬件設備了。
首先是對CPIO驅動源碼的修改和放置,GPIO是嵌入式系統最簡單、最常用的資源了,比如點亮LED,控制蜂嗚器,輸出高低電平,檢測按鍵,等等。GPIO分輸入和輸出,在linux-2.6.32內核中,本來就有有關GPIO的最底層的寄存器驅動,所以不用另外新建驅動程序,其位置是在\arch\arm\mach-dayrinci目錄下的gpio.c,這個是寄存器級的驅動,與一般單片機MCU一樣,GPIO的設置都是通過特殊寄存器的數值決定的。據DM365的芯片DATASHEET,DM365的CPIO分為3組BANK,BANK01組包括GPIO0~GPIO31,BANK23組包括GPIO32~GPIO63,BANK45組包括GPIO64~GPIO70,由于硬件資源的原因,DM365并不是GPIO管腳就是純粹的GPIO腳,GPIO管腳和其他一些標準接口復用相同的引腳,比如SPI和GPIO復用,I2C和CPIO復用等,到底是使用CPIO還是其他接口,在初始化的時候,都需要對PINMUX0和PINMUX1兩個寄存器進行設置,而這兩個寄存器的設置則在\arch\arm\mach-davrinci目錄下mux_cfg.c和對應的mux.h里,當然如果只是用一些只作為I/O功能的管腳,則不需要對著兩個寄存器進行設置相較于單片機對于I/O口的設置,DM365的GPIO驅動多了一些嵌入式系統特有的功能語句。比如:需要定義一個設備名稱用于程序內部的調用,#define DEVICE_NAME“dm365_gpios” /*定義設備驅動的名字,或設備節點名稱*/并且定義驅動文件的API,在Linux系統當中,所有設備都可以當做文件進行操作。
static const struct file_operations
davinci_dm365_gpio_fileops={
.owner=THIS_MODULE,
.open=davinci_dm365_gpio_open,
.ioctl=davinci_dm365_gpio_ioctl,
};
定義內核初始化的函數功能,這一部分是ARM最基礎的IO口這幾方法,這里就不進行詳細介紹。
完整這些內容后,這個GPIO的驅動程序就可以被Linux系統內核調用了。之后修改內核文件的設置,修改Kconfig文件,加入一段GPIO設置,說明GPIO驅動功能等。存makefile文件的128行,加入語句:ohi-$(DAVINCI_DM365_GPIOS)+=dm365_gpios.o,輸出之前驅動軟件的.o ut文件,這樣整個內核配置完成。之后這個I/O口的驅動程序就可以在應用程序中利用語句:fd=open(“/dev/dm365_gpios”,0);來運行。
這里使用了一個較為簡單常見的GPIO驅動來舉例,是為了更簡單地描述整個Linux嵌入式系統驅動軟件的移植過程。對于其他更為專業的硬件驅動,如usb設備、無線網絡設備等,一般建議從設備購買商那邊獲取面向Linux的驅動軟件,然后經過部分修改后移植進入Linux內核中,最后修改設置文件和makefile文件完成驅動的調用功能。
4 結束語
網絡攝像機,簡化了傳統的以DVR和NVR作為系統的核心的網絡監控系統。每個攝像頭都可以作為一個獨立的視頻監控系統,擁有網絡傳輸功能和IP地址。系統結構上能夠更具有邏輯性和層次性,系統組件也更為便利、有很大的擴展能力,方便了跨地域的大型監控系統組建和訪問。而這種硬件結構上優化的基礎就是一個功能強大、擴展性好的軟件平臺,整個DM365網絡攝像機在軟件方面選用了擁有豐富源代碼和極高穩定性的Linux操作系統,并在該基礎上實現了底層軟件和上層應用程序的設計分離,使得整個系統的軟件開發和使用更為方便和高效。本文詳細描述基于DM365的網絡攝像機的底層軟件應用,包括了整個系統的軟件結構、驅動軟件的移植、內核系統的優化和啟動程序加載等應用性問題。
評論
查看更多