新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于嵌入式ARM-Linux無線ZigBee協(xié)調(diào)器驅(qū)動設計

基于嵌入式ARM-Linux無線ZigBee協(xié)調(diào)器驅(qū)動設計

作者: 時間:2011-12-14 來源:網(wǎng)絡 收藏
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)建立鏈接,并建立中斷通知相關(guān)數(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ū)動程序需要完成以下功能:
?、俪跏蓟O備。S3C2410與下層ZigBee CC2430連接管腳處于工作狀態(tài),注冊并使能中斷。
 ②按照ZigBee協(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ù)慕涌冢苊饬擞么谶M行數(shù)據(jù)傳輸時程序設計的繁瑣性。由于篇幅限制本文沒給出控制下層模塊命令的具體實現(xiàn)代碼。希望通過本文能促進ZigBee的進一步實現(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)關(guān)設計[J].通信技術(shù),2009,42(1):199-201.
[3] 魏守包,唐慧強.基于嵌入式ARM-uClinux的ZigBee網(wǎng)絡設計[J].儀表技術(shù)與傳感器,2009(1):62-64.
[4] 包長春,石瑞珍,馬玉泉.基于ZigBee技術(shù)的農(nóng)業(yè)設施測控系統(tǒng)的設計[J].農(nóng)業(yè)工程學報,2007,23(8):160~163.

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉