Merge pull request #568 from marckleinebudde/j1939

can-j1939-install-kernel-module: convert to Unix line endings and remove trailing whitespace
pull/571/head
Marc Kleine-Budde 2024-12-11 15:02:35 +01:00 committed by GitHub
commit fc1f6979c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 180 additions and 180 deletions

View File

@ -1,180 +1,180 @@
# can-j1939 kernel module installation # # can-j1939 kernel module installation #
### Problem ### Problem
You already have **can0** or **vcan0** up and working, **can-utils** downloaded and compiled to **~/can/can-utils** and you can send and receive frames without problems. However, when you want to bring up **can-j1939** you get error like this: You already have **can0** or **vcan0** up and working, **can-utils** downloaded and compiled to **~/can/can-utils** and you can send and receive frames without problems. However, when you want to bring up **can-j1939** you get error like this:
```bash ```bash
avra@vm-debian:~/can/can-utils$ sudo modprobe can-j1939 avra@vm-debian:~/can/can-utils$ sudo modprobe can-j1939
modprobe: FATAL: Module can-j1939 not found in directory /lib/modules/5.7.0.0.bpo.2-amd64 modprobe: FATAL: Module can-j1939 not found in directory /lib/modules/5.7.0.0.bpo.2-amd64
``` ```
and also this: and also this:
```bash ```bash
avra@vm-debian:~/can/can-utils$ testj1939 avra@vm-debian:~/can/can-utils$ testj1939
testj1939: socket(j1939): Protocol not supported testj1939: socket(j1939): Protocol not supported
``` ```
### Solution ### Solution
Above errors mean that **can-j1939** was not enabled in your kernel and you need to compile it manually. There are several ways to do it. Any Linux kernel since 5.4 has **can-j1939** module, but you will probably want to install fresher version, which leads to downloading kernel sources, enabling **can-j1939** module, recompiling kernel and installing it. I will be using Debian 10.5 x64 (buster testing) virtual machine. Above errors mean that **can-j1939** was not enabled in your kernel and you need to compile it manually. There are several ways to do it. Any Linux kernel since 5.4 has **can-j1939** module, but you will probably want to install fresher version, which leads to downloading kernel sources, enabling **can-j1939** module, recompiling kernel and installing it. I will be using Debian 10.5 x64 (buster testing) virtual machine.
#### 1. Download kernel source #### #### 1. Download kernel source ####
We will download Debian patched kernel 5.8. First update your sources We will download Debian patched kernel 5.8. First update your sources
``` ```
avra@vm-debian:~$ sudo apt update avra@vm-debian:~$ sudo apt update
``` ```
and then look at available Debian patched kernel source packages and then look at available Debian patched kernel source packages
``` ```
avra@vm-debian:~$ apt-cache search linux-source avra@vm-debian:~$ apt-cache search linux-source
linux-source-4.19 - Linux kernel source for version 4.19 with Debian patches linux-source-4.19 - Linux kernel source for version 4.19 with Debian patches
linux-source - Linux kernel source (meta-package) linux-source - Linux kernel source (meta-package)
linux-source-5.4 - Linux kernel source for version 5.4 with Debian patches linux-source-5.4 - Linux kernel source for version 5.4 with Debian patches
linux-source-5.5 - Linux kernel source for version 5.5 with Debian patches linux-source-5.5 - Linux kernel source for version 5.5 with Debian patches
linux-source-5.6 - Linux kernel source for version 5.6 with Debian patches linux-source-5.6 - Linux kernel source for version 5.6 with Debian patches
linux-source-5.7 - Linux kernel source for version 5.7 with Debian patches linux-source-5.7 - Linux kernel source for version 5.7 with Debian patches
linux-source-5.8 - Linux kernel source for version 5.8 with Debian patches linux-source-5.8 - Linux kernel source for version 5.8 with Debian patches
``` ```
If kernel 5.8 does not show in your linux-sources list (it shows above in mine since I have already upgraded stock 4.19 kernel to backported 5.7), then you will need to add backports to your sources list. It is best to do it like this If kernel 5.8 does not show in your linux-sources list (it shows above in mine since I have already upgraded stock 4.19 kernel to backported 5.7), then you will need to add backports to your sources list. It is best to do it like this
``` ```
echo 'deb http://deb.debian.org/debian buster-backports main contrib' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list echo 'deb http://deb.debian.org/debian buster-backports main contrib' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
``` ```
Alternatively, or in case you have problems with installation of some packages, or you just want to have everything in a single list, here is what my **/etc/apt/sources.list** looks like (you will need to append at least last line to yours) Alternatively, or in case you have problems with installation of some packages, or you just want to have everything in a single list, here is what my **/etc/apt/sources.list** looks like (you will need to append at least last line to yours)
``` ```
deb http://security.debian.org/debian-security buster/updates main contrib deb http://security.debian.org/debian-security buster/updates main contrib
deb-src http://security.debian.org/debian-security buster/updates main contrib deb-src http://security.debian.org/debian-security buster/updates main contrib
deb http://deb.debian.org/debian/ buster main contrib non-free deb http://deb.debian.org/debian/ buster main contrib non-free
deb-src http://deb.debian.org/debian/ buster main contrib non-free deb-src http://deb.debian.org/debian/ buster main contrib non-free
deb http://deb.debian.org/debian buster-backports main contrib deb http://deb.debian.org/debian buster-backports main contrib
``` ```
After adding backports in one way or another, try **sudo apt update** again, and after that **apt-cache search linux-source** should show kernel 5.8 in the list, so you can install it's source package After adding backports in one way or another, try **sudo apt update** again, and after that **apt-cache search linux-source** should show kernel 5.8 in the list, so you can install it's source package
``` ```
sudo apt install linux-source-5.8 sudo apt install linux-source-5.8
``` ```
and unpack it and unpack it
``` ```
avra@vm-debian:~$ cd /usr/src avra@vm-debian:~$ cd /usr/src
avra@vm-debian:/usr/src$ sudo tar -xaf linux-source-5.8.tar.xz avra@vm-debian:/usr/src$ sudo tar -xaf linux-source-5.8.tar.xz
avra@vm-debian:/usr/src$ cd linux-source-5.8 avra@vm-debian:/usr/src$ cd linux-source-5.8
``` ```
#### 2. Add can-j1939 module to kernel #### #### 2. Add can-j1939 module to kernel ####
First we need some packages for **menuconfig** First we need some packages for **menuconfig**
``` ```
sudo apt-get install libncurses5 libncurses5-dev sudo apt-get install libncurses5 libncurses5-dev
``` ```
copy and use our old configuration to run **menuconfig** copy and use our old configuration to run **menuconfig**
``` ```
avra@vm-debian:/usr/src/linux-source-5.8$ sudo cp /boot/config-$(uname -r) .config avra@vm-debian:/usr/src/linux-source-5.8$ sudo cp /boot/config-$(uname -r) .config
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make menuconfig avra@vm-debian:/usr/src/linux-source-5.8$ sudo make menuconfig
``` ```
where we enable SAE J1939 kernel module as shown where we enable SAE J1939 kernel module as shown
``` ```
- Networking Support - Networking Support
- Can bus subsystem support - Can bus subsystem support
- <M> SAE J1939 - <M> SAE J1939
``` ```
Now edit **/usr/src/linux-source-5.8/.config**, find CONFIG_SYSTEM_TRUSTED_KEYS, change it as following Now edit **/usr/src/linux-source-5.8/.config**, find CONFIG_SYSTEM_TRUSTED_KEYS, change it as following
``` ```
CONFIG_SYSTEM_TRUSTED_KEYS="" CONFIG_SYSTEM_TRUSTED_KEYS=""
``` ```
and save the file. and save the file.
#### 3. Compile and install kernel and modules #### 3. Compile and install kernel and modules
We will have to download necessary packages We will have to download necessary packages
``` ```
sudo apt install build-essential libssl-dev libelf-dev bison flex sudo apt install build-essential libssl-dev libelf-dev bison flex
``` ```
compile kernel (using threads to make it faster) compile kernel (using threads to make it faster)
``` ```
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make -j $(nproc) avra@vm-debian:/usr/src/linux-source-5.8$ sudo make -j $(nproc)
``` ```
install install
``` ```
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make modules_install avra@vm-debian:/usr/src/linux-source-5.8$ sudo make modules_install
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make install avra@vm-debian:/usr/src/linux-source-5.8$ sudo make install
``` ```
and update grub and update grub
``` ```
avra@vm-debian:/usr/src/linux-source-5.8$ sudo update-grub avra@vm-debian:/usr/src/linux-source-5.8$ sudo update-grub
avra@vm-debian:/usr/src/linux-source-5.8$ sudo reboot avra@vm-debian:/usr/src/linux-source-5.8$ sudo reboot
``` ```
Check if installation is correct with Check if installation is correct with
``` ```
sudo modprobe can-j1939 sudo modprobe can-j1939
``` ```
and if you get no error then you can enjoy **can-j1939**. If you get some error then you might check if this alternative command works: and if you get no error then you can enjoy **can-j1939**. If you get some error then you might check if this alternative command works:
``` ```
sudo insmod /lib/modules/5.8.10/kernel/net/can/j1939/can-j1939.ko sudo insmod /lib/modules/5.8.10/kernel/net/can/j1939/can-j1939.ko
``` ```
If it does then all you need to do is If it does then all you need to do is
``` ```
sudo depmod -av sudo depmod -av
``` ```
reboot once, and **modprobe** command from the above should finally work. reboot once, and **modprobe** command from the above should finally work.
#### 4. Install headers if needed #### 4. Install headers if needed
You might have a problem with headers not being updated. To check that open file **/usr/include/linux/can.h** with You might have a problem with headers not being updated. To check that open file **/usr/include/linux/can.h** with
``` ```
nano /usr/include/linux/can.h nano /usr/include/linux/can.h
``` ```
If in the struct **sockaddr_can** you dont see **j1939**, then header files did not upgrade and you need to do it manually If in the struct **sockaddr_can** you dont see **j1939**, then header files did not upgrade and you need to do it manually
``` ```
sudo cp /usr/src/linux-source-5.8/include/uapi/linux/can.h /usr/include/linux/can.h sudo cp /usr/src/linux-source-5.8/include/uapi/linux/can.h /usr/include/linux/can.h
sudo cp /usr/src/linux-source-5.8/include/uapi/linux/can/j1939.h /usr/include/linux/can/ sudo cp /usr/src/linux-source-5.8/include/uapi/linux/can/j1939.h /usr/include/linux/can/
``` ```
That is the minimum for compiling some **J1939** C code, but you might want to upgrade other header files as well. That's up to you. Enjoy! That is the minimum for compiling some **J1939** C code, but you might want to upgrade other header files as well. That's up to you. Enjoy!