最近有个新项目使用了TX2及开发板,因地盘通信采用CAN总线,初步查了手册,TX2自身就带了两路CAN外设,于是就放弃了之前USB2CAN的方案,直接使用TX2的CANBUS;特将操作步骤记录在此。
1.查询系统是否挂载了CAN外设
使用 lsmod 指令,该指令主要是用来查询内核当前正常挂载了哪些模块。通过man命令查询lsmod的用法;
当前主机内核挂载的模块如下:
可以到当前系统并未有与CAN相关的任何模块。TX2是为自动驾驶设计,都带了can外设不应该没有can模块,通过查询资料了解到,在linux内核中会将不常用的模块打包成.ko文件,方便使用者根据自身需求来添加。也就说,要是使用can,就必须手动添加can模块。依次执行以下指令:
modprobe can // 插入 can 总线子系统
modprobe can-raw //插入can 协议模块
modprobe can-bcm
modprobe can-gw
modprobe can_dev
modprobe mttcan
再次lsmod查询,可以发现CAN模块已经添加但内核了;
2.打开设备
挂载步骤只是给内核增加了这个外设,但外设并没有打开,所以还得继续。can也是一种网路接口,在linux下can的收发采用的是socket编程模式,所以可以通过ifconfig查询是否打开了can外设。本地查询如下:
这个时候我们就需要借助第三方开发包can-utils,安装方式如下:
git clone https://github.com/linux-can/can-utils.git
cd can-utils
make
sudo make install
接下来 就是打开外设:
sudo ip link set can0 type can bitrate 1000000 loopback on
sudo ip link set up can0
sudo ip link set can1 type can bitrate 1000000 loopback on
sudo ip link set up can1
再来查询,can外设已经正常打开了,如下:
有一点需要说明,这配置并未编译到内核,所以每次启动都会失效,最好的办法就是写成脚本,随系统启动。
3.添加自启动脚本
在ubuntu16.04和ubuntu14.04不一样,这里在16.04中实验成功的。
在/etc/init.d/目录创建自启动脚本,can_add_server .sh,输入内容如下(注意脚本格式,要求比较严格)
#!/bin/sh
### BEGIN INIT INFO
# Provides: land.sh
# Required-start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the svnd.sh daemon
# Description: starts svnd.sh using start-stop-daemon
### END INIT INFO
#任务脚本
modprobe can
modprobe can-raw
modprobe can-bcm
modprobe can-gw
modprobe can_dev
modprobe mttcan
sudo ip link set can0 type can bitrate 1000000 loopback on
sudo ip link set up can0
sudo ip link set can1 type can bitrate 1000000 loopback on
sudo ip link set up can1
#任务脚本
exit 0
修改文件权限:sudo chmod 755 can_add_server.sh;
然后执行:sudo update-rc.d can_add_server.sh defaults 95 (将脚本添加到启动项(95表示启动时间,越大表示启动越晚))
重启系统就可以看到效果。
接下来的会介绍如何使用第三方库can-utils 编写适合自己使用的收发代码。