ZigBee是以IEEE 802.15.4標準為基礎的一種低成本、低功耗的無線網絡技術,通過ZigBee協議棧,可將各ZigBee節點形成一個節點容量大、通信范圍廣的ZigBee網絡。而H.264是當今最好的視頻壓縮標準,具有碼流率低、圖像質量高、容錯能力強等優點。使用ZigBee網絡來傳輸H.264視頻碼流,是實現無線視頻傳輸系統的一種好方案。通過具體開發實例,從硬件和軟件兩個方面討論了該方案的設計與實現。
0 ?引言
ZigBee是以IEEE 802.15.4標準為基礎的一種低成本、低功耗、網絡容量大、通信范圍廣的無線網絡技術,可支持多達65 000個節點。ZigBee的工作頻段有3個,分別是868 MHz、915 MHz、2.4 GHz,當工作于2.4 GHz時,其擁有最高的傳輸速率250 KB/s。在存儲量盡可能小的情況下獲得好的圖像質量和低帶寬圖像快速傳輸已成為視頻壓縮的兩大難題。為此ISO/IEC和ITUT兩大國際標準化組織聯手制定了新一代視頻壓縮標準H.264[3]。H264具有圖像質量好、連續性強、動態圖像質量高、壓縮比高、碼流速率可調等優點。本文從硬件和軟件兩個方面討論使用帶H.264硬件編解碼器、ARM9 CPU核的i.MX27和帶ZigBee協議棧的微處理器CC2430來共同組建無線視頻傳輸系統。
1 ?系統總體設計
系統總體設計如圖1所示,整個ZigBee網絡由一個ZigBee協調器、多個 ZigBee路由器和ZigBee無線視頻終端組成[4]。由于CC2430集成了2.4 GHz DSSS射頻收發器和單片機控制器,因此ZigBee設備可以使用CC2430單芯片來實現。ZigBee協調器用于組建最初的ZigBee網絡,并為加入網絡的每個ZigBee路由器和ZigBee無線視頻終端分配16位網絡短地址。ZigBee路由器在ZigBee網絡中扮演路由和中繼的角色,為各ZigBee無線視頻終端傳輸數據并擴大無線數據傳輸的范圍。ZigBee無線視頻終端根據分配得到的16位網絡短地址可以相互之間進行雙向無線數據通信[5]。i.MX27上采用Linux操作系統,在Linux下通過對采集的圖像進行硬件壓縮編碼,各ZigBee無線視頻終端之間的數據以H.264碼流的形式進行無線傳輸。
2 ?ZigBee無線視頻終端的硬件設計
考慮到H.264軟件編解碼需要消耗大量的CPU資源,故本方案中選擇了具有H.264硬件編解碼器及ARM9 CPU核的Freescale微處理器i.MX27。ARM9 CPU核一方面負責將攝像頭采集到的YUV圖像數據送入H.264硬件編碼器,并將硬件編碼器輸出的H.264碼流通過ZigBee微處理器CC2430無線發送出去。另一方面通過CC2430接收H.264碼流并送入H.264硬件解碼器,然后將硬件解碼器輸出的YUV圖像數據顯示到液晶屏上。ZigBee微處理器CC2430負責H.264碼流的收發工作,并通過SPI接口與i.MX27進行通信。 ZigBee無線視頻終端的硬件組成如圖2所示。
為了實現圖像的采集,本方案采用含有OV9650芯片的CMOS攝像頭,采集到的圖像通過i.MX27的CSI接口傳輸到H.264硬件編碼器中。對于圖像的顯示,則選擇群創AT070TN83V.1(16∶9,800×480)7英寸TFT液晶屏。該屏支持18位數字RGB接口,格式為RGB666,即每個像素由6 bit紅、6 bit綠、6 bit藍構成18 bit數據。該屏與i.MX27的LCDC控制器主要通過18根數據線(LD[17:0])、幀同步(VSYNC)、行同步(HSYSNC)、時鐘(LSCLK)進行連接。采用一片三星的K9F2G08R0A NAND Flash芯片(256 M×8 bit)來儲存系統的Bootloader(RedBoot),Linux內核,文件系統和視頻程序。由兩片Infineon Technologies的HYB18M512160AF7.5芯片(4 Bank×8 M×16 bit)構成128 MB的DDR,主要用于加載Linux操作系統和運行視頻編解碼程序。
設計一個10針的JTAG接口,用來燒寫系統的Bootloader、Linux內核和文件系統。使用MAX3232構成UART接口,用來將調試信息返回到MiniCom上顯示。因處理器內核需要1.8 V、1.5 V電壓,而存儲器和外部I/O需要3.3 V電壓,故把整個系統的輸入電壓設為5 V,經過DCDC轉換器可完成到3.3 V、1.8 V、1.5 V的電壓轉換。采用26 MHz的有源晶振,晶振經過i.MX27片內的PLL電路倍頻后最高可達到400 MHz。
ZigBee通信模塊以CHIPCON公司的CC2430微處理器為核心。將CC2430的SPI接口與i.MX27的SPI接口連接,H.264碼流通過SPI接口進行傳輸。
3 ?ZigBee無線視頻終端的軟件設計
3.1圖像采集
CSI(CMOS Sensor Interface)是i.MX27中的CMOS圖像傳感器接口。圖像的采集可通過CSI接口、圖像傳感器芯片OV9650和Linux下視頻設備的內核驅動V4L2來實現,所以需要加載CSI驅動mx27_csi.ko、ov9650驅動ov9650_cam.ko和V4L2驅動mx27_v4l2_capture.ko。這樣應用程序在打開V4L2后,就可以進行圖像數據采集了。
3.2圖像顯示
LCDC(Liquid Crystal Display Controller)是i.MX27中的液晶顯示控制器。可通過LCDC接口來控制圖像的顯示,故需要加載LCDC驅動mxcfb_modedb.ko和mxcfb.ko及幀緩沖驅動。使用幀緩沖設備時,可將顯示緩沖區直接映射到Linux用戶空間。這樣在Linux用戶空間,應用程序可按照預先設置好的R、G、B位數和偏移量,將圖像數據直接寫到經過mmap()映射后的顯示緩沖區,進而實現圖像的顯示。
3.3 ?H.264編解碼
VPU(Video Processing Unit)是i.MX27中的視頻處理單元,主要用于H.264 BP、MPEG-4 SP、H.263 P3格式的硬件編解碼[6]。為了用戶能夠使用VPU的硬件編解碼器,Freescale提供了一套Linux下的基于i.MX27 VPU的庫文件。不論是編碼還是解碼,首先都必須調用vpu_Init()函數對VPU硬件進行初始化。
對于H.264編碼,需要執行以下步驟:
(1)調用vpu_EncOpen()函數對VPU編碼器初始化;
(2)調用vpu_EncGetInitialInfo()函數獲取編碼初始化信息;
(3)調用vpu_EncRegisterFrameBuffer()函數注冊編碼幀緩沖;
(4)調用vpu_EncStartOneFrame()函數,將編碼幀緩沖中的每一幀圖像數據送入VPU編碼器編碼,并將編碼得到的H.264碼流存放到指定的位流緩沖區中;
(5)當需要結束編碼操作時,只需調用vpu_EncClose()函數。H.264編碼的執行流程如圖3所示。
對于H.264解碼,需要執行以下步驟:
(1)調用vpu_DecOpen()函數對VPU解碼器初始化;
(2)調用vpu_DecGetInitialInfo()函數獲取解碼初始化信息;
(3)調用vpu_DecRegisterFrameBuffer()函數注冊解碼幀緩沖;
(4)為了獲取需解碼的H.264碼流,可調用vpu_DecGetBitstreamBuffer()函數;
(5)調用vpu_DecStartOneFrame()函數,將H.264碼流送入VPU解碼器進行解碼,并將得到的圖像數據存放到解碼幀緩沖中;
(6)當需要結束解碼操作時,只需調用vpu_DecClose()函數。H.264解碼的執行流程如圖4所示。
3.4H.264無線傳輸
要進行H.264碼流無線接收和發送,首先需要加載i.MX27的SPI接口驅動mx27_spi.ko。通過SPI接口,i.MX27可以將H.264碼流[7]傳輸到CC2430中并無線發送出去,也可以將CC2430無線接收的H.264碼流輸入到i.MX27中。
由于ZigBee在2.4 GHz工作頻段和250 KB/s的傳輸速度下,物理層每次最多只能傳輸127 B的數據包。除去物理層和MAC層的網絡包頭,ZigBee每次傳輸的實際數據最多只有89 B[8]。由于ZigBee網絡層不能對H.264碼流進行分割和重組,而傳輸的H.264碼流遠多于89 B,因此必須在ZigBee協議的應用層將H.264碼流分割為等于或小于89 B的數據包進行傳輸。在接收端需要對這些分解的數據包進行重組,以形成正確的H.264碼流。由于在無線數據傳輸過程中被分割的數據包可能會丟失,這將直接影響接收端的數據重組,因此需要建立一個重傳機制來重傳數據傳輸過程中丟失的數據包。下面給出分組傳輸的數據包的格式。
數據發送之前,先執行握手協議[9]。ZigBee發送端先發送請求包,告訴ZigBee接收端即將發送的一幀H.264數據將被分割為幾個數據包以及第一個數據包的編號。編號字段定義為4 B,能對4 GB的數據進行編號,這樣可以保證當編號重復時,舊編號的數據包早已在網絡中消失。
ZigBee接收端接收到請求包后,將返回一個確認包,表示ZigBee接收端接受ZigBee發送端的請求。ZigBee發送端接收到確認包后,同樣也返回一個確認包,這樣握手協議完成。接下來就是實際的數據通信了。握手協議的執行流程如圖5所示。
握手協議完成后,ZigBee接收端將根據分割數據包的數量來分配接收緩沖區大小。將接收到的每個數據包按照數據包的編號依次存放到接收緩沖區對應的位置處,并將該位置的標志置1,表示接收到了對應的數據包。如果接收緩沖區中某些位置的標志為0并且對應的定時器超時,則表示該位置沒有接收到對應的數據包,數據包在無線傳輸的過程中丟失。ZigBee接收端需要向ZigBee發送端發送一個重傳包,請求將丟失的數據包重新傳遞過來。本傳輸協議規定,若針對某位置連續3次發送重傳包后,定時器連續4次超時,則表示傳輸失敗。ZigBee接收端將發送重新開始包,命令ZigBee發送端對下一幀H.264數據進行傳輸。協議重傳的執行流程如圖6所示。
評論
查看更多