3 網(wǎng)絡(luò)攝像機(jī)底層軟件
3.1 Linux系統(tǒng)內(nèi)核
Linux系統(tǒng)內(nèi)核使用的linux-2.6.32,相較于之前的版本增添了虛擬化內(nèi)存、改進(jìn)了文件系統(tǒng)、支持低傳輸延遲時間模式、內(nèi)存控制器支持SOFtlimits、支持S+Core架構(gòu)、支持Intel Moorestown及其新的固件接口、支持運(yùn)行時電源管理、以及新的驅(qū)動。常用的LINUX操作系RADHAT Enterprise 6,ubuntu-10.04.debian 6.穩(wěn)定版本,這些都是使用linux-2.6.32內(nèi)核。Linux-2.632作為ARM部分所使用的基層操作系統(tǒng),在TI上也有提供,不過所提供的是一個非常寬泛的、適用于多種DaVinci框架內(nèi)核產(chǎn)品的一個完整內(nèi)核,無論是功能還是驅(qū)動都非常完善,但是缺點(diǎn)是啟動時間長、容量大,所以我們必須存原有的TI系統(tǒng)內(nèi)核的基礎(chǔ)上進(jìn)行一定的修改。整個修改基于Linux操作系統(tǒng)運(yùn)行。
第一步是系統(tǒng)內(nèi)核的精簡開始。整個精簡過程主要是在內(nèi)核文件中刪除自己不需要使用東西,如平臺信息、芯片信息和驅(qū)動等,并且在Kconfig和Makefile里面將刪除信息屏蔽。首先完成在內(nèi)核系統(tǒng)中平臺信息和芯片信息的文件刪減,然后通過Makefile文件重新修改編譯方法,經(jīng)過重新編譯以后,內(nèi)核的精簡已經(jīng)完成,在Linux環(huán)境中使用tar jcf或tar zcf壓縮的Linux內(nèi)核,整個內(nèi)核的大小下降到了51M,相當(dāng)于原來尺寸的二分之一。當(dāng)然可以化簡的還可以包括了include和driver里面的一些不需要使用的驅(qū)動,但是由于大小并不是很大,所以這里也就沒有去除。
第二步開始內(nèi)核系統(tǒng)的配置。因?yàn)橹耙呀?jīng)修改了內(nèi)核系統(tǒng)文件的內(nèi)容,選項(xiàng)即使都已經(jīng)按照默認(rèn)的方式配置完畢,但是存細(xì)部還需要一定的修改,使用make linux_config進(jìn)入內(nèi)核配置界面。首先需要修改的是“General setup”內(nèi)的晶振,將原本27000000所表示27MHz時鐘參數(shù),改為硬件使用的24MHz時鐘。然后在“Device Drivers”中配置NAND flash的大小、分塊信息;USB的驅(qū)動設(shè)置一般設(shè)定為主機(jī)用于,識別U盤等其他USB設(shè)備;在選擇視頻傳輸?shù)姆绞降臅r候,需要選擇以太網(wǎng)絡(luò)的“10M or 100M Ethernet MAC support”傳輸方式:并且開啟I2C和串口功能等。
第三步檢測核對程序內(nèi)核,確保底層功能程序與硬件設(shè)備的匹配。最重要的machdavinci\dm365.c,內(nèi)部都是管腳定義包括了I/O口的
復(fù)用。sound\soc\codecs有tlv320aicxx.c等音頻芯片驅(qū)動:soc\davinci里有PCM、I2S等驅(qū)動。完成所有檢測核對之后,用make指令編輯linux內(nèi)核,生產(chǎn)一個bin文件,燒錄到DM365處理器中,即可運(yùn)行系統(tǒng)內(nèi)核。
3.2 啟動程序
Bootloader是嵌入式系統(tǒng)啟動之后加載的第一段程序,也就是俗稱的啟動程序,這段代碼一般用于初始化處理芯片,映射內(nèi)存空間,完成系統(tǒng)基本硬件設(shè)置,為之后的操作系統(tǒng)內(nèi)核提供運(yùn)行環(huán)境及。所以這段程序的長度和運(yùn)行時間都非常短,但對于整個系統(tǒng)來說是非常重要的。文中使用u-boot作為Bootloader程序,作為一種通用程序,它支持多種體系結(jié)構(gòu)的處理器。其功能涵蓋了flash燒寫、操作系統(tǒng)內(nèi)核啟動等功能。整個u-boot的軟件流程如圖6所示。
整個u-boot的啟動過程可以分為三個階段。首先在flash中啟動代碼,設(shè)置異常的入口地址和異常處理函數(shù)、配置系統(tǒng)主頻、I/O寄存器初始化、初始化存儲空間,然后將之后的程序加載到RAM中,起始地址設(shè)定,并在RAM中運(yùn)行,設(shè)置硬件系統(tǒng)結(jié)構(gòu)類型、啟動參數(shù)地址、打開芯片外圍設(shè)備的使能端、設(shè)置內(nèi)核參數(shù)、復(fù)制鏡像文件和設(shè)置入口函數(shù)。最后運(yùn)行嵌入式系統(tǒng)內(nèi)核鏡像。
將u-boot系列文件導(dǎo)入攝像機(jī)后開啟電源,通過RS232串口,可以讀取系統(tǒng)的啟動信息。整個啟動過程可以分為三個不同階段。第一階段首先u-boot驅(qū)動先確定啟動的ubl版本和啟動方式,檢測Flash和總線狀態(tài),一般傳統(tǒng)的啟動方式為NANDFlash啟動。第二階段確認(rèn)RAM等基本傳輸硬件狀態(tài),檢測時鐘信號,接下來開始將Flash中的u-boot啟動程序轉(zhuǎn)入RAM中。最后一階段檢測所有的硬件信息,并將這些信息傳給Linux內(nèi)核,然后運(yùn)行Linux內(nèi)核,當(dāng)硬件信息有錯誤時,會跳出錯誤報告。所檢測的硬件信息主要有:CPU內(nèi)核和狀態(tài)、PLL狀態(tài)、RAM存儲器、TCP網(wǎng)絡(luò)協(xié)議、I/O口等。這一步驟結(jié)束后,系統(tǒng)地控制權(quán)將完全轉(zhuǎn)交給Linux。啟動一系列內(nèi)核文件后,會出現(xiàn)Linux的用戶登錄界面。
完成所有硬件檢測和驅(qū)動安裝以后,高清網(wǎng)絡(luò)攝像機(jī)的所有硬件都開始工作,并且擁有最基本的功能,能夠傳輸模擬視頻信號,并且可以登錄網(wǎng)絡(luò),自動獲得IP地址。但是通過游覽器進(jìn)行圖像的獲取,需要進(jìn)一步燒錄應(yīng)用程序。同時,還可以通過串口實(shí)時地設(shè)置攝像機(jī)內(nèi)Linux內(nèi)核的設(shè)置。
3.3 驅(qū)動程序移植
驅(qū)動程序是硬件運(yùn)行功能實(shí)現(xiàn)的基礎(chǔ)。由于所設(shè)計的DM365網(wǎng)絡(luò)攝像機(jī)配有USB等多功能通用硬件接口,所以即使是成品之后,處于擴(kuò)展的原因,新硬件的添加也會非常頻繁,這里就必須讓設(shè)備驅(qū)動也更新。這里我們想使用一個最簡便的GPIO驅(qū)動程序來作為一個驅(qū)動程序移植的范例。
驅(qū)動移植的一個整體流程,是將針對某一硬件功能的驅(qū)動軟件加入Linux嵌入式調(diào)用的特殊語句,并且存放在內(nèi)核操作系統(tǒng)特定的存放位置,修改內(nèi)核配置文件,使這個驅(qū)動能被調(diào)用。完成這些修改之后,就能在應(yīng)用程序?qū)用媸褂眠@個硬件設(shè)備了。
首先是對CPIO驅(qū)動源碼的修改和放置,GPIO是嵌入式系統(tǒng)最簡單、最常用的資源了,比如點(diǎn)亮LED,控制蜂嗚器,輸出高低電平,檢測按鍵,等等。GPIO分輸入和輸出,在linux-2.6.32內(nèi)核中,本來就有有關(guān)GPIO的最底層的寄存器驅(qū)動,所以不用另外新建驅(qū)動程序,其位置是在\arch\arm\mach-dayrinci目錄下的gpio.c,這個是寄存器級的驅(qū)動,與一般單片機(jī)MCU一樣,GPIO的設(shè)置都是通過特殊寄存器的數(shù)值決定的。據(jù)DM365的芯片DATASHEET,DM365的CPIO分為3組BANK,BANK01組包括GPIO0~GPIO31,BANK23組包括GPIO32~GPIO63,BANK45組包括GPIO64~GPIO70,由于硬件資源的原因,DM365并不是GPIO管腳就是純粹的GPIO腳,GPIO管腳和其他一些標(biāo)準(zhǔn)接口復(fù)用相同的引腳,比如SPI和GPIO復(fù)用,I2C和CPIO復(fù)用等,到底是使用CPIO還是其他接口,在初始化的時候,都需要對PINMUX0和PINMUX1兩個寄存器進(jìn)行設(shè)置,而這兩個寄存器的設(shè)置則在\arch\arm\mach-davrinci目錄下mux_cfg.c和對應(yīng)的mux.h里,當(dāng)然如果只是用一些只作為I/O功能的管腳,則不需要對著兩個寄存器進(jìn)行設(shè)置相較于單片機(jī)對于I/O口的設(shè)置,DM365的GPIO驅(qū)動多了一些嵌入式系統(tǒng)特有的功能語句。比如:需要定義一個設(shè)備名稱用于程序內(nèi)部的調(diào)用,#define DEVICE_NAME“dm365_gpios” /*定義設(shè)備驅(qū)動的名字,或設(shè)備節(jié)點(diǎn)名稱*/并且定義驅(qū)動文件的API,在Linux系統(tǒng)當(dāng)中,所有設(shè)備都可以當(dāng)做文件進(jìn)行操作。
static const struct file_operations
davinci_dm365_gpio_fileops={
.owner=THIS_MODULE,
.open=davinci_dm365_gpio_open,
.ioctl=davinci_dm365_gpio_ioctl,
};
定義內(nèi)核初始化的函數(shù)功能,這一部分是ARM最基礎(chǔ)的IO口這幾方法,這里就不進(jìn)行詳細(xì)介紹。
完整這些內(nèi)容后,這個GPIO的驅(qū)動程序就可以被Linux系統(tǒng)內(nèi)核調(diào)用了。之后修改內(nèi)核文件的設(shè)置,修改Kconfig文件,加入一段GPIO設(shè)置,說明GPIO驅(qū)動功能等。存makefile文件的128行,加入語句:ohi-$(DAVINCI_DM365_GPIOS)+=dm365_gpios.o,輸出之前驅(qū)動軟件的.o ut文件,這樣整個內(nèi)核配置完成。之后這個I/O口的驅(qū)動程序就可以在應(yīng)用程序中利用語句:fd=open(“/dev/dm365_gpios”,0);來運(yùn)行。
這里使用了一個較為簡單常見的GPIO驅(qū)動來舉例,是為了更簡單地描述整個Linux嵌入式系統(tǒng)驅(qū)動軟件的移植過程。對于其他更為專業(yè)的硬件驅(qū)動,如usb設(shè)備、無線網(wǎng)絡(luò)設(shè)備等,一般建議從設(shè)備購買商那邊獲取面向Linux的驅(qū)動軟件,然后經(jīng)過部分修改后移植進(jìn)入Linux內(nèi)核中,最后修改設(shè)置文件和makefile文件完成驅(qū)動的調(diào)用功能。
4 結(jié)束語
網(wǎng)絡(luò)攝像機(jī),簡化了傳統(tǒng)的以DVR和NVR作為系統(tǒng)的核心的網(wǎng)絡(luò)監(jiān)控系統(tǒng)。每個攝像頭都可以作為一個獨(dú)立的視頻監(jiān)控系統(tǒng),擁有網(wǎng)絡(luò)傳輸功能和IP地址。系統(tǒng)結(jié)構(gòu)上能夠更具有邏輯性和層次性,系統(tǒng)組件也更為便利、有很大的擴(kuò)展能力,方便了跨地域的大型監(jiān)控系統(tǒng)組建和訪問。而這種硬件結(jié)構(gòu)上優(yōu)化的基礎(chǔ)就是一個功能強(qiáng)大、擴(kuò)展性好的軟件平臺,整個DM365網(wǎng)絡(luò)攝像機(jī)在軟件方面選用了擁有豐富源代碼和極高穩(wěn)定性的Linux操作系統(tǒng),并在該基礎(chǔ)上實(shí)現(xiàn)了底層軟件和上層應(yīng)用程序的設(shè)計分離,使得整個系統(tǒng)的軟件開發(fā)和使用更為方便和高效。本文詳細(xì)描述基于DM365的網(wǎng)絡(luò)攝像機(jī)的底層軟件應(yīng)用,包括了整個系統(tǒng)的軟件結(jié)構(gòu)、驅(qū)動軟件的移植、內(nèi)核系統(tǒng)的優(yōu)化和啟動程序加載等應(yīng)用性問題。
評論
查看更多