首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于嵌入式ARM-Linux无线ZigBee协调器驱动设计
来源:本站整理  作者:佚名  2011-12-08 17:03:52




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.

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:139,658.20000 毫秒