新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于嵌入式ARM-Linux無線ZigBee協調器驅動設計

        基于嵌入式ARM-Linux無線ZigBee協調器驅動設計

        作者: 時間:2011-12-14 來源:網絡 收藏
        3.2 Linux設備驅動實現
         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不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 咸宁市| 英德市| 哈巴河县| 瑞丽市| 剑阁县| 佳木斯市| 西贡区| 兰考县| 车致| 霍山县| 宜君县| 舟曲县| 报价| 阿坝| 滁州市| 湖州市| 渑池县| 茶陵县| 南涧| 泸水县| 丹寨县| 正宁县| 井研县| 菏泽市| 滦平县| 卢湾区| 当雄县| 孟州市| 读书| 大姚县| 高密市| 赤城县| 武鸣县| 盐城市| 翁源县| 水富县| 岳西县| 电白县| 江口县| 澄江县| 盐池县|