整理Github上文档里说明的关于如何安装CAN卡的部分,加粗斜体下划线为补充部分。
CAN卡型号 ─ ESD CAN-PCIe/402-B4
1.首先把跳线帽安到CAN卡相应的位置,之后把CAN卡插到工控机(IPC)的插槽里。
2.在IPC上装好Ubuntu、Apollo Kernel和GPU驱动之后,Build CAN驱动源代码。
在ESD官网上下载驱动,解压后cd到esdcan-pcie402-linux-x86_64-4.0.1目录下
cd src/
make -C /lib/modules/`uname -r`/build M=`pwd`
sudo make -C /lib/modules/`uname -r`/build M=`pwd` modules_install
检查esdcan-pcie402.ko驱动有没有被下载进/lib/modules/$(uname -r)/extra/.
3.测试ESD CAN 设备节点。
在终端生成CAN节点:
cd /dev
sudo mknod –-mode=a+rw can0 c 52 0
sudo mknod –-mode=a+rw can1 c 52 1
用ESD CAN 软件包里的测试程序测试节点。(测试前猜测应该连接CAN设备,比如设定发送CAN数据的STM32开发板之类的)
daijiaoshou的驱动安装与测试博客写了如何设定测试程序的参数:
在esdcan-pcie402-linux-x86_64-4.0.1/example/目录下执行:
gcc -o cantest cantest.c -lntcan
这里会遇到很多问题,比如ntcan.h找不到这类的,于是我干脆按照daijiaoshou的博客里写的那样,重新安装了一次can驱动
总结大致如下:
自己写一个black_pci.sh的脚本,并运行(内容见原博客)
进入驱动包,并编译
cd esdcan-pcie402-linux-2.6.x-x86_64-3.10.4
make
复制ntcan.h文件到/usr/local/include路径下
cd include/
sudo cp ntcan.h /usr/local/include
复制esdcan-pcie402-linux-2.6.x-x86_64-3.10.4/lib64下的libntcan.so.4.0.1动态链接库到/usr/local/lib目录下,并链接文件
cd esdcan-pcie402-linux-2.6.x-x86_64-3.10.4/lib64
sudo cp libntcan.so.4.0.1 /usr/local/lib
cd /usr/local/lib
sudo ldconfig -v -n /usr/local/lib
sudo ln -sfv libntcan.so.4 libntcan.so
打开一个新的终端,加载动态链接库
ldconfig -p | grep ntcan
cat /etc/ld.so.conf | grep /usr/local/lib
sudo sh -c "echo /usr/local/lib >> /etc/ld.so.conf“
sudo ldconfig
将前面make得到的esdcan-pcie402.ko文件拷贝到/lib/modules/$(uname -r)/kernel/drivers/pci目录下:
cd esdcan-pcie402-linux-2.6.x-x86_64-3.10.4/src
sudo cp esdcan-pcie402.ko /lib/modules/$(uname -r)/kernel/drivers/pci
再新打开一个终端,编译这个.ko文件
sudo depmod -a
sudo modprobe esdcan-pcie402
自己写一个98-esdcanpci.rules文件(内容和修改方法见原博客)
拷贝到/etc/udev/rules.d路径下,赋权并重启:
sudo cp 98-esdcanpci.rules /etc/udev/rules.d
chmod 777 98-esdcanpci.rules
sudo reboot
这时再一次重复之前提过的编译
在esdcan-pcie402-linux-x86_64-4.0.1/example/目录下执行:
gcc -o cantest cantest.c -lntcan
如果编译通过,说明CAN驱动已经安装成功 。在该目录下生成了cantest可执行文件,运行
./cantest 3 0 0x00 0xff 1 10 100 1000 5000 2 -1
参数说明:
3 -- canRead
0 -- net0
0x00 -- first-id 0x00
0xff -- last-id 0xff
1 -- count of CMSG-packets
10 -- txbuf (useless here)
100 -- rxbuf
1000 -- tx timeout every 1 second (useless here)
5000 -- rx timeout every 5 seconds
2 -- baud rate 500k bit/s
-1 -- count of ntcan-API-Calls, -1 is forever canRead the bus.
如果还是报错,比如说usr/bin/ld: 找不到 -lntcan之类的,我的解决办法是
locate ntcan
正常应该会显示/usr/local/include里有ntcan.h,因为我们之前复制过去了,如果没有的话,可以更新一下
sudo updatedb
如果发现没法与通过CAN卡通信,Apollo官方文档How to troubleshoot ESD CAN device给出如下解决方案:
首先确认加载了ESDCAN驱动
lsmod |grep can
正常应该看到有关内核驱动程序的信息,例如版本号。
然后确保CAN设备存在且具有正确的权限集
ls -l /dev/can0
检查内核日志
dmesg |grep -i can
检查syslog
grep -i can /var/log/syslog
查看上面两项有没有与CAN相关的错误消息。
如果没有错误信息,运行Apollo程序esdcan_test_app,
它将打印出详细的统计数据和状态信息。
运行这个程序的具体细节如下:
鹤资的调试笔记上总结了他的测试过程:
这个运行的测试程序,需要在docker中用bazel编译:
首先在apollo/third_party/can_card_library/esd_can路径下新建两个目录:lib,include
然后按照Apollo官方文档ESD CAN Library的方法,把ESD CAN软件包里到文件拷贝进去:
即,ntcan.h复制到include/,64-bit libntcan.so.4.0.1复制到lib/
添加必要的符号链接:
cd ./lib/;
ln -s libntcan.so.4.0.1 libntcan.so.4;
ln -s libntcan.so.4.0.1 libntcan.so.4.0
进入docker,然后用下面的命令进行编译:
cd modules/monitor/hardware/can/esdcan/esdcan_tools/
bazel build //modules/monitor/hardware/can/esdcan/esdcan_tools:esdcan_test_app
编译成功后在apollo/bazel-bin/modules/monitor/hardware/can/esdcan_tools/路径下有esdcan_test_app,执行该文件进行测试:
./esdcan_test_app --details=true
结果如图:
如果编译失败,比如找不到链接的文件,就用updatedb更新一下或者重新链接或者重启IPC
但是我重启IPC之后尝试打开dreamviewer失败了,于是进入docker重新编译了一次apollo:
bash apollo.sh build
等了很久之后编译成功,问题解决。
4.把IPC和车连接
为了和CAN通信,要把车上DB9线缆插到IPC上。(这一步也许可以在测试ESD CAN之前,直接用车发送CAN数据给IPC)