Compiling a kernel module for the raspberry pi 2 via Ubuntu host
Compiling a kernel module for the raspberry pi 2 via Ubuntu host
Normally compiling a kernel module for a linux distribution is rather straight forward, but on the raspberry pi however it's a little more involved. That's why in this article I am going to show how I build kernel modules for the raspbian wheezy distro.
There are a couple of infos on the web about how to do it, but piecing them together for a working solution took some effort. That's why I am writing them down for future use. Following these steps I successfully build kernel modules for raspberry pi 2 raspbian release 2015-02-16.
Background
Building your kernel module for the raspberry pi is a two step process. The first step is to build the complete kernel for the raspberry pi on the ubuntu machine. This will take a long time, but you'll need to do it only once. After the build is complete, you can build your kernel module fast and easy and just copy the resulting binary to the raspberry pi.
Requirements
- Raspberry Pi flashed with a raspbian wheezy distribution
Get the latest raspbian image from the raspberrypi foundations website.
- Ubuntu for cross-compiling
Both time and space constrains make building the raspberry pi kernel on the raspberry pi itself rather challenging. That's why I went to road of cross-compiling from ubuntu to raspberry pi.
If you don't have a ubuntu machine, grab a ubuntu image from their download page and spin it up in a virtual machine of your choice. Myself, I use virtualbox on a windows machine.
- Patience
- sudo apt-get install libc6-i386 lib32z1 lib32stdc++6
- sudo apt-get install git ncurses-dev make
Getting the correct source
The normal way
Getting the correct source to build the kernel is trickier than one would guess. As explained on kernelnewbies.org you need the exact version of the headers from the kernel that the modules are built for.
Normally you'd simply install the kernel header package for the specific kernel version that you get when you execute uname -r
, but while raspbian provides header packages, the raspberry pi foundation, who modifies them does not, as you'll find out if you read through raspberry pi orgs forums.
The raspberry way
What they do however, is keep the complete source in their github linux repository. When they build a raspberry pi firmware, which is proprietery, closed source btw, those binaries are checked-in in the firmware repository including a file that contains the git hash that points to the commit in the linux repo that they used to build it.
So luckily for us there is a link that you can follow to get the exact source code and the steps are as follows:
- Get the Firmware Hash from the raspberry pi
- Get the Linux Kernel Hash from the 'Firmware' github repo
- Get the Linux Kernel Source from the 'Linux' github repo
Thanks to the raspberry pi forms user 'Zeta' who put a script together and posted it in this thread to perform those steps:
# Get the Firmware Hash from the Raspberry Pi
FIRMWARE_HASH=$(zgrep "* firmware as of" /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')
# Get the git hash for this kernel
KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
# Checkout the files on ubuntu
git checkout $KERNEL_HASH
Building the kernel
Armed with this knowledge we can now finally execute a step by step plan:
- Start up ubuntu
- Get the tools from https://github.com/raspberrypi/tools e.g.:
git clone https://github.com/raspberrypi/tools
- Set the environment variable CCPREFIX to point to the master tools like so:
export CCPREFIX=/home/INSERT YOUR USER NAME HERE/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
- Get the source from https://github.com/raspberrypi/linux e.g.:
git clone https://github.com/raspberrypi/tools
- Set the environment variable KERNEL_SRC to point to the kernel source:
export KERNEL_SRC=/home/INSERT YOUR USER NAME HERE/linux
- on the raspberry pi execute
FIRMWARE_HASH=$(zgrep "* firmware as of" /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')
to retrieve the firmware hash. - execute
KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
to retrieve the kernel hash. - back on ubuntu checkout the correct version of the kernel source code inside the KERNEL_SRC directory using git:
git checkout INSERT_KERNEL_HASH_HERE
- execute
make mrproper
in the KERNEL_SRC directory. - copy /proc/config.gz from the raspberry pi to the KERNEL_SRC directory.
e.g.
scp pi@ipaddress:/proc/config.gz ./
and unpack it:zcat config.gz > .config
- //execute
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
execute make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig
to modify the config as your wish
- execute
make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j8
- ...and wait.
- ...keep waiting.
If everything worked out ok, the kernel should be successfully rebuilt. Now the source directory can be used to built kernel modules for your raspberry pi.
Building Kernel modules
Now that the kernel has been successfully built, a new MOdule.symvers has been created. You can now use a make file that references the kernel source directory to built the kernel module only. E.g. use a line like:
PREFIX = /home/[USER]/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=$(PREFIX) modules -j8
make ARCH=arm
CROSS_COMPILE=$(PREFIX) INSTALL_MOD_PATH=/*wherever you want*/ modules_install
As I need to continually build kernel modules for more than one kernel version, I copy the source directory and rename it to match the kernel version. If a new kernel version comes out, I just checkout the source in a new folder. In the makefile I reference the different source folders to build the kernel module for different kernel versions.For an example of a makefile you can take a look here.
References
- http://downloads.raspberrypi.org/raspbian_latest
- http://www.ubuntu.com/download/desktop
- http://elinux.org/Raspberry_Pi_Kernel_Compilation
- http://bchavez.bitarmory.com/archive/2013/01/16/compiling-kernel-modules-for-raspberry-pi.aspx
- http://www.raspberrypi.org/forums/viewtopic.php?f=66&t=57401
Last updated 2015/2/25 0:47:16
Compiling a kernel module for the raspberry pi 2 via Ubuntu host的更多相关文章
- Raspberry Pi Kernel Compilation 内核编译官方文档
elinux.org/Raspberry_Pi_Kernel_Compilation#Use_the_provided_compiler Software & Distributions: S ...
- 用树莓派Raspberry Pi和Micro:bit做一个自拍器
在这个项目中,我们将使用Python来构建一个由Micro:bit触发树莓派Raspberry Pi和相机模块的自拍器.这是开始使用硬件和简单文本编程的好方法. 我们将学习: 如何设置Raspberr ...
- 2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐
原文:2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐 image Raspberry Pi** 是一款基于 ARM 的单板计算机,默认运行一款称为 Raspbian ...
- Raspberry Pi 3 --- Kernel Building and Run in A New Version Kernal
ABSTRACT There are two main methods for building the kernel. You can build locally on a Raspberry Pi ...
- 在ubuntu上编译rasbian kernel(for raspberry pi 1)
raspberry pi官网的编译手册写的简洁有力,照着操作即可 https://www.raspberrypi.org/documentation/linux/kernel/building.md ...
- RASPBERRY PI 外设学习资源
参考: http://www.siongboon.com/projects/2013-07-08_raspberry_pi/index.html Raspberry Pi Get st ...
- Raspberry Pi I2C驱动 (Python)
本文参考 http://www.instructables.com/id/Raspberry-Pi-I2C-Python/all/?lang=zh 作者 AntMan232 In this instr ...
- Roomblock: a Platform for Learning ROS Navigation With Roomba, Raspberry Pi and RPLIDAR(转)
What is this? "Roomblock" is a robot platform consists of a Roomba, a Raspberry Pi 2, a ...
- Device trees, Overlays and Parameters of Raspberry Pi
Raspberry Pi's latest kernels and firmware, including Raspbian and NOOBS releases, now by default us ...
随机推荐
- (转)一张图学会Dockerfile
原文:http://blog.51cto.com/kusorz/1942816 前言 Dockerfile是非常容易学的,和SHELL相比那简单的太多了. Dockerfile是为快速构建docker ...
- ubuntu 添加多个IP
上次这个问题 : UBUNTU 无法解析域名 解决方法 解决后,每次重启电脑都需要重新配置 /etc/resolv.conf. 这次添加IP的时候留心发现,在/etc/network/interfa ...
- 老司机谈APK瘦身套路-图片资源篇
APK作为Android系统安装包的文件格式,一直备受广大用户的关注,APK越是臃肿肥大,在下载安装过程中,它们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中 ...
- java外观模式(Facade)
1.外观模式(Facade [fə'sɑd] n. 正面:表面:外观) 外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式) 如下图 ...
- CyclicBarrier正确的使用方法和错误的使用方法
CyclicBarrier是java推出的一个并发编程工具,它用在多个线程之间协同工作.线程约定到达某个点,到达这个点之后的线程都停下来,直到最后一个线程也到达了这个点之后,所有的线程才会得到释放.常 ...
- Linq to SharePoint与权限提升(转)
转自http://www.cnblogs.com/kaneboy/archive/2012/01/25/2437086.html SharePoint 2010支持Linq to SharePoint ...
- WebStorm配置Node.js IDE
开始刚学的时候一直用命令行来运行Node.js,网上找了些配置Node.js IDE配置的贴子,说WebStorm配置IDE最简单,自己就试了下. 1.首先安装Node这步就不说了 2.下载WebSt ...
- CSS3 Media Queries_media queries, css3属性详解
Media Queries直译过来就是"媒体查询",在我们平时的Web页面中head部分常看到这样的一段代码: <link href="css/reset.css& ...
- Java 防SQL注入过滤器(拦截器)代码
原文出自:https://blog.csdn.net/seesun2012 前言 浅谈SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符 ...
- 浅谈FileReader
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据. 了解https://develope ...