Linux内核Socket CAN中文文档 联系客服

发布时间 : 星期四 文章Linux内核Socket CAN中文文档更新完毕开始阅读c7eae43b5a8102d276a22f91

vcan驱动从linux2.6.24开始支持netlink接口,使得创建vcan网络设备变的可能。可以使用ip(8)命令工具管理vcan网络设备的创建和移除:

- 创建一个vcan网络接口: $ ip link add type vcan

- 使用给定的名字 'vcan42'创建 一个vcan网络接口: $ ip link add dev vcan42 type vcan

- 移除vcan网络接口'vcan42': $ ip link del vcan42

6.5 CAN网络设备驱动接口 ------------------------------

CAN网络设备驱动提供了进行安装、配置和监控CAN网络设备的接口。可以使用IPROUTE2工具集中的“ip”命令通过netlink接口配置CAN设备,比如设置波特率。本章剩余的部分将会简介如何使用这一工具。另外这些接口使用一些通用的数据结构并且提供了一系列常用的功能,这些功能都是CAN网络设备驱动需要用到的。请参考SJA1000或者MSCAN的驱动去了解如何使用它们。模块的名字是can-dev.ko。

?

6.5.1 Netlink接口--设置/获取设备属性

CAN设备必须使用netlink来配置。在\有对netlink消息类型的定义和简短描述。IPROUTE2工具集中的“ip”命令可以使用CAN的netlink支持,下面是使用示例:

- 设置CAN设备属性:

$ ip link set can0 type can help

Usage: ip link set DEVICE type can [ bitrate BITRATE [ sample-point SAMPLE-POINT] ] |

[ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1 phase-seg2 PHASE-SEG2 [ sjw SJW ] ] [ loopback { on | off } ]

[ listen-only { on | off } ] [ triple-sampling { on | off } ] [ restart-ms TIME-MS ] [ restart ]

Where: BITRATE := { 1..1000000 } SAMPLE-POINT := { 0.000..0.999 }

TQ := { NUMBER } PROP-SEG := { 1..8 } PHASE-SEG1 := { 1..8 } PHASE-SEG2 := { 1..8 } SJW := { 1..4 }

RESTART-MS := { 0 | NUMBER }

- 显示CAN设备的详情和统计信息:

$ ip -details -statistics link show can0

2: can0: mtu 16 qdisc pfifo_fast state UP qlen 10 link/can

can state ERROR-ACTIVE restart-ms 100 bitrate 125000 sample_point 0.875

tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 sja1000: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1 clock 8000000

re-started bus-errors arbit-lost error-warn error-pass bus-off 41 17457 0 41 42 41 RX: bytes packets errors dropped overrun mcast 140859 17608 17457 0 0 0 TX: bytes packets errors dropped carrier collsns 861 112 0 41 0 0

下面是上面一些名词的解释:

\

表示选中的CAN控制器的模式:LOOPBACK, LISTEN-ONLY, or TRIPLE-SAMPLING。

\

CAN控制器的当前状态:\\

\

自动重启的延时时间。如果设为非零值, 在总线关闭的情况下,在设定的数量毫秒后CAN控制器被自动触发。这个功能默认是关闭的。

\

使用bits/sec作为单位显示位时间并显示0.000~0.999的采样点位置。如果内核中使能了统计位时间的功能(CONFIG_CAN_CALC_BITTIMING=y),位时间可以使用\参数来设置。可选的\也是可以配置的。默认使用0.000这个推荐值。

\

以ns为单位显示时间份额(tq-time quanta)、传播段(prop-seg : propagation segment)、相位缓冲段1和2(phase-seg:phase buffer),以tq为单位显示同步跳转宽度(sjw:synchronisation jump width)。这些变量允许定义与硬件无关的位时序,这也是Bosch CAN 2.0 spec所推荐的(参考第八章http://www.semiconductors.bosch.de/pdf/can2spec.pdf)。

\ 显示CAN控制器的比特时序常量,这里的例子以sja1000为例。时间段(tseg -time segment)1和2的最小和最大值,以tq为单位的同步跳转宽度,比特速率的预分频器(brp--pre-scaler)和CAN系统时钟(以HZ为单位)。这些常量可以被用户空间的比特时序统计算法所使用。

\

显示重启的次数、总线和仲裁丢失错误,错误主动(error-warning)、错误被动(error-passive)、和总线关闭的状态变化。接收的过载错误在 统计信息的\域下面列出。

? 6.5.2 设置CAN的比特时序

CAN比特时序参数可以使用硬件无关的定义方法。这些参数是: \\和 \

$ ip link set canX type can tq 125 prop-seg 6 \\ phase-seg1 7 phase-seg2 2 sjw 1

在内核选项CONFIG_CAN_CALC_BITTIMING被使能的情况下,如果比特率(波特率)参数 \被设置了,CAN的这些参数将会生效:

$ ip link set canX type can bitrate 125000

请注意,这条命令在大部分使用标准波特率的CAN控制器上工作良好,但是使用一些少见的波特率值(如115000)和时钟频率值将会失败。禁用内核的

CONFIG_CAN_CALC_BITTIMING选项可以节省一些内存空间并且允许用户空间的命令工具完全的控制比特时序参数。使用CAN控制器的比特时序常量就可以达到这个目的(用户空间控制比特时序)。下面的命令将会列出这些变量:

$ ip -details link show can0 ...

sja1000: clock 8000000 tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1

?

6.5.3 启动和停止CAN网络设备

一个CAN网络设备可以使用\或者 \来开启和关闭。为了避免错误的默认值,必须在启动CAN设备之前设置它的比特时序参数:

$ ip link set canX up type can bitrate 125000

如果总线上出现太多的错误设备可能进入总线关闭状态(也就是从总线脱离)。进入总线关闭状态之后设备不会再发送和接收信息。给\设置一个非零值可以开启总线关闭自动恢复的功能(也就是进入总线关闭状态后重新开启),下面是一个示例: