CAN0-CAN7顺序会随机跳变的解决办法
配置:Nuvo-8208GC 序列号:M3807256
环境:Ubuntu 20.04.6 Kernel 5.15.0-67
Kvaser 驱动 V4.8 B4S1 驱动 V1.18
问题复现
- 通过cansend candump 重启几次测试,物理接口确实会随机跳转
变量测试
- 卸载其中一个CAN卡驱动,无效
- CAN驱动全部卸载,再重装驱动有效,先安装谁 谁就占到CAN0-CAN3 重要线索
优化测试效率
- 每做一次变量就要cansend candump 测试物理位置太麻烦了 怎么办?找方法!
$ lspci 找到CAN卡的设备id
$ ls /sys/class/net/ -al 可以映射出can0-can7对应的关系如下图 09:00.0 0a:00.0 是B4S1 ,0e:00.0是Kvaser
通过设备id 一眼就可以看出来can0-can7对应关系,高效多了
找厂家做伸手党
-
厂家给的方案
https://forum.peak-system.com/viewtopic.php?f=211&t=3281&p=15632&hilit=linux+Fixed+Channel#p15632 #Windows系统下修改顺序 https://forum.peak-system.com/viewtopic.php?f=218&t=6558&p=15448&hilit=linux+Fixed+Channel#p15448 #Linux 下修改顺序 #PEAK 对自己的PCAN熟悉,对SocketCAN不熟悉,给的链接也是针对PCAN API下的设置
2.厂家给的方案
修改run_egpc脚本来实现,类似如下图EMUC-B202下面的语句,但是EGPC-b4s1走的是PCIe的总线与B202架构不同并不能用 emucd_64 程序去指定
FAE表示可能要改动源码增加需求
-
Kvaser 没有技术对接
那就坚决不做伸手党,上网找资料
深度探讨一下对Linux内核PCI总线的看法https://zhuanlan.zhihu.com/p/479797913
修改网卡名启动顺序https://blog.csdn.net/qq_34438779/article/details/130612066
SocketCAN源码https://www.jianshu.com/p/655a0dabb7a4
设置网卡优先级https://blog.csdn.net/weixin_51792671/article/details/125379910?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-125379910-blog-130612066.235%5Ev38%5Epc_relevant_sort&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-125379910-blog-130612066.235%5Ev38%5Epc_relevant_sort&utm_relevant_index=1
实操
修改网卡名启动顺序https://blog.csdn.net/qq_34438779/article/details/130612066
以上确实把B4S1 改成bcan0 bcan1 了,但是仔细看B4S1和Kvaser设备名既然是同样的,B4S1有两个不同所以我只能改两个,Kvaser 4个都一样,这就没办法改了,只能改3个CAN口的名称,其他5个也还是会随机蹦迪 ,再走下去就要获取0x00 CAN的内存地址了,改命名规则这条路走不通了自闭一会,上个厕所,修修打印机,焊几片板子找找灵感。
围绕重要线索 实在不行就写个脚本卸载重装把
有请临时工modprobe命令 临时卸载再加载中间休息1秒钟,先加载谁谁就是CAN0-CAN3
kvaser_pciefd 和 f81601 是从哪里知道的,驱动代码和产品手册里有
#!/bin/bash
sudo modprobe -r kvaser_pciefd
sudo modprobe -r f81601
sudo modprobe f81601
sleep 1
sudo modprobe kvaser_pciefd
sudo ifconfig can0 down
sudo ifconfig can1 down
sudo ifconfig can2 down
sudo ifconfig can3 down
sudo ifconfig can4 down
sudo ifconfig can5 down
sudo ifconfig can6 down
sudo ifconfig can7 down
sudo ip link set can0 type can restart-ms 100
sudo ip link set can1 type can restart-ms 100
sudo ip link set can2 type can restart-ms 100
sudo ip link set can3 type can restart-ms 100
sudo ip link set can4 type can restart-ms 100
sudo ip link set can5 type can restart-ms 100
sudo ip link set can6 type can restart-ms 100
sudo ip link set can7 type can restart-ms 100
sudo ip link set can0 type can bitrate 1000000 sample-point 0.75
sudo ip link set can1 type can bitrate 1000000 sample-point 0.75
sudo ip link set can2 type can bitrate 1000000 sample-point 0.75
sudo ip link set can3 type can bitrate 1000000 sample-point 0.75
sudo ip link set can4 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can5 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can6 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can7 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can0 type can berr-reporting on
sudo ip link set can1 type can berr-reporting on
sudo ip link set can2 type can berr-reporting on
sudo ip link set can3 type can berr-reporting on
sudo ifconfig can0 txqueuelen 1000
sudo ifconfig can1 txqueuelen 1000
sudo ifconfig can2 txqueuelen 1000
sudo ifconfig can3 txqueuelen 1000
sudo tc qdisc add dev can0 root handle 1: pfifo
sudo tc qdisc add dev can1 root handle 1: pfifo
sudo tc qdisc add dev can2 root handle 1: pfifo
sudo tc qdisc add dev can3 root handle 1: pfifo
sudo ifconfig can0 up
sudo ifconfig can1 up
sudo ifconfig can2 up
sudo ifconfig can3 up
sudo ifconfig can4 up
sudo ifconfig can5 up
sudo ifconfig can6 up
sudo ifconfig can7 up
# reference:
# bitrate sample-point
# 1000000 0.75
# 800000 0.80
# 500000 0.875
# 250000 0.875
# 125000 0.875
# 100000 0.875
# 50000 0.875
# 20000 0.875
# 10000 0.875
再把脚本添加到开机自启动,然后看看时间可以准时下班。
$ sudo cronteb -e #2或3选择vim编辑器 添加以下内容 cronteb 有root权限执行脚本或程序比较方便
@reboot sudo bash /home/neousys/test.sh
重启测试整齐多了
还顺便把ACPI错误给去掉了,每次开机或系统日志就打印这个错误 客户问了好几次了这次终于也解决了
$ sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT='quiet splash loglevel=3
$ sudo update-grub