1.准备
要在linux下面配置和测试CAN,需要安装以下三个组件。
iproute2 (配置CAN接口时需要)
libsocketcan(使用CAN必须)
can-utils (CAN的测试小工具,linux下测试CAN比较好用应用程序)
iproute2
https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/
libsocketcan
https://public.pengutronix.de/software/libsocketcan/
can-utils
Index of /software/socket-can/canutils
一般下载最新版本即可。
三者下载完毕后,按以下步骤
截至博主编写此贴,最新版本为
libsocketcan-0.0.12.tar.bz2
canutils-4.0.6.tar.bz2
iproute2-4.4.0.tar.gz
2.编译
2.1编译libsocketcan-0.0.12.tar.bz2
2.1.1解压
tar -jxvf libsocketcan-0.0.12.tar.bz2
2.1.2编译
2.1.2.1 进入libsocketcan-0.0.12
cd libsocketcan-0.0.12/
2.1.2.2 创建编译文件存放文件out
编译时会产生文件,因此先创建编译文件存放文件out
mkdir out
2.1.2.3 编译
./configure --host=arm-buidroot-linux-gnueabihf --prefix=/home/cityhonor/linux-can/libsocketcan-0.0.12/out
其中arm-buidroot-linux-gnueabihf是开发板的编译工具 /home/cityhonor/linux-can/libsocketcan-0.0.12是解压libsocketcan-0.0.12后的绝对路径
2.1.2.4 make
make
2.1.2.5 安装
make install
编译完成后生成的库都在out/lib里,将这些库放到开发板的文件系统内,放在lib目录或usr/lib目录都可以
2.2编译canutils-4.0.6.tar.bz2
2.2.1解压canutils-4.0.6.tar.bz2
tar -jxvf canutils-4.0.6.tar.bz2
2.2.2创建编译文件存放文件
cd canutils-4.0.6 && mkdir out
2.2.3配置编译环境
./configure --host=arm-buidroot-linux-gnueabihf --prefix=/home/cityhonor/linux-can/canutils-4.0.6/out libsocketcan_LIBS=-lsocketcan LDFLAGS="-L /home/cityhonor/linux-can/libsocketcan-0.0.12/out/lib/" libsocketcan_CFLAGS="-I /home/cityhonor/linux-can/libsocketcan-0.0.12/out/include"
复制libsocketcan-0.0.12/include下libsocketcan.h和can_netlink.h到include下
cp /home/cityhonor/linux-can/libsocketcan-0.0.12/include/libsocketcan.h /home/cityhonor/linux-can/libsocketcan-0.0.12/include/can_netlink.h ./include/
2.2.4编译安装
make
make install
out文件夹下回生成一堆文件,out/sbin目录下有canconfig工具,out/bin下有candump/canecho/cansend/cansequence四个工具,将out文件夹放置在开发板上即可使用
3.1移植iproute2(若开发板已支持iproute2,可跳过此步骤)
有两个方法
1.通过构建文件系统时在network添加支持iproute2(应用开发人员可能需要花费较多时间)
2.编译替换ip(介绍此方法)
tar -vxzf iproute2-4.4.0.tar.gz
3.1.1 解压tar -vxzf iproute2-4.4.0.tar.gz
3.1.2 设置编译工具
解压完成以后会得到一个名为“iproute2-4.4.0”的目录,进入此目录中,打开 Makefile 并
修改。在 Makefile 中找到下面这行:
CC := gcc 更改为arm-buildroot-linux-gnueabihf-gcc
arm-buildroot-linux-gnueabihf-gcc为板子编译工具
3.1.3 编译
在Makefile同级目录执行make
在Makefile同级目录产生ip文件里面有新的ip命令
3.1.4替换(注意,替换需谨慎)
通过网络挂载文件,拷贝到挂载点后(此处不介绍挂载),在目标开发板确认ip命令版本
cp -f ip /nfs_mount/
进入板子挂载点存放ip命令的路径
执行./ip -V
确认无误后替换掉sbin/ip
cp -f ip /sbin/ip
即可执行
附上can-utils 命令解析
* Examples:
*
* 123# -> standard CAN-Id = 0x123, len = 0
* 12345678# -> extended CAN-Id = 0x12345678, len = 0
* 123#R -> standard CAN-Id = 0x123, len = 0, RTR-frame
* 123#R0 -> standard CAN-Id = 0x123, len = 0, RTR-frame
* 123#R7 -> standard CAN-Id = 0x123, len = 7, RTR-frame
* 123#R8_9 -> standard CAN-Id = 0x123, len = 8, dlc = 9, RTR-frame
* 7A1#r -> standard CAN-Id = 0x7A1, len = 0, RTR-frame
*
* 123#00 -> standard CAN-Id = 0x123, len = 1, data[0] = 0x00
* 123#1122334455667788 -> standard CAN-Id = 0x123, len = 8
* 123#1122334455667788_E -> standard CAN-Id = 0x123, len = 8, dlc = 14
* 123#11.22.33.44.55.66.77.88 -> standard CAN-Id = 0x123, len = 8
* 123#11.2233.44556677.88 -> standard CAN-Id = 0x123, len = 8
* 32345678#112233 -> error frame with CAN_ERR_FLAG (0x2000000) set
*
* 123##0112233 -> CAN FD frame standard CAN-Id = 0x123, flags = 0, len = 3
* 123##1112233 -> CAN FD frame, flags = CANFD_BRS, len = 3
* 123##2112233 -> CAN FD frame, flags = CANFD_ESI, len = 3
* 123##3 -> CAN FD frame, flags = (CANFD_ESI | CANFD_BRS), len = 0
* ^^
* CAN FD extension to handle the canfd_frame.flags content