CAN 架构
较早的 linux 内核版本的 CAN 驱动都是基于字符设备驱动实现,提供的功能相对较少,数据包的排队和更高级别的传输协议必须在用户空间的应用程序实现。现在的内核版本普遍采用 socketCAN 实现 CAN 模块的驱动。socketCAN 是将 CAN 作为一种网络设备,基于 linux 内核的网络层实现的软件框架。
CAN 分层结构
CAN 结点的实现可以分为四层结构,各层的主要功能和作用如下图所示:
CAN 总线的对象层和传输层包括所有由 ISO/OSI 模型定义的数据链路层的服务和功能,相当于是对数据链路层功能的细分。因此,也可以将对象层和传输层看作是 CAN 的数据链路层。
socketCAN 驱动框架
依据 CAN 的分层模型,socketCAN 实现了具体的软件驱动框架,如下图所示(iprouter2/can-utils 只是应用层的一个示例,并不属于 socketCAN 的内容)。
OSI 七层网络模型 | CAN 模型 | socketCAN 框架实现 |
---|---|---|
应用层 | 应用层 | iprouter2/can-utils |
表示层 | ||
会话层 | ||
传输层 | ||
网络层 | ||
数据链路层 | 对象层 | CAN core/CAN driver |
传输层 | CAN 控制器 | |
物理层 | 物理层 | CAN 收发器 |
CAN core 主要是实现了 CAN 的 socket 配置,并向 driver 提供一些调用的接口,该部分内容由 socketCAN 框架负责。传输层和物理层所对应的 CAN 控制器和收发器皆由硬件实现,所以驱动开发的主要工作是实现 driver 部分的代码。
CAN 的底层驱动实现主要包括以下几部分:
-
设置 CAN 的位时序
-
获取 CAN 的发送/接收计数
-
CAN 设备的打开/关闭
-
CAN 设备发送/接收帧信息的操作
-
CAN 设备错误处理的操作