基于ARMLinux平台的CAN设备驱动程序设计与实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S3C2410 是 三 星 公 司 推 出 的 一 款 低 价 位 、低 功 耗 、高 性 能 的 32 位 RISC 嵌入式处理 器 。 该 芯 片 采 用 了 ARM920T 内 核 , 具 有 五 级 整 数 流 水 线 , 工 作 频 率 高 达 266 MHz, 运 行 速 度 可 达 1.1 MIPS/MHz。S3C2410 提供了丰富的内部资源,如: SDRAM 控 制器、LCD 控制器、3 通道的 UART、4 通 道 的 DMA、2 个 SPI 模 块。虽然内部没有 CAN 控制器, 但可以通过 SPI 接口 进 行 扩 展, 接口电路简单, 易于实现。
而 CAN 控 制 器 通 过 CAN 收 发 器 连 接 到 CAN 总 线 网 络 上 , CAN 收发器 实 现 CAN 总 线 数 据 的 差 动 发 送 和 接 收 , 它 最 终 提 供了 CAN 控制器与物理总线的连接。
2.1 嵌入式系统的硬件组成
系统的硬件主要是由 三 星 公 司 的 S3C2410 处 理 器 、带 SPI 接 口 的 独 立 CAN 控 制 器 MCP2510 与 高 速 CAN 收 发 器 TJA1050 等设备组成。以下对所使用的部分硬件作简要介绍:
( 2) 为了增强系统的抗干扰能力, 提高系统的稳 定 性 , 在 CAN 控制器与 CAN 收发器之间加入了光电耦合器 6N137。同 时也解决了 MCP2510 与 TJA1050 之间电平兼容的问题, 还有 效地抑制了 CAN 网络中的尖峰脉冲及噪声干扰。
( 3) 将 CANH 与 CANL 之 间 120 Ω 的 端 接 电 阻 改 良 为 两 个等值电阻与一个旁路电容的形式, 有效提高系统的抗干扰 能力。
3.2 文件操作接口
CAN 设备驱动程序最 终 提 供 给 应 用 程 序 的 是 一 个 流 控 制 接 口, 主 要 包 括 open、close( 或 realse) 、read、write、ioctl 等 操 作 。 添加设备驱动程序, 实际上就是给上述操作编写相应的程序代 码。对于字符设备和块设备, Linux 内核对这些操作作了统一的 抽象, 而每一个设备都会用一个特殊的设备文件来表示, 通过 虚拟文件系统, 应用程序得到一组与具体设备无关的系统调 用。而虚拟文件系统的主体就是结构体 file_operations, 每一种 文件系统都有自己的 file_operations 数据结 构 , 结 构 体 中 的 每 一个成员都是一个函数指针, 实际上实现了对于不同操作的函 数跳转功能, 例如 open 是指向具体文件系统用来实现打开设 备文件操作的入口函数。可以 说 file_operations 实 现 了 标 准 文 件操作到硬件设备操作的映射, 在 Linux2.4.18 内 核 中 , 结 构 体 file_operations 的定义( include/Linux/fs.h) 如下:
机器人研究中心主任, 主要研究方向: 特种机器人与机器人控制等; 宋锐( 1975- ) , 男, 讲师, 博士, 主要研究方向: 机器人控制技术。
80 2007, 43( 15)
Computer Engineering and Applications 计算机工程与应用
( 2) 2 个接收缓冲器, 可优先储存报文。6 个完全验收滤波 器, 2 个完全验收屏蔽滤波器;
本文设计了移动机器人的内部实时控制网络, 在高集成 度、高性价比的嵌入式处理器 S3C2410 上扩展了独立 CAN 控 制器, 实现了可靠、高速的数据通信, 并详细介绍了在 ARM Linux 上开发 CAN 驱动程序的方法与过程。
2 系统的硬件结构原理与设计
整个移动机器人内部控制网络是一个嵌入式 CAN 总线系 统。所有的微处理器直接连接 CAN 控制器( 可以是 SPI、PCI 或 者 其 他 方 式 , 由 CAN 控 制 器 决 定 ) , 以 设 置 CAN 节 点 的 属 性 。
序; 而应用程序对块设备的操作, 都必须经过系统的缓冲区管 理, 间接传递给驱动程序处理。至于网络设备, 它是一类比较特 殊的设备, 它没有对应的设备文件节点, 在系统和驱动程序之 间通过专门定义的数据结构进行数据传输。
字符设备驱动程序是 Linux 系统最基本 、最 常 用 的 驱 动 程 序结构。一般地, 只要不挂载文件系统的设备, 都可以使用字符 设备去描述。独立 CAN 控制 器 MCP2510 实 现 了 CAN 协 议 的 物理层与数据链路层, 属于字符设备。对于 MCP2510 的操作主 要包括设置相关的寄存器、写发送缓冲区、读接收缓冲区等 , 这 些操作将通过统一的系统接口提供给应用程序。
struct file_operations { struct module *owner; loff_t ( *llseek) ( struct file *, loff_t, int) ; ssize_t ( *read) ( struct file *, char *, size_t, loff_t *) ; ssize_t ( *write) ( struct file *, const char *, size_t, loff_t*) ; int ( *readdir) ( struct file *, void *, filldir_t) ; unsigned int( *poll) ( struct file *, struct poll_table_struct *) ; int( *ioctl) ( struct inode *, struct file *, unsigned int, unsigned
1 引言
CAN( Controller Area Network) 是一种非常有效的支持实时 控制和分布式控制的串行通 信 网 络 。CAN 总 线 由 于 其 成 本 低 廉、可靠性高、抗干扰能力强、通信方式灵活等特点, 目前已经广 泛应用于网络化控制系统中。而 ARM Linux 是一款专门支持具 有 MMU( Memory Management Unit) 的 ARM 芯片处理器的嵌入 式操作系统。ARM Linux 由于其源代码开放、系统可配置、网络 功能强大、支持多个系列的 ARM 处理器等优势, 现在已经成功 地 应 用 到 网 络 计 算 机 、机 顶 盒 、手 持 设 备 等 多 种 嵌 入 式 设 备 中 。 在 ARM Linux 中 并 没 有 CAN 设 备 的 驱 动 程 序 , 要 实 现 CAN 通信, 必须针对使用的嵌入式处理器开发 CAN 驱动程序。
山东大学 控制科学与工程学院, 济南 250061 School of Control Science and Engineering, Shandong University, Ji’nan 250061, China E- mail: yantangwang@163.com
WANG Yan- tang, LI Yi- bin, SONG Rui.Design and implementation of CAN device dr iver under embedded ARM Linux oper ating system.Computer Engineer ing and Applications, 2007, 43( 15) : 79- 82.
3 嵌入式 ARM Linux 系统中 CAN 总线软件设计
为了在 ARM Linux 系统环境中操作 CAN 设备, 实现 CAN 通信功能, 在系统软件层设计了专门的 CAN 总线软件接口。它 包括 CAN 驱动程序和 SPI 接口读写程序。CAN 总线软件接口 负责为上层应用层提供透明的 CAN 通信服务, 屏蔽 CAN 控制 器 MCP2510 的 具 体 工 作 细 节 。 同 时 利 用 SPI 接 口 程 序 通 过 MCP2510 控制命令实现对 CAN 控制器的具体操作。
( 1) 本 接 口 设 计 将 MCP2510 的 总 中 断 INT 作 为 S3C2410 的外部中断 4 接入系统。系统没有使用使能发送请求和接收完 毕中断功能, 在 MCP2510 的中断处理函数中, 通 过 SPI 接 口 访 问 MCP2510 内部相应寄存器来确定具体的中断事件, 并对其 做出处理。
Computer Engineering and Applications 计算机工程与应用
2007, 43( 15) 79
◎产品、研发、测试◎
基于 ARM Linux 平台的 CAN 设备驱动程序设计与实现
王彦堂, 李贻斌, 宋 锐 WANG Yan- tang, LI Yi- bin, SONG Rui
摘 要: 针对移动机器人控制系统在实时性、可靠性方面的要求, 提出了基于 CAN 总线 的 分 布 式 控 制 系 统 方 案 , 介 绍 了 在 核 心 数 据处理单元 S3C2410 上扩展 CAN 总线设备的硬件接口设计, 详细讨论了嵌入式 ARM Linux 上驱动程序开发的一般方法, 以及 CAN 设备驱动程序的设计方法和具体实现。经实验证明, 此系统结构简单, 稳定性和可靠性强。 关键词: ARM Linux; CAN 总线; 驱动程序 文章编号: 1002- 8331( 2007) 15- 0079- 04 文献标识码: A 中图分类号: TP393
( 3) 3 个发送缓冲器, 具有优先级设定以及发送中止功能; ( 4) 具有 Loop- Back( 自环检测) 模式, 便于测试。
2.2 硬件接口设计
S3C2410 内 部 具 有 2 个பைடு நூலகம்SPI 模 块 , 支 持 轮 询 、中 断 与 DMA 三种数据发送模式。系统设计时, 将 MCP2510 作为从设备连接 到 S3C2410 的 SPI0 口, 其具体连接原理图见图 1 所示。
独 立 CAN 控 制 器 MCP2510 完 全 支 持 CAN 总 线 的 V2.0A 和 V2.0B 的技术规范。支持最大 1 Mb/s 的可编程波特率。它同 时具备帧优先级设置、接收帧过滤与屏蔽以及报文管理等特 性, 其独特功能如下:
( 1) 支持标准帧和扩展帧两种数据帧格式, 每个帧的数据 字段长度可为 0 ̄8 Byte, 支持远程帧;
基金项目: 国家自然科学基金( the National Natural Science Foundation of China under Grant No.60675044) 。 作者简介: 王彦堂( 1982- ) , 男, 硕士研究生, 主要研究方向: 嵌入式系统底层架构设计与系统软件设计; 李贻斌( 1960- ) , 男, 教授, 博 导 , 山 东 大 学
Abstr act: A distributed CAN bus control system is introduced to meet the demand of real- time capability and system reliability on a mobile robotic control system.The hardware interface design for expanding CAN- bus device on a S3C2410 board is then described.Detailed discussions are made on the general method of device driver designing in ARM Linux and implementation of CAN device driver.Experiments indicate that this system is adequately stabile and reliable, but with a simple structure and easy implementation. Key wor ds: ARM Linux; CAN bus; device driver program
3.1 CAN 驱动程序的设计
Linux 驱动程序属于 Linux 内核的一部 分 , 其 功 能 主 要 是 直接操作硬件设备, 为用户屏蔽设备的工作细节, 并向用户提 供透明访问硬件设备的机制。Linux 驱动程序支持 3 种类型的 设备: 字符设备、块设备、网络设备。字符设备与块设备的主要 区别是系统对这两种设备的管理方式, 即应用程序对字符设备 的 每 一 个 I/O 操 作 , 都 会 直 接 传 递 给 系 统 内 核 对 应 的 驱 动 程
而 CAN 控 制 器 通 过 CAN 收 发 器 连 接 到 CAN 总 线 网 络 上 , CAN 收发器 实 现 CAN 总 线 数 据 的 差 动 发 送 和 接 收 , 它 最 终 提 供了 CAN 控制器与物理总线的连接。
2.1 嵌入式系统的硬件组成
系统的硬件主要是由 三 星 公 司 的 S3C2410 处 理 器 、带 SPI 接 口 的 独 立 CAN 控 制 器 MCP2510 与 高 速 CAN 收 发 器 TJA1050 等设备组成。以下对所使用的部分硬件作简要介绍:
( 2) 为了增强系统的抗干扰能力, 提高系统的稳 定 性 , 在 CAN 控制器与 CAN 收发器之间加入了光电耦合器 6N137。同 时也解决了 MCP2510 与 TJA1050 之间电平兼容的问题, 还有 效地抑制了 CAN 网络中的尖峰脉冲及噪声干扰。
( 3) 将 CANH 与 CANL 之 间 120 Ω 的 端 接 电 阻 改 良 为 两 个等值电阻与一个旁路电容的形式, 有效提高系统的抗干扰 能力。
3.2 文件操作接口
CAN 设备驱动程序最 终 提 供 给 应 用 程 序 的 是 一 个 流 控 制 接 口, 主 要 包 括 open、close( 或 realse) 、read、write、ioctl 等 操 作 。 添加设备驱动程序, 实际上就是给上述操作编写相应的程序代 码。对于字符设备和块设备, Linux 内核对这些操作作了统一的 抽象, 而每一个设备都会用一个特殊的设备文件来表示, 通过 虚拟文件系统, 应用程序得到一组与具体设备无关的系统调 用。而虚拟文件系统的主体就是结构体 file_operations, 每一种 文件系统都有自己的 file_operations 数据结 构 , 结 构 体 中 的 每 一个成员都是一个函数指针, 实际上实现了对于不同操作的函 数跳转功能, 例如 open 是指向具体文件系统用来实现打开设 备文件操作的入口函数。可以 说 file_operations 实 现 了 标 准 文 件操作到硬件设备操作的映射, 在 Linux2.4.18 内 核 中 , 结 构 体 file_operations 的定义( include/Linux/fs.h) 如下:
机器人研究中心主任, 主要研究方向: 特种机器人与机器人控制等; 宋锐( 1975- ) , 男, 讲师, 博士, 主要研究方向: 机器人控制技术。
80 2007, 43( 15)
Computer Engineering and Applications 计算机工程与应用
( 2) 2 个接收缓冲器, 可优先储存报文。6 个完全验收滤波 器, 2 个完全验收屏蔽滤波器;
本文设计了移动机器人的内部实时控制网络, 在高集成 度、高性价比的嵌入式处理器 S3C2410 上扩展了独立 CAN 控 制器, 实现了可靠、高速的数据通信, 并详细介绍了在 ARM Linux 上开发 CAN 驱动程序的方法与过程。
2 系统的硬件结构原理与设计
整个移动机器人内部控制网络是一个嵌入式 CAN 总线系 统。所有的微处理器直接连接 CAN 控制器( 可以是 SPI、PCI 或 者 其 他 方 式 , 由 CAN 控 制 器 决 定 ) , 以 设 置 CAN 节 点 的 属 性 。
序; 而应用程序对块设备的操作, 都必须经过系统的缓冲区管 理, 间接传递给驱动程序处理。至于网络设备, 它是一类比较特 殊的设备, 它没有对应的设备文件节点, 在系统和驱动程序之 间通过专门定义的数据结构进行数据传输。
字符设备驱动程序是 Linux 系统最基本 、最 常 用 的 驱 动 程 序结构。一般地, 只要不挂载文件系统的设备, 都可以使用字符 设备去描述。独立 CAN 控制 器 MCP2510 实 现 了 CAN 协 议 的 物理层与数据链路层, 属于字符设备。对于 MCP2510 的操作主 要包括设置相关的寄存器、写发送缓冲区、读接收缓冲区等 , 这 些操作将通过统一的系统接口提供给应用程序。
struct file_operations { struct module *owner; loff_t ( *llseek) ( struct file *, loff_t, int) ; ssize_t ( *read) ( struct file *, char *, size_t, loff_t *) ; ssize_t ( *write) ( struct file *, const char *, size_t, loff_t*) ; int ( *readdir) ( struct file *, void *, filldir_t) ; unsigned int( *poll) ( struct file *, struct poll_table_struct *) ; int( *ioctl) ( struct inode *, struct file *, unsigned int, unsigned
1 引言
CAN( Controller Area Network) 是一种非常有效的支持实时 控制和分布式控制的串行通 信 网 络 。CAN 总 线 由 于 其 成 本 低 廉、可靠性高、抗干扰能力强、通信方式灵活等特点, 目前已经广 泛应用于网络化控制系统中。而 ARM Linux 是一款专门支持具 有 MMU( Memory Management Unit) 的 ARM 芯片处理器的嵌入 式操作系统。ARM Linux 由于其源代码开放、系统可配置、网络 功能强大、支持多个系列的 ARM 处理器等优势, 现在已经成功 地 应 用 到 网 络 计 算 机 、机 顶 盒 、手 持 设 备 等 多 种 嵌 入 式 设 备 中 。 在 ARM Linux 中 并 没 有 CAN 设 备 的 驱 动 程 序 , 要 实 现 CAN 通信, 必须针对使用的嵌入式处理器开发 CAN 驱动程序。
山东大学 控制科学与工程学院, 济南 250061 School of Control Science and Engineering, Shandong University, Ji’nan 250061, China E- mail: yantangwang@163.com
WANG Yan- tang, LI Yi- bin, SONG Rui.Design and implementation of CAN device dr iver under embedded ARM Linux oper ating system.Computer Engineer ing and Applications, 2007, 43( 15) : 79- 82.
3 嵌入式 ARM Linux 系统中 CAN 总线软件设计
为了在 ARM Linux 系统环境中操作 CAN 设备, 实现 CAN 通信功能, 在系统软件层设计了专门的 CAN 总线软件接口。它 包括 CAN 驱动程序和 SPI 接口读写程序。CAN 总线软件接口 负责为上层应用层提供透明的 CAN 通信服务, 屏蔽 CAN 控制 器 MCP2510 的 具 体 工 作 细 节 。 同 时 利 用 SPI 接 口 程 序 通 过 MCP2510 控制命令实现对 CAN 控制器的具体操作。
( 1) 本 接 口 设 计 将 MCP2510 的 总 中 断 INT 作 为 S3C2410 的外部中断 4 接入系统。系统没有使用使能发送请求和接收完 毕中断功能, 在 MCP2510 的中断处理函数中, 通 过 SPI 接 口 访 问 MCP2510 内部相应寄存器来确定具体的中断事件, 并对其 做出处理。
Computer Engineering and Applications 计算机工程与应用
2007, 43( 15) 79
◎产品、研发、测试◎
基于 ARM Linux 平台的 CAN 设备驱动程序设计与实现
王彦堂, 李贻斌, 宋 锐 WANG Yan- tang, LI Yi- bin, SONG Rui
摘 要: 针对移动机器人控制系统在实时性、可靠性方面的要求, 提出了基于 CAN 总线 的 分 布 式 控 制 系 统 方 案 , 介 绍 了 在 核 心 数 据处理单元 S3C2410 上扩展 CAN 总线设备的硬件接口设计, 详细讨论了嵌入式 ARM Linux 上驱动程序开发的一般方法, 以及 CAN 设备驱动程序的设计方法和具体实现。经实验证明, 此系统结构简单, 稳定性和可靠性强。 关键词: ARM Linux; CAN 总线; 驱动程序 文章编号: 1002- 8331( 2007) 15- 0079- 04 文献标识码: A 中图分类号: TP393
( 3) 3 个发送缓冲器, 具有优先级设定以及发送中止功能; ( 4) 具有 Loop- Back( 自环检测) 模式, 便于测试。
2.2 硬件接口设计
S3C2410 内 部 具 有 2 个பைடு நூலகம்SPI 模 块 , 支 持 轮 询 、中 断 与 DMA 三种数据发送模式。系统设计时, 将 MCP2510 作为从设备连接 到 S3C2410 的 SPI0 口, 其具体连接原理图见图 1 所示。
独 立 CAN 控 制 器 MCP2510 完 全 支 持 CAN 总 线 的 V2.0A 和 V2.0B 的技术规范。支持最大 1 Mb/s 的可编程波特率。它同 时具备帧优先级设置、接收帧过滤与屏蔽以及报文管理等特 性, 其独特功能如下:
( 1) 支持标准帧和扩展帧两种数据帧格式, 每个帧的数据 字段长度可为 0 ̄8 Byte, 支持远程帧;
基金项目: 国家自然科学基金( the National Natural Science Foundation of China under Grant No.60675044) 。 作者简介: 王彦堂( 1982- ) , 男, 硕士研究生, 主要研究方向: 嵌入式系统底层架构设计与系统软件设计; 李贻斌( 1960- ) , 男, 教授, 博 导 , 山 东 大 学
Abstr act: A distributed CAN bus control system is introduced to meet the demand of real- time capability and system reliability on a mobile robotic control system.The hardware interface design for expanding CAN- bus device on a S3C2410 board is then described.Detailed discussions are made on the general method of device driver designing in ARM Linux and implementation of CAN device driver.Experiments indicate that this system is adequately stabile and reliable, but with a simple structure and easy implementation. Key wor ds: ARM Linux; CAN bus; device driver program
3.1 CAN 驱动程序的设计
Linux 驱动程序属于 Linux 内核的一部 分 , 其 功 能 主 要 是 直接操作硬件设备, 为用户屏蔽设备的工作细节, 并向用户提 供透明访问硬件设备的机制。Linux 驱动程序支持 3 种类型的 设备: 字符设备、块设备、网络设备。字符设备与块设备的主要 区别是系统对这两种设备的管理方式, 即应用程序对字符设备 的 每 一 个 I/O 操 作 , 都 会 直 接 传 递 给 系 统 内 核 对 应 的 驱 动 程