Difference between revisions of "Build drivers from source for rpi"

From wiki_veye
Jump to navigation Jump to search
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
[[Build drivers from source for rpi/zh|查看中文]]
 
[[Build drivers from source for rpi/zh|查看中文]]
  
The main resources in this section are the [https://www.raspberrypi.org/documentation/linux/kernel/building.md official piOS building method]. We use the method of cross-compilation, and the 5.4.72 version of 32bitOS is taken as an example.
+
The main resources in this section are the [https://www.raspberrypi.org/documentation/linux/kernel/building.md official piOS building method].  
  
 +
We provide methods to compile locally on Raspberry Pi and cross-compile on PC. It is recommended to use Raspberry Pi local compilation, which is simpler and faster.
 +
 +
=== Building the Drivers Locally ===
 +
The following operations are performed on the Raspberry Pi.
 +
 +
The following is an example of piOS 5.15.32.
 +
 +
==== Prepare environment ====
 +
<code>sudo apt install git bc bison flex libssl-dev make</code>
 +
 +
==== Download the kernel headers for the local piOS ====
 +
<code>sudo apt install raspberrypi-kernel-headers</code>
 +
 +
====Download drivers code from veye ====
 +
<code>git clone <nowiki>https://github.com/veyeimaging/raspberrypi_v4l2.git</nowiki></code>
 +
 +
==== Confirm the version of piOS on your own Raspberry Pi ====
 +
<code>$ uname -a</code>
 +
 +
<code>Linux raspberrypi 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux</code>
 +
 +
==== Compile drivers ====
 +
<code>cd ~/raspberrypi_v4l2/driver_source/cam_drv_src/rpi-5.15_all</code>
 +
 +
<code>make</code>
 +
 +
Done.
 +
 +
==== Compile dts ====
 +
<code>cd ~/raspberrypi_v4l2/driver_source/dts/rpi-5.15.y</code>
 +
 +
<code>./build_dtbo.sh</code>
 +
 +
Done.
 +
 +
==== Common errors ====
 +
 +
===== Missing build directory =====
 +
<code>make[1]: *** /lib/modules/[version]/build: No such file or directory. Stop.</code>
 +
 +
The cmd <code>sudo apt install raspberrypi-kernel-headers</code> will simply install the latest kernel headers available on the mirror. Which indeed matches the latest available kernel on the mirror. But not necessarily the installed kernel on the system.
 +
 +
The Raspbian maintainers always remove the older kernel headers from the repository index files. Not sure why they do that.
 +
 +
Solutions:
 +
 +
====== 1. Upgrade piOS, and build again. ======
 +
<code>sudo apt update</code>
 +
 +
<code>sudo apt full-upgrade</code>
 +
 +
<code>sudo apt install raspberrypi-kernel-headers</code>
 +
 +
Specifically, for the Raspberry Pi 4 series, 32-bit PiOS will automatically switch to 64-bit mode after upgrading to the latest version. However, the raspberrypi-kernel-headers package is missing the build directory for the v8+ mode.
 +
 +
For example:
 +
 +
<code>$ uname -a</code>
 +
 +
<code>Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux</code>
 +
 +
There is no build directory under <code>/lib/modules/6.1.21-v8+/</code>.
 +
 +
If this happens, you can add <code>arm_64bit=0</code> to the <code>/boot/config.txt</code> file and then restart the Raspberry Pi to switch back to 32-bit mode.
 +
 +
====== 2. Install specific version kernel headers. ======
 +
Download the deb package for the version of piOS you are currently using from this [https://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/ link] and install it.
 +
 +
For tag name, please determine according to the local piOS version and raspberrypi OS [https://github.com/raspberrypi/linux/tags tags].
 +
 +
====== 3. Use rpi-source ======
 +
Use rpi-source from <nowiki>https://github.com/RPi-Distro/rpi-source</nowiki> it sets up everything you need to build your own kernel (from the current running kernel by default).
 +
=== Cross-Compiling the Drivers ===
 
The following operations are done on ubuntu PC.
 
The following operations are done on ubuntu PC.
====Build cross-compilation environment on Ubuntu 64-bitoperating system)====
+
====Build cross-compilation environment on Ubuntu 64-bit operating system)====
 
<code>sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev</code>
 
<code>sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev</code>
  
Line 44: Line 117:
 
https://github.com/raspberrypi/linux/tags
 
https://github.com/raspberrypi/linux/tags
 
====Patch our  code to kernel====
 
====Patch our  code to kernel====
 +
<code>git clone <nowiki>https://github.com/veyeimaging/raspberrypi_v4l2.git</nowiki></code>
  
 
*Driver source code
 
*Driver source code
Line 61: Line 135:
 
Modify the Makefile in the same path,add the corresponding dts compilation option.
 
Modify the Makefile in the same path,add the corresponding dts compilation option.
 
====Building====
 
====Building====
====Preparing====
+
=====Preparing=====
  
 
*For Raspberry Pi 1, Zero and Zero W, and Raspberry Pi Compute Module 1 default (32-bit only) build configuration
 
*For Raspberry Pi 1, Zero and Zero W, and Raspberry Pi Compute Module 1 default (32-bit only) build configuration
Line 86: Line 160:
  
 
<code>make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig</code>
 
<code>make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig</code>
====Add compilation options====
+
=====Add compilation options=====
  
 
*32-bit version
 
*32-bit version
Line 108: Line 182:
  
 
<code>make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j4</code>
 
<code>make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j4</code>
===Frequently Questions===
+
===Install the compiled driver===
 +
Once compiled, you get the specified version of the driver and dtbo file.
 +
 
 +
Refer to [[V4L2 mode for Raspberry Pi#Driver Installation|How to install driver]],
 +
 
 +
<code>wget <nowiki>https://github.com/veyeimaging/raspberrypi_v4l2/releases/latest/download/raspberrypi_v4l2.tgz</nowiki></code>
  
*disagrees about version of symbol module_layout
+
<code>tar -xzvf raspberrypi_v4l2.tgz</code>
  
After the system has been booted, <code>dmesg</code> can see this error reported when the driver of camera is loaded. It is caused by the mismatch between the original piOS version on the board and the compiled camera driver version.
+
<code>cd raspberrypi_v4l2/release/</code>
  
It is recommended to refer to this [https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compiling-the-kernel link] to recompile from the code and install Image, dtb, modules as a whole.
+
<code>mkdir driver_bin/$(uname -r)</code>
 +
 
 +
Put the driver and dtbo files compiled into this directory.
 +
 
 +
<code>chmod +x *</code>
 +
 
 +
<code>sudo ./install_driver.sh [camera module]</code>
 +
 
 +
camera module:could be veye327,csimx307,cssc132,veyecam2m,etc.
 
===References===
 
===References===
<nowiki>https://www.raspberrypi.org/documentation/linux/kernel/building.md</nowiki>
+
https://www.raspberrypi.org/documentation/linux/kernel/building.md
 +
 
 +
=== Document History ===
 +
 
 +
* 20230510
 +
 
 +
Add  solution for"Missing build directory" error.
 +
 
 +
* 20230326
 +
 
 +
Add description and solution for "Missing build directory" error.
 +
 
 +
* 20220424
 +
 
 +
Add local build method.
 +
 
 +
* 20220411
 +
 
 +
Add description of MV series.

Latest revision as of 11:03, 10 May 2023

查看中文

The main resources in this section are the official piOS building method.

We provide methods to compile locally on Raspberry Pi and cross-compile on PC. It is recommended to use Raspberry Pi local compilation, which is simpler and faster.

1 Building the Drivers Locally

The following operations are performed on the Raspberry Pi.

The following is an example of piOS 5.15.32.

1.1 Prepare environment

sudo apt install git bc bison flex libssl-dev make

1.2 Download the kernel headers for the local piOS

sudo apt install raspberrypi-kernel-headers

1.3 Download drivers code from veye

git clone https://github.com/veyeimaging/raspberrypi_v4l2.git

1.4 Confirm the version of piOS on your own Raspberry Pi

$ uname -a

Linux raspberrypi 5.15.32-v8+ #1538 SMP PREEMPT Thu Mar 31 19:40:39 BST 2022 aarch64 GNU/Linux

1.5 Compile drivers

cd ~/raspberrypi_v4l2/driver_source/cam_drv_src/rpi-5.15_all

make

Done.

1.6 Compile dts

cd ~/raspberrypi_v4l2/driver_source/dts/rpi-5.15.y

./build_dtbo.sh

Done.

1.7 Common errors

1.7.1 Missing build directory

make[1]: *** /lib/modules/[version]/build: No such file or directory. Stop.

The cmd sudo apt install raspberrypi-kernel-headers will simply install the latest kernel headers available on the mirror. Which indeed matches the latest available kernel on the mirror. But not necessarily the installed kernel on the system.

The Raspbian maintainers always remove the older kernel headers from the repository index files. Not sure why they do that.

Solutions:

1.7.1.1 1. Upgrade piOS, and build again.

sudo apt update

sudo apt full-upgrade

sudo apt install raspberrypi-kernel-headers

Specifically, for the Raspberry Pi 4 series, 32-bit PiOS will automatically switch to 64-bit mode after upgrading to the latest version. However, the raspberrypi-kernel-headers package is missing the build directory for the v8+ mode.

For example:

$ uname -a

Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux

There is no build directory under /lib/modules/6.1.21-v8+/.

If this happens, you can add arm_64bit=0 to the /boot/config.txt file and then restart the Raspberry Pi to switch back to 32-bit mode.

1.7.1.2 2. Install specific version kernel headers.

Download the deb package for the version of piOS you are currently using from this link and install it.

For tag name, please determine according to the local piOS version and raspberrypi OS tags.

1.7.1.3 3. Use rpi-source

Use rpi-source from https://github.com/RPi-Distro/rpi-source it sets up everything you need to build your own kernel (from the current running kernel by default).

2 Cross-Compiling the Drivers

The following operations are done on ubuntu PC.

2.1 Build cross-compilation environment on Ubuntu 64-bit operating system)

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

  • 32-bit piOS target version

sudo apt install crossbuild-essential-armhf

  • 64-bit piOS target version

sudo apt install crossbuild-essential-arm64

2.2 Download the standard version of the piOS source code

2.2.1 Confirm the piOS version of your raspberry Pi
  • Release version

$ uname -a

Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux

  • Code tag

$ cp /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz ./

gunzip changelog.Debian.gz

Check the top lines and you will know the tag.

2.2.2 There are two ways to get the source code of the version you want:
  1. using git to clone the corresponding branch and checkout the corresponding tag.

git clone --branch rpi-5.4.y https://github.com/raspberrypi/linux

git checkout raspberrypi-kernel_1.20201022-1

PS: Please replace the above two commands with your own corresponding versions.

2. Manually download the version code of the corresponding tag directly from the link below.

https://github.com/raspberrypi/linux/tags

2.3 Patch our code to kernel

git clone https://github.com/veyeimaging/raspberrypi_v4l2.git

  • Driver source code

camera driver path is : linux/drivers/media/i2c,copy our camera module drivers to this path.

  • Modify the the Makefile and Kconfig files

Modify the Config and Makefile in the same path,add the corresponding camera driver.

  • dts file

dts file path is :linux/arch/arm/boot/dts/overlays,copy our [camera]-overlay.dts files to this path.

  • Modify dts Makefile

Modify the Makefile in the same path,add the corresponding dts compilation option.

2.4 Building

2.4.1 Preparing
  • For Raspberry Pi 1, Zero and Zero W, and Raspberry Pi Compute Module 1 default (32-bit only) build configuration

KERNEL=kernel

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

  • For Raspberry Pi 2, 3, 3+ and Zero 2 W, and Raspberry Pi Compute Modules 3 and 3+ default 32-bit build configuration

KERNEL=kernel7

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

  • For Raspberry Pi 4 and 400, and Raspberry Pi Compute Module 4 default 32-bit build configuration

KERNEL=kernel7l

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

  • For Raspberry Pi 3, 3+, 4, 400 and Zero 2 W, and Raspberry Pi Compute Modules 3, 3+ and 4 default 64-bit build configuration

KERNEL=kernel8

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

2.4.2 Add compilation options
  • 32-bit version

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

  • 64-bit version

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

Add the compilation options by the corresponding camera module, for 5.4 version kernel the path is driver-- > multimedia-- > i2C.

For 5.10 version kernel,the path is Device Drivers --> Multimedia Support --> Media ancillary drivers --> Camera sensor devices.

2.4.3 Build
  • 32-bit version

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

  • 64-bit version

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j4

3 Install the compiled driver

Once compiled, you get the specified version of the driver and dtbo file.

Refer to How to install driver

wget https://github.com/veyeimaging/raspberrypi_v4l2/releases/latest/download/raspberrypi_v4l2.tgz

tar -xzvf raspberrypi_v4l2.tgz

cd raspberrypi_v4l2/release/

mkdir driver_bin/$(uname -r)

Put the driver and dtbo files compiled into this directory.

chmod +x *

sudo ./install_driver.sh [camera module]

camera module:could be veye327,csimx307,cssc132,veyecam2m,etc.

4 References

https://www.raspberrypi.org/documentation/linux/kernel/building.md

5 Document History

  • 20230510

Add solution for"Missing build directory" error.

  • 20230326

Add description and solution for "Missing build directory" error.

  • 20220424

Add local build method.

  • 20220411

Add description of MV series.