目录
⑥把bzImage复制到WSL系统外并且添加配置文件告诉WSL它在哪
I. 前言
在windows下用串口调试电机,但是想用ROS写程序然后用CAN发出来,遂搞一下WSL下面的CAN通讯。WSL2本质上也是虚拟机,当时觉得能装NVIDIA显卡驱动才用的它(并舍弃了Virtualbox),结果显卡驱动还是一堆坑
注意:这个教程只适用于WSL2,不适用于WSL1
1. 操作系统、USB转CAN
win10+WSL2+Ubuntu 20.04
canable(一个开源的usb转can项目,硬件某宝,软件自己烧)老版本,webdfu烧录的slcan或candlelight固件
II. 流程
1. canable通过网页webdfu烧录程序
(1)参考链接:
Access Denied in device.open : Webusb · Issue #184 · WICG/webusb · GitHub
(2)目标:在Updater - CANable网页在线烧录canable的usb转can的固件
(3)报错:SecurityError: Failed to execute 'open' on 'USBDevice': Access denied.
(4)原因:usb驱动不对,用Zadig - USB driver installation made easy更新一下驱动,
①选择插入canable的那个端口,②目标驱动选成winUSB,③点一下install,完事
注意,装完了记的重启windows
2. WSL2使用windows下的USB接口
(1)参考链接:
WSL support · dorssel/usbipd-win Wiki · GitHub
Connecting USB devices to WSL - Windows Command Line(命令操作有点过时)
(2)目标:
让windows下的USB在WSL2下能够识别,比如直接enumerate为一个can设备或者是在/dev下有ttyACM0,要能在lsusb命令下显示
(3)方法:
安装usbipd,windows直接github上这里下载即可;
WSL2里面运行
sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
然后就可以得到上图的结果。在WSL2开启的情况下,在windows下运行usbipd wsl attach --busid 几-几,然后ubuntu下面lsusb就有了
3. WSL2使能CAN驱动
(1)参考链接:
Add SocketCAN support · Issue #5533 · microsoft/WSL · GitHub
(2)目标:
kernel是系统的内核,ubuntu的内核本来是可以支持can通讯的,但是WSL的内核并没有使能它。可以通过修改配置文件并重新编译,然后安装的方式让它支持can,并不需要添加什么额外代码。
(3)方法:
①备份原来的WSL,
出了问题可以再wsl --import回来
wsl --export <current-distro> <temporary-path>\备份叫啥都行.tar或.bak
current-distro是运行wsl --list --verbose后显示的WSL系统的名字,如microsoft store安装的叫Ubuntu-20.04;temporary-path随便设,但是备份一般10G往上,所以建议找个空间大的盘
②查看内核版本
uname -r
输出内核版本,如我是5.15.90.1-microsoft-standard-WSL2
③下载wsl内核源码,切到内核版本的分支
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-5.15.90.1
④修改配置文件
a. 基于系统里面有的配置文件为基础,在git clone得到的文件夹里面创建一个.config文件,不要直接新建
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config
或者(但我没试过)
cp Microsoft/config-wsl .config
b. 图形化方法改配置文件
sudo make menuconfig
上下左右移动,enter下一级,esc退出
在Networking support--->CAN BUS subsystem support下面,按M把他们都变成module,把能选的全选了,按M没反应变不成module的就按y让它变成build-in的;
--->子菜单进去也要都选,子菜单的子菜单里面也要选,不能只选外面那个,里面也要选
然后最下面save,命名为.config
可以手动改一下文件里面的:CONFIG_LOCALVERSION="-microsoft-standard-WSL2"选项,改成别的随便什么名字,好区分
⑤编译并安装
a. 安装依赖
sudo apt update
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
b. 编译运行,过程中提示还缺什么装什么即可,我没遇到很麻烦的报错
getconf _NPROCESSORS_ONLN # 看下几个核
sudo make -j 10
sudo make modules_install
sudo make install
c. make install报错
ERROR (dkms apprt): kernel package linux-header-5.x is not supported
参考19.04 - dkms apport error for Kernel 5.x - Ask Ubuntu
内核5.x的install的时候要把老子刚刚花了半天装上的the f**king nvidia driver再给卸喽,然后就好了
⑥把bzImage复制到WSL系统外并且添加配置文件告诉WSL它在哪
cp arch/x86/boot/bzImage /mnt/c/Users/windows你的用户名/新的bzImage随便叫什么名字
然后在c/Users/路径下创建.wslconfig文件,以文本方式打开并键入:
[wsl2]
kernel=C:\\Users\\xxxxx\\刚刚bzImage的名字不带后缀
4. 测试
windows下:
wsl --shutdown
wsl # 重启ubuntu
WSL里面:
uname -r # 应该能看到自己起的CONFIG_LOCALVERSION
lsusb # 要能看到插入的usb转can,是ttyACM0或者gs_usb之类的,不然是usbipd没装对
sudo apt install can-utils
sudo modprobe can
sudo modprobe can-raw
# 如果是slcan的固件
sudo modprobe slcan
sudo slcand -o -c -s0 /dev/ttyACM0 can0
sudo ifconfig can0 up
ifconfig # 应该能看到can0了
sudo ifconfig can0 txqueuelen 1000
cansend can0 999#DEADBEEF # Send a frame to 0x999 with payload 0xdeadbeef
candump can0 # Show all traffic received by can0
# 如果用的是candlelight
sudo modeprobe gs_usb
ip link set can0 up type can bitrate 500000
ifconfig # 应该能看到can0了