基于嵌入式ARM-Linux无线ZigBee协调器驱动设计
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协调器驱动的进一步实现和研究。
- 基于ARM平台的远程视频监控系统的研究(04-22)
- 基于ARM920T的红外通信系统的设计(03-11)
- 基于ARM9内核和嵌入式Linux的网络投影机系统设计(08-26)
- 基于ZigBee的家庭智能系统设计(08-09)
- 基于MC9S08QG8低端微控制器的无线控制器设计(08-29)
- 基于ZigBee与红外的家居监控系统(09-29)