Apollo2.5开发笔记(1)安装CAN卡

整理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)

 

 

你可能感兴趣的:(apollo)