Linux驱动开发|海思SS928/SD3403|can-utils工具移植

SocketCAN :SocketCAN 是 Linux 内核中的一个子系统,它提供了一个通用的抽象接口,允许用户空间应用程序通过套接字(socket)的方式与 CAN 总线进行交互。它实际上是一个在内核中实现的接口,用于处理 CAN 总线的底层操作,如发送和接收数据帧,设置过滤规则等。

can-utils :can-utils是一组用于控制和分析 CAN 总线的实用工具集合,这些工具运行在用户态空间。它们利用 SocketCAN 提供的套接字接口,通过内核和 CAN 接口进行通信,执行诸如监视、模拟、回放、发送数据等任务。

总体来说,SocketCAN 是 Linux 内核提供的一个 CAN 总线接口,而can-utils是运行在用户空间的工具集,可以通过 SocketCAN 提供的接口来操作 CAN 总线。

/*******************************************STEP1*******************************************/

编译环境所需要的工具:

libsocketcan-0.0.11.tar.bz2(编译canutils需要libsocketcan库支持)

canutils-4.0.6.tar.bz2

下载路径:

https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2 #4.0.6版本

将libsocketcan-0.0.11.tar.bz2,canutils-4.0.6.tar.bz2放在主机Linux系统目录下  


/*******************************************STEP2*******************************************/

解压libsocketcan文件,

进入libsocketcan-0.0.11目录,

并在libsocketcan-0.0.11目录下创建out文件夹:

tar -jxvf libsocketcan-0.0.11.tar.bz2
cd libsocketcan-0.0.11
mkdir out

在/libsocketcan-0.0.11目录下

配置编译环境(--host是指定交叉工具链,--prefix是指定库的生成位置):

./configure --prefix=/XXX/XXX/XXX/libsocketcan-0.0.11/out --host=aarch64-mix210-linux

编译安装:

make
make install 

查看out目录生成了几个目录文件,分别为includelibshare文件,libsocketcan部分编译完成

tips若需重新编译执行清楚编译产生的文件:

make clean -w
make distclean

/*******************************************STEP3*******************************************/

回到主目录解压canutils-4.0.6.tar.bz2,并新建out文件:

tar -jxvf canutils-4.0.6.tar.bz2
cd canutils-4.0.6
mkdir out

下载最新的配置文件:

wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'

↑替换掉/canutils-4.0.6/config/autoconf/config.guess

wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'

↑替换掉/canutils-4.0.6/config/autoconf/config.sub

执行configure命令(--host是指定交叉工具链,--prefix是指定库的生成位置,libsocketcan_LIBS是指定canconfig需要链接的库,LDFLAGS是指定外部库的路径,libsocketcan_CFLAGS是指定外部头文件的路径):

 ./configure --host=aarch64-mix210-linux --prefix=/XXX/XXX/XXX/canutils-4.0.6/out libsocketcan_LIBS=-lsocketcan LDFLAGS="-L/XXX/XXX/XXX/libsocketcan-0.0.11/out/lib/" libsocketcan_CFLAGS="-I/XXX/XXX/XXX/libsocketcan-0.0.11/out/include"

将/libsocketcan-0.0.11/include文件夹下的libsocketcan.hcan_netlink.h复制到canutils的include文件夹下:

cp ./libsocketcan-0.0.11/out/include/can_netlink.h ./canutils-4.0.6/include/
cp ./libsocketcan-0.0.11/out/include/libsocketcan.h ./canutils-4.0.6/include/

执行:

make
make install

(若需要重新编译参考step2的tips操作)

out文件夹下会生成一系列文件:

out/sbin目录下有canconfig工具

out/bin下有candump/canecho/cansend/cansequence四个工具


/*******************************************STEP4*******************************************/

将/libsocketcan和/canutils生成的文件拷贝到开发板/usr/local下对应的文件夹内 ,包括:

/libsocket-0.0.11/out/lib下的libsocketcan.so.2.3.0pkgconfig

(libsocketcan.so.2.3.0拷贝后还需要在开发板上创建两个软连接:libsocketcan.solibsocketcan.so.2,该类文件无法复制到Windows系统再复制进开发板,只能在Linux系统中创建

/cancanutils-4.0.6/out/下的binsbinlibshare

需要添加可执行权限:chmod +x filename


/*******************************************STEP5*******************************************/

配置好menuconfig后单独编译mcp251x.c的ko文件:

make -C ${KERNEL_DIR} ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- M=${CMAKE_CURRENT_BINARY_DIR} modules

打开/ko文件并加载mcp251x.ko:

insmod mcp251x.ko

运行dmesg查看系统日志信息,如果有以下或类似的报文表示模块加载成功:

can回环测试,无需外接can设备:

在一个当前终端下运行:

ip link set down can0
ip link set can0 type can loopback on
ip link set up can0
candump can0

新建一个终端运行:

cansend can0 -i 0x02 0x11 0x12

可以在第一个终端内看到:

其他can操作指令(iproute和can-utils):

关闭can0

ip link set can0 down / canconfig can0 stop

配置比特率

ip link set can0 type can bitrate 50000 / canconfig can0 bitrate 50000

配置采样点(通常情况下bitrate和samp-point的对应关系为:

bitrate>800k—75%,bitrate>500K—80%,bitrate<=500k—87.5%)

canconfig can0 bitrate 500000 sample-point 0.8

配置can0的控制模式为三次采样

canconfig can0 ctrlmode triple-sampling on

启动can0(报can0:ERROR-ACTIVE是正常的)

ip link set can0 up / canconfig can0 start

canconfig的其他配置可以运行

canconfig --help

canconfig <dev> bitrate { BR } [sample-point { SP }]:用于配置 CAN 总线接口的比特率和采样点。其中,<dev> 是 CAN 设备的名称,BR 是比特率的值(以 Hz 为单位),SP 是采样点的值(0 到 0.999,可选)。
canconfig <dev> bittiming [ VALs ]:用于配置 CAN 总线接口的比特定时参数。其中,<dev> 是 CAN 设备的名称,VALs 是一系列值,包括 tq(时间量子,以 ns 为单位)、prop-seg(传播段)、phase-seg1(相位段 1)、phase-seg2(相位段 2)和 sjw(同步跳转宽度,可选)。
canconfig <dev> restart-ms { RESTART-MS }:用于配置 CAN 总线接口的自动重启间隔。其中,<dev> 是 CAN 设备的名称,RESTART-MS 是自动重启的间隔时间(以毫秒为单位)。
canconfig <dev> ctrlmode { CTRLMODE }:用于配置 CAN 总线接口的控制模式。其中,<dev> 是 CAN 设备的名称,CTRLMODE 是一系列值,可以包括 loopback、listen-only、triple-sampling 和 berr-reporting,以及 on 或 off 来启用或禁用相应的模式。
canconfig <dev> {ACTION}:用于控制 CAN 总线接口的操作,包括 start(启动)、stop(停止)和 restart(重新启动)。
canconfig <dev> clockfreq:获取 CAN 总线接口的时钟频率信息。
canconfig <dev> bittiming-constants:获取 CAN 总线接口的比特定时参数常量。
canconfig <dev> berr-counter:获取 CAN 总线接口的错误计数器信息。

发送数据(-i指定can_id为 0x02,不指定默认为1)

cansend can0 -i 0x02 0x11 0x12

循环发送20次

cansend can0 -i 0x02 0x11 0x12 --loop=20

接收数据(阻塞接收)

candump can0

接收指定标识符的CAN帧数据--filter=id:mask(示例中0x11十六进制标识符,3是十进制掩码)

candump can0 --filter=0x11:3

掩码mask中的每个位与对应的id中的位进行逻辑与(AND)操作。如果mask的某个位为 1,那么对应的id位在匹配时必须匹配。如果mask的某个位为0,那么对应的id位在匹配时可以匹配也可以不匹配。

查看can0详细信息

ip -details link show can0

如果遇到:write: No buffer space available(没有足够的缓冲区空间来存储要发送的数据)

解决方法如下:

root@localhost:/sys/class/net/can0#
10
root@localhost:/sys/class/net/can0# echo 4096 > tx_queue_len 
root@localhost:/sys/class/net/can0# cat tx_queue_len
4096

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值