基于嵌入式ARM-Linux无线ZigBee协调器驱动设计

2011-12-22 16:46:56来源: 电子产品世界

   农田中大范围的环境信息监测已成为网络应用范围重点之一。针对农田布线不便的特点,ZigBee无线节点网络成为农田信息采集系统的首选,可对其所分布区域内的各种环境和检测对象的信息进行实时的监控[1]。然而,控制下层整个网络状态的核心是上位机ARM处理器,而且上位机与下位机通信大多以串口模式来实现[2-3]。但串口通信模式存在串口传输速率低(波特率双方一致)、传送距离短[4]、数据冗余差(数据校验)以及设计串口协议繁琐(帧格式)等不足。因此本文研究了ZigBee在ARM9内核中的协调器字符驱动,利用I/O传输数据,控制具有协调器驱动的设备在农田任何位置即可组网,以减少协调器的布局,实现方便快捷的动态数据监测。
1 田间监测系统的要求
 因监测节点需要零散分布在田间,以监测田间的空气和地表的温度,因此,田间监测系统所需要的技术指标应满足:(1)低功耗。田间采电受到布线限制,因此节点模块的耗电量应尽可能低。(2)低成本。田间需要大量布局节点,投资成本成为广泛实施的制约因素。(3)低复杂度和高可靠性。田间节点开发设备应采用结构简单、采集数据尽可能精确又廉价的设计。综合上述特点,ZigBee可以作为田间无线协议首选。
 ZigBee协议是基于IEEE802.15.4标准的低功耗、低速率、低复杂度的双向通信技术。它可工作在国际上免授权的2.4 GHz,具有250 Kb/s的最高数据传输速率和10~75 m的可靠传输距离。ZigBee支持星型、树型、对等和混合型网络拓扑结构,网络中的从设备高达254个。根据如图1所示的节点在网络分布的特点,节点在网络中可实现多条数据链路通信,以选择最佳的路径进行传输,提高了网络通信的可靠性。

 协调器是整个网络的核心部分,负责完成整个网络的无线接入和组建,是维持路由器和终端节点之间的数据通信的关键。在田间固定放置协调器节点会浪费大量的资源,若动态地测量田间任意位置的数据,把协调器作为移动设备动态地测量数据则是最好的选择,并且可以减少田间协调器的放置,降低设计难度的成本。
2 嵌入式Linux驱动开发环境的搭建
 Linux操作系统环境的搭建如图2所示。

2.1 Bootloader的移植
 Bootloader是操作系统内核运行之前运行的一小段程序,它为加载内核提供合适的硬件环境。Bootloader分成Stage1和Stage2两个阶段,具体实现框图如图3所示。

 

 

 Stage1:主要由汇编实现,包括GPIO驱动、使开发板上电LED闪烁、关闭所有中断、设置系统时钟、关闭看门狗、SDRAM初始化、实现相应驱动(提供更大的执行空间)、NAND Flash初始化(驱动开发板上唯一的固态存储掉电不消失设备)以及设置SP栈指针为Stage2中的C语言代码执行做好准备。
Stage2:实现加电自搬移过程、串口调试信息、函数库、shell命令等扩展功能。
2.2 内核的编译和移植
 本硬件移植2.6.27版本的Linux内核:(1)解压缩tar xf linux-2.6.27.tar.bz2,进入该目录。(2)移植平台为ARM体系结构,修改Makefile中的ARCH?=arm CORSS_COMPILE?=arm-linux-(交叉编译器的前缀)。(3)配置内核:make deconfig(清除原来编译的config,如果是第一次配置可省略);make menuconfig进入配置菜单,选择硬件所需的驱动。大部分可选择默认选项,但注意网卡驱动一定必选,硬件类型也要匹配。(4)编译内核make bzImage在~/linux-2.6.27/arch/arm/boot/bzImage生成内核映像,通过tftp把bzImage烧到地址为0x30008000内存上,然后用nand erase kernel擦除kernel分区上的数据,最后用nand write 0x30008000把内存上的数据烧到Flash对应的kernel分区上。
2.3 根文件系统的移植
 运行Linux操作系统,除了内核外还需要根文件系统。用mkdir创建rootfs文件夹,在其中创建根文件系统目录并安装busybox。busybox是专门为嵌入式系统设计的,它把大多数常用的命令(如ls,cp,cd,tar等)拼接在一起,在根文件系统中只有一个可执行文件/bin/busybox,其余都是busybox的链接。安装busybox与安装内核类似,在~$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目录下创建设备文件,将主机系统时钟拷贝到根文件系统中去,并配置网路和http相关配置文件。最后将文件系统配置成YAFFS文件系统,可直接对文件系统进行读写。设置开发板为NFS方式,启用可以直接在主机上操作开发板的根文件系统并进行调试。
3 硬件设计及驱动实现
3.1 系统硬件设计

 本系统平台是采用ARM体系结构的S3C2410作为处理器,通过移植的字符设备驱动与ZigBee CC2430无线收发节点进行数据的传输。系统硬件框架图如图4所示。

 CC2430是一个真正的片上系统(SoC),以高性能和低功耗的8051为内核,专门针对IEEE802.15.4和ZigBee应用,它可以用很低的费用构成ZigBee节点。
    现有的硬件是通过串口实现数据传输,数据传输的格式要按照串口通信协议的格式封装,大量数据的传输还需要在串口通信格式的基础上再进行设计封装,不仅数据传输速度慢,而且容错能力低。如果在内核中加入ZigBee的字符驱动则可省去数据发送时的封装以及接收时需要解析的麻烦。

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.

关键字:嵌入式  无线  协调  驱动

编辑:eeleader 引用地址:http://www.eeworld.com.cn/gykz/2011/1222/article_9280.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
嵌入式
无线
协调
驱动

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved