基于嵌入式ARM-Linux無線ZigBee協調器驅動設計
Linux的輸入輸出設備分為字符設備、塊設備和網絡設備三類。字符設備是發送和接收都按照字符方式進行。塊設備則是傳輸固定大小的數據給設備。網絡設備則是通過BSD套接口訪問設備。驅動程序一般以模塊方式編寫,加載和卸載主要由module_init()和module_exit()完成[2]。
(1)模塊加載和卸載
模塊需要入口函數module_init(zigbee_init)的實現代碼如下:
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
}
在不同的系統中,同一設備的設備號不盡相同,如果靜態設置設備號,則在換另外的平臺時,設備號有可能沖突,所以動態分配是最佳選擇。
(2)模塊驅動實現
注冊設備編號后要將設備驅動與之連接,因此必須用file_operation結構建立鏈接,并建立中斷通知相關數據。其實現代碼如下:
Struct file_operation zigbee_fops={
.owner=THIS_MODULE,
.open=zigbee_open,
.read=zigbee_read,
.write=zigbee_write,
.ioctl=.zigbee_ioctl,
.relese=zigbee_release,
}
當上層應用調用驅動程序時,驅動程序需要完成以下功能:
①初始化設備。S3C2410與下層ZigBee CC2430連接管腳處于工作狀態,注冊并使能中斷。
②按照ZigBee協議規則構建數據包并發送給CC2430,實現不同控制命令,使芯片完成數據發送和狀態間的轉換。
③當下位機接收到的數據與協議包格式不符時,產生中斷,用戶須重新發送數據。
其實現代碼如下:
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
…
}
用戶發送數據通過ssize_t zigbee_write(struct file *filp,const char __usr *buf, ssize_t count,loff_t *f_ops)傳到內核空間,然后調用構建數據包函數把數據打包發送出去。
用戶控制下層命令,實現代碼如下:
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();//輸出網絡地址信息
}
Static zigbee_interrupt(int irq, void *dev_id)
{
Flag=1;
Set_restart();
Outb(buf, add);
Return IRQ_HANDLED;
}
除實現以上函數外,還需要實現zigbee_relese(struct inode*inode, struct file*filp),釋放程序運行中所有資源。
本文通過上位機處理器ARM9CS3C2410,設計了ZigBee內核字符驅動,輕松地實現了對下位機的控制,也方便了用戶的上層開發,提供了用戶與下位機數據傳輸的接口,避免了用串口進行數據傳輸時程序設計的繁瑣性。由于篇幅限制本文沒給出控制下層模塊命令的具體實現代碼。希望通過本文能促進ZigBee協調器驅動的進一步實現和研究。
參考文獻
[1] 楊帆,廖桂平,李錦衛,等.無線傳感器網絡在農田環境信息監測中的應用[J].農業網絡信息,2008(3):20-23.
[2] 甘勇,王華,常亞軍,等.基于ARM平臺的ZigBee網關設計[J].通信技術,2009,42(1):199-201.
[3] 魏守包,唐慧強.基于嵌入式ARM-uClinux的ZigBee網絡設計[J].儀表技術與傳感器,2009(1):62-64.
[4] 包長春,石瑞珍,馬玉泉.基于ZigBee技術的農業設施測控系統的設計[J].農業工程學報,2007,23(8):160~163.
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論