通道绑定
通道绑定机制为 Linux CAN 设备提供稳定且可预测的网络接口命名方案,确保设备在系统重启或重新插拔后保持一致的设备标识。SDK 支持三种绑定策略:驱动绑定、USB 端口绑定和设备 ID 绑定。
驱动绑定
驱动绑定通过自动生成和加载 udev 规则,基于驱动程序类型为设备分配统一的命名前缀。该方案适用于同类型设备的统一管理。
设置步骤
- 执行自动化配置脚本
sudo ./build.sh -rules该脚本将:
- 创建
/etc/udev/rules.d/99-kcan-driver.rules规则文件 - 配置基于
DRIVERS=="kcan"匹配规则 - 设置统一的
kcan% n命名格式(% n 为系统分配的序号)
- 设备重新枚举
执行完配置后,重新插拔 USB 设备以触发 udev 规则重新应用。
验证方法
绑定成功后,所有 kcan 驱动设备将以 kcan0、kcan1 等格式命名:
$ ip link show | grep kcan
3: kcan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
4: kcan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10特点
- 优势:配置简单
- 适用场景:设备数量较少且不需要特定映射关系的应用
- 局限性:设备命名顺序可能因硬件枚举顺序而变化
USB 端口绑定
原理
USB 端口绑定利用设备的物理 USB 拓扑结构信息(如总线地址、端口号)作为唯一标识符,实现设备与特定网络接口名称的永久映射。该方案提供基于物理位置的稳定命名。
实现步骤
1. 设备拓扑信息采集
使用 udevadm 工具获取目标设备的 USB 拓扑信息:
udevadm info -a -p /sys/class/net/can0
2. 自定义 udev 规则配置
创建或编辑 USB 绑定规则文件:
sudo vi /etc/udev/rules.d/99-kcan-usb.rules配置示例:
# 基于物理端口位置的设备绑定
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="kcan", \
KERNELS=="5-1.3:1.0", \
ATTR{dev_id}=="0x0", \
NAME="kcan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="kcan", \
KERNELS=="5-1.4:1.0", \
ATTR{dev_id}=="0x0", \
NAME="kcan1"配置参数说明:
KERNELS: USB 物理路径,确保设备插拔后名称不变DRIVERS=="kcan": 限定为 kcan 驱动设备NAME: 目标网络接口名称
3. udev 规则重载与验证
# 重载 udev 规则数据库
sudo udevadm control --reload-rules
# 触发设备重新枚举
sudo udevadm trigger --subsystem-match=net --action=add4. 绑定验证
验证设备是否正确绑定到指定端口:
# 检查网络接口状态
ip link show kcan0 kcan1
特点
- 优势:基于物理位置的高可靠性,不受设备更换影响
- 适用场景:固定部署环境,要求设备位置与名称严格对应
- 注意事项:USB 端口变更需要更新规则配置
设备 ID 绑定
原理
设备 ID 绑定机制通过在硬件层面为每个 CAN 控制器分配唯一的数字标识符,并配置驱动程序基于该 ID 进行设备命名。该方案提供最高级别的设备标识独立性,不受物理位置或枚举顺序影响。
实现步骤
1. 设备 ID 配置
使用 kcan-settings 实用工具为各设备通道分配唯一 ID:
# 为第一台设备分配 ID 66
kcan-settings -f=/dev/kcanusbfd32 -d 66
# 为第二台设备分配 ID 67
kcan-settings -f=/dev/kcanusbfd33 -d 67ID 分配原则:
- ID 范围:1-255(预留 0 作为特殊用途)
- 同一系统中 ID 必须唯一
- 建议采用连续分配便于管理
2. ID 配置验证
验证设备 ID 是否正确写入硬件:
# 查询当前设备 ID
kcan-settings -f=/dev/kcanusbfd32 -d3. 驱动参数配置
修改内核模块配置以启用基于 ID 的设备分配:
sudo vi /etc/modprobe.d/kcan.conf添加以下配置参数:
# 启用基于设备 ID 的命名分配机制
options kcan assign=devid4. 内核模块重新加载
# 卸载当前驱动模块
sudo rmmod kcan
# 重新加载并应用新配置
sudo modprobe kcan5. 绑定结果验证
重新枚举设备并验证绑定效果:
