嵌入式uClinux下的CAN总线设备驱动程序设计

发布者:来来去去来来最新更新时间:2013-03-30 来源: dzsc关键字:uClinux  CAN总线  设备驱动  S3C4510B 手机看文章 扫描二维码
随时随地手机看文章

1、uClinux操作系统概述

  uClinux是Linux2.0的一个分支,它被设计用于没有MMU的微控制器领域,即被广泛应用于嵌入式Linux领域。uClinux的最大特征就是没有MMU(内存管理单元模块)。它很适合那些没有MMU的处理器,如ARM7TDMI,m68ez328等。

  uClinux具有完全的TCP/IP协议栈,同时对其他许多的网络协议都提供支持。这些网络协议都在uClinux上得到了很好的实现。uClinux可以称作是一个针对嵌入式系统的优秀网络操作系统。

2、Linux驱动程序设计概述

  Linux系统内核通过设备驱动程序与外围设备交互,设备驱动程序是Linux内核的一部分,它是一组数据结构和函数,这些数据结构和函数通过定义的接口控制一个或多个设备。

  和UNIX一样,Linux中所有的设备均作为文件来对待,这些文件一般称为特殊文件,这样做的一个好处是使用户或应用程序可按操纵普通文件的方式进行访问控制硬件设备。

  Linux内核有三种类型的设备驱动程序:字符设备驱动程序、块设备驱动程序和网络设备驱动程序。Linux的设备由一个主设备号(major)和一个次设备号(minor)标识。主设备号唯一标识了设备类型,它是块设备表或字符设备表中设备表的索引。次设备号仅由设备驱动程序解释,用于识别同类设备中,I/O请求所涉及到的那个设备。设备驱动程序可以分为3个主要组成部分:

  (l)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否能正常工作。

  (2)服务于I/O请求的子程序,又称为驱动程序的上半部分。

  (3)中断服务子程序,又称为驱动程序的下半部分。

3、uClinux下CAN设备的驱动程序编写

  根据上文对LINUX下设备驱动程序的描述,以及参考相关的实例分析,下面对CAN总线设备SJA1000的驱动程序进行编写。

  CAN设备驱动程序实际上是linux内核直接对sja1000器件的初始化与读写操作。经分析,sja1000 CAN驱动程序构成包括如下几个部分:

  1)定义sja1000芯片内所有寄存器的访问地址,用于完成对其内部寄存器以及缓冲区的读写访问。例如:

  #define IO_PMOD (*(volatile unsigned *)0x3ff5000)

  #define IO_PDATA (*(volatile unsigned *)0x3ff5008)

  #define IO_PCON (*(volatile unsigned *)0x3ff5004)

  #define SJA_MOD (0x2700000) #define SJA_CMR (0x2700004)

  …………………

  #define SJA_CANRXB7 (0x270006c) #define SJA_CANRXB8 (0x2700070)

  因为在我们的系统中,对sja1000的读写是采用的部分模拟时序的方式,所以用到了S3C4510的IO端口。下面对sja1000地址的定义进行分析。因为uClinux运行的时候,采用的是32位方式,即两个相邻地址间相隔4个字节,而在sja1000内部的地址间的间隔只有1个字节。虽然可以对S3C4510的内部寄存器定义为在访问sja1000的时候,将位宽度定义为8位,但这样会与linux系统运行不匹配,经测试发现读写不正常。所以将sja1000的地址定义为32位宽度。于是各个寄存器地址为(基址+sja1000内部地址×4)。这里将sja1000的基址定义为0x2700000。

2)编写对SJA1000内部寄存器访问的读写函数

  因为S3C4510B处理器的地址和数据总线是分开的,而SJA1000的地址与数据总线是8位分时复用的。所以我们只有采用先向sja1000的8位地址数据总线上送出地址,然后再送数据或者读数据的方式。片选信号/CS,读信号/RD,写信号/WR仍由S3C4510B自己产生。需要模拟的是锁存信号ALE、地址数据总线AD0-AD7。参照sja1000时序图,具体的操作步骤见下面程序和注释。

写子程序如下:

  void sja_write(unsigned int data, unsigned int addr)

  { unsigned char tmp;

  tmp=(addr)>>2;//将32位地址右移2位,tmp的低8位即为sja1000实际地址。

  outl(tmp,addr);//将地址信息作为数据送往SJA1000数据总线

  IO_PDATA=0x32;//ALE=0,让SJA1000将该地址锁存

  outl(data,addr);//将数据信息送往SJA1000数据总线

  O_PDATA=0x33; } //将ALE置高电平,74HC245的/OE置高位

读子程序如下:

  unsigned char sja_read(unsigned int addr)

  { unsigned char data;

  volatile unsigned int data1;

  unsigned char tmp;

  tmp=(addr)>>2; //将32位地址右移2位,tmp的低8位即为sja1000实际地址S3C2410

  outl(tmp,addr); //将地址信息作为数据送往SJA1000数据总线

  IO_PDATA=0x32; //p0-ALE=0,锁存地址信息

  IO_PDATA=0x12; //p5-245dir=0,将74HC245的方向置为CPU输入方向

  data1=inl(addr); //读出所需的数据

  IO_PDATA=0x33; //ALE置高,74HC245置为不工作状态

  data=data1; return(data); }//返回数据

  后面对sja1000的初始化、CAN发送与CAN接收函数中需要对寄存器操作均调用sja_write()和sja_read()函数进行。[page]

3)定义驱动程序的文件结构

  在LINUX系统中,对硬件设备的访问也是被当作文件来操作的。这里定义的文件接口将可以在外部的应用程序中被调用。在CAN驱动程序中,只定义了读CAN信息(CAN接收)、向CAN节点写信息(CAN发送)、打开CAN设备、关闭CAN设备等4个文件接口。定义信息如下面的程序所示。在sja1000_fops中所定义的函数都必须在驱动程序中编写。

  static struct file_operations sja1000_fops = {

  read: sja1000_read, //CAN接收数据

  write: sja1000_write,//CAN发送

  open: sja1000_open, //打开设备S3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  release: sja1000_release, };//关闭设备

4)定义sja1000_write :CAN发送函数(写函数)

  static int sja1000_write(struct file *filp, const char *buf, size_t size,

  loff_t *offp){ }

  在CAN总线控制器Sja1000初始化完成后,即可设置CAN发送,具体对sja1000寄存器的相关操作的相关程序可参阅SJA1000器件的数据手册。

5)定义sja1000_read :CAN接收函数(读函数)

  static int sja1000_read(struct file *filp, char *buf, size_t size,

  loff_t *offp) { }

  该函数完成对CAN总线网络上相应信息的接收。在本系统中CAN接收采用的是查询方式。

6)编写sja1000_open:文件打开函数

  static int sja1000_open(struct inode *inode,struct file *file) { }S3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  进程调用该函数表示对设备的占用。如果返回为-1,表示设备已被其他进程占用,打开非法。如果采用中断方式,对中断的注册也可放在本函数中。

7)编写sja1000_release:文件关闭函数

  static int sja1000_release(struct inode *inode, struct file *file) { }

  该函数进程完成对设备占有权的释放,释放后,其他的进程就可以访问这个设备了。

8)编写sja1000_init(void):void sja1000_init(void) { } CAN设备初始化函数

  该函数完成设备在LINUX内核中的登记。并完成对sja1000初始化。

  Sja1000寄存器配置通过调用上面已写好的sja_write()函数完成。驱动函数登记我们采用的是静态加载的方式,通过调用register_chrdev()完成,程序如下:

  if(result = register_chrdev(254,"sja1000",&sja1000_fops)) S3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  printk("S3C4510-sja1000: Error %d registering device sja1000 ", result);

  其中,254是为sja1000设备分配的主设备号,“sja1000”是显示在/dev中的设备名,sja1000_fops为对应的文件系统指针。返回值小于0表示失败,大于或等于0表示成功。

9)将驱动程序加到uClinux内核中

  当驱动程序sja1000.c编写完成后,下面的工作就是将它加到uClinux内核中了。这需要修改uClinux的源代码,然后重新编译uClinux内核。

  ①将设备驱动程序文件sja1000.c复制到/uClinux-dist/linux/drivers/char目录下。该目录保存了uClinux字符设备的设备驱动程序。修改该目录下mem.c文件,在Init chrdev_init()函数中增加如下代码:

  #ifdef CONFIG_SJA1000_DRIVER device_init() #endifS3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  其中CONFIG_SJA1000_DRIVER是在配置uClinux内核时赋值的。

  ②在uClinux/linux/drivers/char目录下 Makefile中增加如下代码:

  ifeq($(CONFIG_SJA1000_DRIVER,y) L_OBJS+=sja1000.c endif

  如果在配置uClinux内核的时候选择了支持我们定义的设备,则在编译内核的时候会编译sja1000.c,生成 sja1000.o文件。

  ③修改 /uClinux-dist/linux/arch/m68knonunu目录下 config.in文件,在 comment\' Character devices’语句下面加上

  bool \'support for sja1000 driver\'CONFIG_SJA1000_DRIVERS3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  这样,在编译内核,运行make menuconfig的时候,且在配置字符设备时就会有选项:

  support for sja1000 driver 当选中这个选项的时候,设备驱动就加到内核中了。

  ④在romfs中加上设备驱动程序对应的设备文件。设备文件都被包含在/dev目录下。uClinux中使用的根文件系统是romfs文件系统。这个文件系统是一个只读文件系统,所以设备文件必须在编译内核的时候加到romfs文件系统的image中。

  不同的硬件系统对应不同的设备文件,在/uClinux-dist/vendors目录下,分别定义了它们的Makefile文件。在uClinux-dist/Vendors里S3C4510对应的目录下找到它的Makefile文件,并找到区域DEVICES=\\ tty,c,5,0 console,c,5,1 cua0,c,5,64 cual,c,5,65\\,在后面再加上设备项 sja1000,c,254,1\\就行了。

  ③重新编译内核;在shell中将当前目录cd到uClinux-dist目录下,然后:S3C2410 开发板II(B)+3.5寸带触摸TFT液晶屏

  #make menuconfig #make dep #make

  当驱动程序和uClinux内核一起编译链接并生成映像下载到目标板运行以后,可以通过查看/proc/devices,如果已经显示有sja1000,则表明设备加载成功。如果使用了中断,也可以查看/proc/interrupts,该文件记录了当时已经完成的所有系统中断情况。

4、结束语

  实时性方面,可以使用进程间通信如管道、消息队列、共享内存等方法将CAN总线的接收中断与应用程序直接关联,加快系统对CAN总线事件的响应速度。进一步可以通过RTLinux和RTAI(Real Time Application Interface)这两种方案增强uClinux的实时性。

  本文作者创新点:有效地解决了在没有MMU的CPU之上开发一些简单任务操作系统或控制程序效率低、程序简单的缺点。通过使用嵌入式uClinux,它既保存了原先Linux操作系统稳定性、功能强大等优点,又对内核的代码重新编写,减少了内核容量,提高了效率。同时也提出了在CAN总线设备下设计驱动程序的方法。

关键字:uClinux  CAN总线  设备驱动  S3C4510B 引用地址:嵌入式uClinux下的CAN总线设备驱动程序设计

上一篇:基于S3C44B0X和M12模块的GPS接收终端
下一篇:基于嵌入式系统的桩基础检测仪的研制

推荐阅读最新更新时间:2024-03-16 13:20

如何快速实现CAN总线故障定位?
摘要:CAN总线是当前应用最广泛的现场总线之一,但其复杂的故障排查经常困扰到应用工程师。本文结合工作经验为大家推荐几种快速定位CAN总线故障节点的方法。 一 、总线故障 CAN总线故障的原因多种多样,如节点发送周期异常、节点掉线甚至整条总线被拖垮。一个故障节点或者隐患节点往往会危害到整个产品的安全,如新能源车的控制总线中,故障节点导致仪表盘数据更新滞后、显示错误导致司机判断错误引发道路安全事故。 图1 总线故障案例 二、故障定位方法 方法一:将CAN节点一个一个往总线上接,每接一个节点后观察、测试总线通信状况。该方法相信是绝大多数现场应用工程师都有尝试,往往可以零成本揪出问题节点。以上方法虽然非常简单,但
[汽车电子]
如何快速实现<font color='red'>CAN总线</font>故障定位?
一种基于CAN总线的高校食堂刷卡系统的设计方案
引言 在如今的高校食堂,由于学生数量庞大,流动性频繁,传统的纸质餐票、现金或基于接触式IC卡技术的消费支付方式存在服务效率不高、便捷性差、管理成本高、卡片易损坏等诸多弊端。高校食堂消费作为学校后勤服务的重要组成部分,如果仍沿用以前传统的消费方式,将动用大量的人力物力,而且管理上会出现很多繁琐的事务,这样不利于高校更好地为广大师生服务以及学校的管理。为了解决这一问题,如今,越来越多的高校采用智能卡技术和网络技术相结合来构建学校的食堂刷卡系统。 非接触式智能卡技术和CAN总线技术都是当今世界科技迅猛发展的产物。智能卡技术广泛的应用于各行业,特别是公共交通、无线通信、身份识别、金融交易和安全防卫等行业;而CAN总线在可靠性、实时性和
[嵌入式]
CAN总线的协议层
CAN总线是个开放的系统,其标准遵循ISO的OSI七层模式,而CAN的基本协议只有物理层协议和数据链路层协议。实际上,CAN总线的核心技术是其MAC应用协议,主要解决数据冲突的CSMA/AC协议。CAN总线一般用于小型的现场控制网络中,如果协议的结构过于复杂,网络的信息传输速率势必会变慢。因此,CAN总线只用了7层模型中的3层:物理层、数据链路层和应用层,被省略的4层协议一般由软件实现其功能,如图所示。   图 CAN总线协议层
[嵌入式]
CAN总线混合动力骄车电控系统的设计与实现
混合动力汽车是一种由内燃机和电动机混合驱动的汽车,其主要特点是节能、环保。这种汽车在起步时用电动机驱动,消除了内燃机起步时由于燃烧不充分而排黑烟的现象。在汽车减速或刹车时,利用发电机把动能转化成电能,贮存到蓄电池中,实现能量回收达到节能的目的。由于这种汽车是内燃机和电动机两种动力并存,仅用传统的针对内燃机的电控系统无法实现两种动力的最佳配合,因此开发混合动力车的全新电控系统是十分必要的.本文以一种电机并联式混合动力汽车成功实现为背景,从系统角度介绍了混合动力汽车电控系统结构、功能及效果。 1 并联式混合动力驱动结构简介 并联式混合动力汽车的驱动系统结构见图1。发动机通过机械传动装置与驱动桥连接,电动机通过动力复合装置也与驱动桥相
[单片机]
<font color='red'>CAN总线</font>混合动力骄车电控系统的设计与实现
基于CAN总线的三轴磁场监测系统设计
0 引言 发电机组和电动机组是电能生产和应用的基本装备,及时掌握大型电机的运行状态,对电枢电压、电枢电流、励磁电流、温度、转数等参数进行监测就显得尤为重要。电机状态监测系统所需要的传感器种类繁多、数量大,构成的传感器网络相对复杂。不同的状态监测机制存在着其总线结构不统一、总线通信线路复杂、模拟信号干扰大等问题,可靠性、实时性、经济性始终是设计者和用户关注的主要方面 。 本文提出了基于控制器局部网 CAN(Controller Area Network)总线数字模块化三轴磁场监测系统的概念,研究了大型电机状态监测系统架构设计,并重点设计与实现了传感网络节点模块,以及 CAN总线上层协议的软件设计,提高数据采集与传输的可靠性。 1 CA
[测试测量]
基于<font color='red'>CAN总线</font>的三轴磁场监测系统设计
usb转can适配器,一般也叫CAN总线分析仪
usb转can适配器,一般也叫CAN总线分析仪,是非常常见的CAN数据收发检测设备。配合上位机软件,usb转can适配器可以实现许许多多的功能。今天,我们就来介绍几个这个设备的实用功能, 1、波特率自动识别功能 很多时候,我们在进行CAN总线设备的连接时,会不知道总线系统的波特率是多少,那肯定是没办法建立通讯联系。那,我们只能挨个猜吗?当然不必,只要你的USBCAN分析仪能够搭配上位机软件实现波特率自动识别,那就全都不是问题,如下图:   2、接收错误帧显示功能。既然设备叫USBCAN分析仪,它存在的最大目的就在于检测出目标CAN设备生成的错误帧,并通过总线协议规定追根溯源,将问题排查出去。虽然接收错误帧显示是软件的功能,但正所
[机器人]
CAN总线优点
CAN总线优点及特点 ① 组网自由,扩展性强;② 自动错误界定,简化了电控单元对通信的操作;③ 可根据数据内容确定优先权,解决通信的实时性问题。 CAN(Controller Area Network)总线,也称控制器局部网,属于现场总线的范畴,它是一种有效支持分布控制或实时控制的串行通信网络。由于采用了许多新技术及独特的设计,CAN总线与一般的通信总线相比,它的数据通信具有突出的可靠性、实时性和灵活性。 其特点如下: CAN为多主工作方式,网络上任何一个节点均可在任意时刻主动地向 网络上其它节点发送信息,而不分主从。 在报文标识符上,CAN上的节点分成不同的优先级,可满足不同的实时要求,优先级高的数据最多可在134us
[嵌入式]
基于快速传输海量存储的电能质量监测系统
    随着电力电子设备的应用领域越来越广,导致用电负荷加大,其中一些冲击性、非线性负荷使得电网中电压波形畸变,电压波动、闪变和谐波含量增加等问题时有发生,电网受到严重污染;另外,随着精密和复杂电子设备的大量应用,对电网电能质量的要求也越来越高。因此如何提高电能质量是电力企业面临的一个重要课题,而对电能进行实时监测是提高和改善电能质量的一个重要组成部分。     目前已有的电能质量监测设备基本实现了对数据的采集、传输以及分析处理功能,只是在各功能实现的方式上有所不同。文献分别采用虚拟仪器技术、DSP+MCU双CPU设计以及在LPC2478上移植μC/OS-Ⅱ操作系统技术来实现对电能质量的监测,其中与外部的通信部分采用RS-232、红
[电源管理]
基于快速传输海量存储的电能质量监测系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved