图2:模块的硬件结构
2.3、CAN设备驱动程序设计:
在本系统中,基于设备安全访问的需要,把CAN设备实现了更为完整的封装,既把实际上可以在应用程序中完成的部分功能也封装到设备驱动程序中来完成,这主要包括对已接收报文的解析和待发送报文的组帧等。
设备驱动程序所提供出的抽象的入口点主要是通过一个数据结构向系统进行说明的,即flie_operation数据结构,这个数据结构的内容非常庞大,基于满足CAN的驱动设计设计的要求,简化后的flie_operation结构如下:
structfile_operationscan_fops={
read:canread,
write:canwrite,
open:canopen,
release:canclose,
};
以上各个函数分别对应为:从接收缓冲区中读取数据,向发送缓冲区中写数据,CAN控制器的打开使用,CAN控制器的关闭。
驱动程序的添加包括以下几个部分:
一、向内核注册字符设备
通过调用register_chrdev函数向系统注册字符型设备,Register_chrdev定义为:
intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);
在系统程序中这个函数的声明如下:
intcan_init(void){
intret;
intdata;
ret=register_chrdev(254,"CAN",&can_fops);
if(ret==0)printk("canregistersucceed!\n");
elseprintk("canregisterfailed!\n");
return0;
}
其中,254是为设备驱动程序向系统申请的主设备号;“CAN”是设备名;“&can_fops”是对系统调用的入口点的说明。
二、注册中断
staticvoidcanopent(structinode*inode,structfile*filp)
{
。。。。。。。。。。。。。。
intretval;
cli();//中断挂起
CSR_WRITE(IOPCON,0x16<<15);//设置CAN中断占用INT3,下降沿触发模式
CLEAR_PEND_INT(INT_CANBUS);//清除CAN中断标志位
retval=request_irq(INT_CANBUS,Canbus_Isr,SA_INTERRUPT,"CANBUS",0);//注册中断
INT_ENABLE(INT_CANBUS);//使能CAN中断
SetupCanbus();//完成CAN的硬件初始化工作
}
中断处理程序调用驱动程序中的接口函数完成对CAN的读写控制,报文的接收解析,组织发送报文等功能。以下为CAN的中断处理程序:
staticvoidCanbus_Isr(intirq,void*dev_id,structpt_regs*regs)
{
Uint8flag;
canmsgrmsg;
flag=CanRd(CAN_CREG_IFR_ADR);
CLEAR_PEND_INT(irq);//清中断
if(flag&CAN_IFR_RI)
{
while(CanRcvMsg(&rmsg)==TRUE)
{
DoCanService(&rmsg);//解析并回复报文
CanShowMsg(&rmsg);
}
}
else{
if(flag&0x02)//TIF//CAN非正常情况下的错误处理
printk("CANtranint\n");
if(flag&0x04)//EIF{
printk("CBerr\n");
SetupCanbus();
。。。。。。。。。。。。。。
}
}
同时我们还需要修改一些文件,以使驱动静态编译进内核。方法如下:首先将驱动程序代码candrv.c复制到/uclinux/linux-2.4/drivers/char目录下。在/uclinux/linux/drivers/char目录下mem.c中,intchr_dev_init()函数中增加如下代码:can_init()。在/uclinux/linux/drivers/char目录下Makefile中增加如下代码:L_OBJS+=candrv.o。最后还需要在vendor/Samsung/4510b/Makefile中添加xzy,c,254,0建立设备节点。这样在uClinux运行后我们就可以在/dev目录下看到CAN设备的设备名”CAN”了。同时可以在/proc/interrupts文件中看到CAN的中断标号,“CANBUS”。
4、结论与展望
本文介绍了一种测控终端的设计方案,并对其中的CAN通信模块的软件和硬件设计进行了详细的介绍,采用本方案所设计的CAN通信模块在本电力测控系统中运行稳定,主控板和遥测板的通信状况良好,较好的满足了现场的要求。
本文作者创新点包括三部分:提出了一种测控系统的软硬件设计方案,介绍了Linux驱动的相关知识,阐述了为Linux添加CAN驱动的方法,提高了系统模块之间通信的可靠性。
5、参考文献:
[1]杨波,徐成,李仁发。嵌人式LINUX上的CAN设备驱动程序的设计[J],科学技术与工程
[2]凌世飘,倪震林。基于CAN总线测控系统的在应用可编程设计[J],微计算机信息,2008,2-2:16-03
[3]AlessandroRubini著.UNUX设备驱动程(本文转载自
www.yzbxz.com 一枝笔写作网)序.北京:中国电力出版社,2000
作者简介:
闫亮亮(1983-),男,硕士研究生,研究方向:嵌入式系统、电力自动化。
江平(1983—),男,硕士研究生,研究方向,电力系统自动化。
王晶(1982—),女,硕士研究生,研究方向,电力电子与电力传动。
Biography:
YANliangliang(1983-),Male,Graduatestudent,ResearchDirection:EmbededSystem、PowerSystemandAutomation。
JIANGping(1983-),Male,Graduatestudent,ResearchDirection:PowerSystemandAutomation。
WANGjing(1982-),Female,Graduatestudent,ResearchDirection:PowerElectronicsandElectricPowerTransimission。
(责任编辑:一枝笔写作事务所)