-
Notifications
You must be signed in to change notification settings - Fork 727
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
can-j1939-install-kernel-module: convert to Unix line endings and rem…
…ove trailing whitespace
- Loading branch information
1 parent
06561ac
commit 24e0c52
Showing
1 changed file
with
180 additions
and
180 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,180 +1,180 @@ | ||
# can-j1939 kernel module installation # | ||
|
||
|
||
|
||
### 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: | ||
|
||
```bash | ||
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 | ||
``` | ||
|
||
and also this: | ||
|
||
```bash | ||
avra@vm-debian:~/can/can-utils$ testj1939 | ||
testj1939: socket(j1939): Protocol not supported | ||
``` | ||
|
||
|
||
|
||
### 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. | ||
|
||
|
||
|
||
#### 1. Download kernel source #### | ||
|
||
We will download Debian patched kernel 5.8. First update your sources | ||
|
||
``` | ||
avra@vm-debian:~$ sudo apt update | ||
``` | ||
|
||
and then look at available Debian patched kernel source packages | ||
|
||
``` | ||
avra@vm-debian:~$ apt-cache search linux-source | ||
linux-source-4.19 - Linux kernel source for version 4.19 with Debian patches | ||
linux-source - Linux kernel source (meta-package) | ||
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.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.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 | ||
|
||
``` | ||
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) | ||
|
||
``` | ||
deb 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-src http://deb.debian.org/debian/ buster main contrib non-free | ||
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 | ||
|
||
``` | ||
sudo apt install linux-source-5.8 | ||
``` | ||
|
||
and unpack it | ||
``` | ||
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$ cd linux-source-5.8 | ||
``` | ||
|
||
|
||
|
||
#### 2. Add can-j1939 module to kernel #### | ||
|
||
First we need some packages for **menuconfig** | ||
|
||
``` | ||
sudo apt-get install libncurses5 libncurses5-dev | ||
``` | ||
|
||
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 make menuconfig | ||
``` | ||
|
||
where we enable SAE J1939 kernel module as shown | ||
|
||
``` | ||
- Networking Support | ||
- Can bus subsystem support | ||
- <M> SAE J1939 | ||
``` | ||
|
||
Now edit **/usr/src/linux-source-5.8/.config**, find CONFIG_SYSTEM_TRUSTED_KEYS, change it as following | ||
``` | ||
CONFIG_SYSTEM_TRUSTED_KEYS="" | ||
``` | ||
|
||
and save the file. | ||
|
||
|
||
|
||
#### 3. Compile and install kernel and modules | ||
|
||
We will have to download necessary packages | ||
|
||
``` | ||
sudo apt install build-essential libssl-dev libelf-dev bison flex | ||
``` | ||
|
||
compile kernel (using threads to make it faster) | ||
|
||
``` | ||
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make -j $(nproc) | ||
``` | ||
|
||
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 | ||
``` | ||
|
||
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 reboot | ||
``` | ||
|
||
Check if installation is correct with | ||
|
||
``` | ||
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: | ||
|
||
``` | ||
sudo insmod /lib/modules/5.8.10/kernel/net/can/j1939/can-j1939.ko | ||
``` | ||
|
||
If it does then all you need to do is | ||
|
||
``` | ||
sudo depmod -av | ||
``` | ||
|
||
reboot once, and **modprobe** command from the above should finally work. | ||
|
||
|
||
|
||
#### 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 | ||
|
||
``` | ||
nano /usr/include/linux/can.h | ||
``` | ||
|
||
If in the struct **sockaddr_can** you don’t 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/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! | ||
# can-j1939 kernel module installation # | ||
|
||
|
||
|
||
### 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: | ||
|
||
```bash | ||
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 | ||
``` | ||
|
||
and also this: | ||
|
||
```bash | ||
avra@vm-debian:~/can/can-utils$ testj1939 | ||
testj1939: socket(j1939): Protocol not supported | ||
``` | ||
|
||
|
||
|
||
### 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. | ||
|
||
|
||
|
||
#### 1. Download kernel source #### | ||
|
||
We will download Debian patched kernel 5.8. First update your sources | ||
|
||
``` | ||
avra@vm-debian:~$ sudo apt update | ||
``` | ||
|
||
and then look at available Debian patched kernel source packages | ||
|
||
``` | ||
avra@vm-debian:~$ apt-cache search linux-source | ||
linux-source-4.19 - Linux kernel source for version 4.19 with Debian patches | ||
linux-source - Linux kernel source (meta-package) | ||
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.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.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 | ||
|
||
``` | ||
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) | ||
|
||
``` | ||
deb 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-src http://deb.debian.org/debian/ buster main contrib non-free | ||
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 | ||
|
||
``` | ||
sudo apt install linux-source-5.8 | ||
``` | ||
|
||
and unpack it | ||
``` | ||
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$ cd linux-source-5.8 | ||
``` | ||
|
||
|
||
|
||
#### 2. Add can-j1939 module to kernel #### | ||
|
||
First we need some packages for **menuconfig** | ||
|
||
``` | ||
sudo apt-get install libncurses5 libncurses5-dev | ||
``` | ||
|
||
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 make menuconfig | ||
``` | ||
|
||
where we enable SAE J1939 kernel module as shown | ||
|
||
``` | ||
- Networking Support | ||
- Can bus subsystem support | ||
- <M> SAE J1939 | ||
``` | ||
|
||
Now edit **/usr/src/linux-source-5.8/.config**, find CONFIG_SYSTEM_TRUSTED_KEYS, change it as following | ||
``` | ||
CONFIG_SYSTEM_TRUSTED_KEYS="" | ||
``` | ||
|
||
and save the file. | ||
|
||
|
||
|
||
#### 3. Compile and install kernel and modules | ||
|
||
We will have to download necessary packages | ||
|
||
``` | ||
sudo apt install build-essential libssl-dev libelf-dev bison flex | ||
``` | ||
|
||
compile kernel (using threads to make it faster) | ||
|
||
``` | ||
avra@vm-debian:/usr/src/linux-source-5.8$ sudo make -j $(nproc) | ||
``` | ||
|
||
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 | ||
``` | ||
|
||
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 reboot | ||
``` | ||
|
||
Check if installation is correct with | ||
|
||
``` | ||
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: | ||
|
||
``` | ||
sudo insmod /lib/modules/5.8.10/kernel/net/can/j1939/can-j1939.ko | ||
``` | ||
|
||
If it does then all you need to do is | ||
|
||
``` | ||
sudo depmod -av | ||
``` | ||
|
||
reboot once, and **modprobe** command from the above should finally work. | ||
|
||
|
||
|
||
#### 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 | ||
|
||
``` | ||
nano /usr/include/linux/can.h | ||
``` | ||
|
||
If in the struct **sockaddr_can** you don’t 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/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! |