摘 要: 以ARM9處理器S3C2410作為嵌入式Linux的系統(tǒng)開發(fā)和運行平臺,利用適合田間要求的無線ZigBee節(jié)點CC2430,,在Linux內(nèi)核中實現(xiàn)協(xié)調(diào)器的字符驅(qū)動,,使其通過IO進行數(shù)據(jù)傳輸,避免了串口數(shù)據(jù)傳輸速率低,、數(shù)據(jù)冗余性差,、程序設計繁瑣等缺點。詳細介紹了該系統(tǒng)的設計和開發(fā)過程,,包括網(wǎng)絡通信協(xié)議的選取,,bootloader、內(nèi)核,、文件系統(tǒng)以及驅(qū)動程序的實現(xiàn)和移植,。
關鍵詞: ZigBee;ARM9,;CC2430,;內(nèi)核;移植,;驅(qū)動
農(nóng)田中大范圍的環(huán)境信息監(jiān)測已成為網(wǎng)絡應用范圍重點之一,。針對農(nóng)田布線不便的特點,ZigBee無線節(jié)點網(wǎng)絡成為農(nóng)田信息采集系統(tǒng)的首選,,可對其所分布區(qū)域內(nèi)的各種環(huán)境和檢測對象的信息進行實時的監(jiān)控[1],。然而,控制下層整個網(wǎng)絡狀態(tài)的核心是上位機ARM處理器,,而且上位機與下位機通信大多以串口模式來實現(xiàn)[2-3],。但串口通信模式存在串口傳輸速率低(波特率雙方一致)、傳送距離短[4],、數(shù)據(jù)冗余差(數(shù)據(jù)校驗)以及設計串口協(xié)議繁瑣(幀格式)等不足,。因此本文研究了ZigBee在ARM9內(nèi)核中的協(xié)調(diào)器字符驅(qū)動,利用I/O傳輸數(shù)據(jù),,控制具有協(xié)調(diào)器驅(qū)動的設備在農(nóng)田任何位置即可組網(wǎng),,以減少協(xié)調(diào)器的布局,,實現(xiàn)方便快捷的動態(tài)數(shù)據(jù)監(jiān)測。
1 田間監(jiān)測系統(tǒng)的要求
因監(jiān)測節(jié)點需要零散分布在田間,,以監(jiān)測田間的空氣和地表的溫度,,因此,田間監(jiān)測系統(tǒng)所需要的技術指標應滿足:(1)低功耗,。田間采電受到布線限制,,因此節(jié)點模塊的耗電量應盡可能低,。(2)低成本,。田間需要大量布局節(jié)點,投資成本成為廣泛實施的制約因素,。(3)低復雜度和高可靠性,。田間節(jié)點開發(fā)設備應采用結(jié)構(gòu)簡單、采集數(shù)據(jù)盡可能精確又廉價的設計,。綜合上述特點,,ZigBee可以作為田間無線協(xié)議首選。
ZigBee協(xié)議是基于IEEE802.15.4標準的低功耗,、低速率,、低復雜度的雙向通信技術。它可工作在國際上免授權的2.4 GHz,,具有250 Kb/s的最高數(shù)據(jù)傳輸速率和10~75 m的可靠傳輸距離,。ZigBee支持星型、樹型,、對等和混合型網(wǎng)絡拓撲結(jié)構(gòu),,網(wǎng)絡中的從設備高達254個。根據(jù)如圖1所示的節(jié)點在網(wǎng)絡分布的特點,,節(jié)點在網(wǎng)絡中可實現(xiàn)多條數(shù)據(jù)鏈路通信,,以選擇最佳的路徑進行傳輸,提高了網(wǎng)絡通信的可靠性,。
協(xié)調(diào)器是整個網(wǎng)絡的核心部分,,負責完成整個網(wǎng)絡的無線接入和組建,是維持路由器和終端節(jié)點之間的數(shù)據(jù)通信的關鍵,。在田間固定放置協(xié)調(diào)器節(jié)點會浪費大量的資源,,若動態(tài)地測量田間任意位置的數(shù)據(jù),把協(xié)調(diào)器作為移動設備動態(tài)地測量數(shù)據(jù)則是最好的選擇,,并且可以減少田間協(xié)調(diào)器的放置,,降低設計難度的成本。
2 嵌入式Linux驅(qū)動開發(fā)環(huán)境的搭建
Linux操作系統(tǒng)環(huán)境的搭建如圖2所示,。
2.1 Bootloader的移植
Bootloader是操作系統(tǒng)內(nèi)核運行之前運行的一小段程序,,它為加載內(nèi)核提供合適的硬件環(huán)境,。Bootloader分成Stage1和Stage2兩個階段,具體實現(xiàn)框圖如圖3所示,。
Stage1:主要由匯編實現(xiàn),,包括GPIO驅(qū)動、使開發(fā)板上電LED閃爍,、關閉所有中斷,、設置系統(tǒng)時鐘、關閉看門狗,、SDRAM初始化,、實現(xiàn)相應驅(qū)動(提供更大的執(zhí)行空間)、NAND Flash初始化(驅(qū)動開發(fā)板上唯一的固態(tài)存儲掉電不消失設備)以及設置SP棧指針為Stage2中的C語言代碼執(zhí)行做好準備,。
Stage2:實現(xiàn)加電自搬移過程,、串口調(diào)試信息、函數(shù)庫,、shell命令等擴展功能,。
2.2 內(nèi)核的編譯和移植
本硬件移植2.6.27版本的Linux內(nèi)核:(1)解壓縮tar xf linux-2.6.27.tar.bz2,進入該目錄,。(2)移植平臺為ARM體系結(jié)構(gòu),,修改Makefile中的ARCH?=arm CORSS_COMPILE,?=arm-linux-(交叉編譯器的前綴),。(3)配置內(nèi)核:make deconfig(清除原來編譯的config,如果是第一次配置可省略),;make menuconfig進入配置菜單,,選擇硬件所需的驅(qū)動。大部分可選擇默認選項,,但注意網(wǎng)卡驅(qū)動一定必選,,硬件類型也要匹配。(4)編譯內(nèi)核make bzImage在~/linux-2.6.27/arch/arm/boot/bzImage生成內(nèi)核映像,,通過tftp把bzImage燒到地址為0x30008000內(nèi)存上,,然后用nand erase kernel擦除kernel分區(qū)上的數(shù)據(jù),最后用nand write 0x30008000把內(nèi)存上的數(shù)據(jù)燒到Flash對應的kernel分區(qū)上,。
2.3 根文件系統(tǒng)的移植
運行Linux操作系統(tǒng),,除了內(nèi)核外還需要根文件系統(tǒng)。用mkdir創(chuàng)建rootfs文件夾,,在其中創(chuàng)建根文件系統(tǒng)目錄并安裝busybox,。busybox是專門為嵌入式系統(tǒng)設計的,它把大多數(shù)常用的命令(如ls,,cp,,cd,,tar等)拼接在一起,在根文件系統(tǒng)中只有一個可執(zhí)行文件/bin/busybox,,其余都是busybox的鏈接,。安裝busybox與安裝內(nèi)核類似,在~$tar xf busybox-1.9.1.tar.bz2,、cd busybox-1.9.1/下修改ARCH,?=arm CROSS_COMPILE?=arm-linux-,;make defconfig,、make menuconfig設置busybox安裝路徑rootfs文件夾。將make,、make install,、busybox文件與一系列鏈接文件安裝在rootfs下。其他鏈接文件在/bin,、/sbin、/usr/bin,、/usr/sbin中,,配置Linuxrc啟動文件、安裝glibc共享庫,,在/dev目錄下創(chuàng)建設備文件,,將主機系統(tǒng)時鐘拷貝到根文件系統(tǒng)中去,并配置網(wǎng)路和http相關配置文件,。最后將文件系統(tǒng)配置成YAFFS文件系統(tǒng),,可直接對文件系統(tǒng)進行讀寫。設置開發(fā)板為NFS方式,,啟用可以直接在主機上操作開發(fā)板的根文件系統(tǒng)并進行調(diào)試,。
3 硬件設計及驅(qū)動實現(xiàn)
3.1 系統(tǒng)硬件設計
本系統(tǒng)平臺是采用ARM體系結(jié)構(gòu)的S3C2410作為處理器,通過移植的字符設備驅(qū)動與ZigBee CC2430無線收發(fā)節(jié)點進行數(shù)據(jù)的傳輸,。系統(tǒng)硬件框架圖如圖4所示,。
CC2430是一個真正的片上系統(tǒng)(SoC),以高性能和低功耗的8051為內(nèi)核,,專門針對IEEE802.15.4和ZigBee應用,,它可以用很低的費用構(gòu)成ZigBee節(jié)點。
現(xiàn)有的硬件是通過串口實現(xiàn)數(shù)據(jù)傳輸,,數(shù)據(jù)傳輸?shù)母袷揭凑沾谕ㄐ艆f(xié)議的格式封裝,,大量數(shù)據(jù)的傳輸還需要在串口通信格式的基礎上再進行設計封裝,不僅數(shù)據(jù)傳輸速度慢,,而且容錯能力低,。如果在內(nèi)核中加入ZigBee的字符驅(qū)動則可省去數(shù)據(jù)發(fā)送時的封裝以及接收時需要解析的麻煩,。
3.2 Linux設備驅(qū)動實現(xiàn)
Linux的輸入輸出設備分為字符設備、塊設備和網(wǎng)絡設備三類,。字符設備是發(fā)送和接收都按照字符方式進行,。塊設備則是傳輸固定大小的數(shù)據(jù)給設備。網(wǎng)絡設備則是通過BSD套接口訪問設備,。驅(qū)動程序一般以模塊方式編寫,,加載和卸載主要由module_init()和module_exit()完成[2]。
(1)模塊加載和卸載
模塊需要入口函數(shù)module_init(zigbee_init)的實現(xiàn)代碼如下:
int __init zigbee_init(void)
{
if(zigbee_major){
dev=MKDEV(zigbee_major,,zigbee_minor),;
result=register_chrdev_region(ev,1,,“zigbee”),;
}else{
result=alloc_chrdev_region(&dev,zigbee_minor,,1,,
“zigbee”);
……
zigbee_major=MAJOR(dev),;
……
}
cdev=cdev_alloc(),;
cdev->ops=&zigbee_fops;
rc=cdev_add(cdev,,dev,,1);
……,;
return 0
}
module_exit(zigbee_exit)
{
cdev_dev(cdev),;
return 0
}
在不同的系統(tǒng)中,同一設備的設備號不盡相同,,如果靜態(tài)設置設備號,,則在換另外的平臺時,設備號有可能沖突,,所以動態(tài)分配是最佳選擇,。
(2)模塊驅(qū)動實現(xiàn)
注冊設備編號后要將設備驅(qū)動與之連接,因此必須用file_operation結(jié)構(gòu)建立鏈接,,并建立中斷通知相關數(shù)據(jù),。其實現(xiàn)代碼如下:
Struct file_operation zigbee_fops={
.owner=THIS_MODULE,
.open=zigbee_open,,
.read=zigbee_read,,
.write=zigbee_write,
.ioctl=.zigbee_ioctl,,
.relese=zigbee_release,,
}
當上層應用調(diào)用驅(qū)動程序時,,驅(qū)動程序需要完成以下功能:
①初始化設備,。S3C2410與下層ZigBee CC2430連接管腳處于工作狀態(tài),,注冊并使能中斷。
?、诎凑語igBee協(xié)議規(guī)則構(gòu)建數(shù)據(jù)包并發(fā)送給CC2430,,實現(xiàn)不同控制命令,使芯片完成數(shù)據(jù)發(fā)送和狀態(tài)間的轉(zhuǎn)換,。
?、郛斚挛粰C接收到的數(shù)據(jù)與協(xié)議包格式不符時,產(chǎn)生中斷,,用戶須重新發(fā)送數(shù)據(jù),。
其實現(xiàn)代碼如下:
Int zigbee_open(struct inode *inode, struct file *filp)
{
Rc=request_irq(IRQ_EINT0,,zigbee_interrupt,, SA_INTERRUPT,“zigbee”,,NULL),;
Enable_irq();
…
Set_io(),; //初始化I/O
…
}
用戶發(fā)送數(shù)據(jù)通過ssize_t zigbee_write(struct file *filp,const char __usr *buf,, ssize_t count,,loff_t *f_ops)傳到內(nèi)核空間,然后調(diào)用構(gòu)建數(shù)據(jù)包函數(shù)把數(shù)據(jù)打包發(fā)送出去,。
用戶控制下層命令,,實現(xiàn)代碼如下:
int zigbee_ioctl(struct inode *inode, struct file *filp,, unsigned int cmd,, unsigned long arg)
{
Switch(cmd)
Case A:
Set_state(); //設置設備類型
Case B:
Set_restart(),;
Case C:
Set_start(),;
Case D:
Set_printf();//輸出網(wǎng)絡地址信息
}
Static zigbee_interrupt(int irq,, void *dev_id)
{
Flag=1,;
Set_restart();
Outb(&buf,, &add),;
Return IRQ_HANDLED,;
}
除實現(xiàn)以上函數(shù)外,還需要實現(xiàn)zigbee_relese(struct inode*inode,, struct file*filp),,釋放程序運行中所有資源。
本文通過上位機處理器ARM9CS3C2410,,設計了ZigBee內(nèi)核字符驅(qū)動,,輕松地實現(xiàn)了對下位機的控制,也方便了用戶的上層開發(fā),,提供了用戶與下位機數(shù)據(jù)傳輸?shù)慕涌?,避免了用串口進行數(shù)據(jù)傳輸時程序設計的繁瑣性。由于篇幅限制本文沒給出控制下層模塊命令的具體實現(xiàn)代碼,。希望通過本文能促進ZigBee協(xié)調(diào)器驅(qū)動的進一步實現(xiàn)和研究,。
參考文獻
[1] 楊帆,廖桂平,,李錦衛(wèi),,等.無線傳感器網(wǎng)絡在農(nóng)田環(huán)境信息監(jiān)測中的應用[J].農(nóng)業(yè)網(wǎng)絡信息,2008(3):20-23.
[2] 甘勇,,王華,,常亞軍,等.基于ARM平臺的ZigBee網(wǎng)關設計[J].通信技術,,2009,,42(1):199-201.
[3] 魏守包,唐慧強.基于嵌入式ARM-uClinux的ZigBee網(wǎng)絡設計[J].儀表技術與傳感器,,2009(1):62-64.
[4] 包長春,,石瑞珍,馬玉泉.基于ZigBee技術的農(nóng)業(yè)設施測控系統(tǒng)的設計[J].農(nóng)業(yè)工程學報,,2007,,23(8):160~163.