好记性不如铅笔头

linux, 操作系统, 树莓派

在树莓派上编译驱动

备注:首先说明的是本文最后并未成功,google了一下,好像是新的树莓派的版本不支持了。参考【 http://www.raspberrypi.org/forum/viewtopic.php?f=66&t=60364 】,但是还是备注下流程。如果路过的大牛发现问题所在,请及时告知解决方法。跪谢!!!!

CONTENTS

确认树莓派的系统版本号:

如果要编译驱动,首先要找到和当前树莓派的系统版本号码的头文件和Module.symvers。这里先说下如何获取版本号:

pi@raspberrypi ~ $ uname -r
3.10.25+
root@raspberrypi:~# rpi-update
。。。。。
reboot
pi@raspberrypi ~/modules/hellomodule $ uname -r
3.10.33+

如上命令行,可以获取版本号,也可以先升级到最新版本在获取版本号。

根据版本号下载头文件:

这个比较麻烦,如果是先升级到了最新版本,会简单一点。首先访问:https://github.com/raspberrypi/linux 】,查看MakeFile的注释,如果代码的版本号和系统版本号一样,可以直接下载:


由于网速较慢,作者建议使用一些下载工具来下载,作者采取的方法是先在VPS上下载下来,然后再用ftp工具从VPS上搞到本地。下载地址:


需要注意的是这里下载下来的是.zip的文件,而不是tar.gz格式的,而且里面的很多文件名称较长,使用unzip解压会有问题,因此这里需要使用java命令来解压,首先将zip文件上传到树莓派上,然后解压:

pi@raspberrypi ~/kernels $ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)

pi@raspberrypi ~/kernels $ jar -xf linux-rpi-3.10.y.zip 

新版本的树莓派系统都默认含有java环境,但是老版本的好像没有,需要自己google下如何安装。

编译内核头文件:

当把zip文件解压好之后,根据自己的环境输入如下命令行:

root@raspberrypi:/home/pi/kernels# ls
linux-rpi-3.10.y  linux-rpi-3.10.y.zip
root@raspberrypi:/home/pi/kernels# mv linux-rpi-3.10.y /usr/src
root@raspberrypi:/home/pi/kernels# ln -s /usr/src/linux-rpi-3.10.y /lib/modules/3.10.33+/build
root@raspberrypi:/home/pi/kernels# cd /lib/modules/3.10.33+/build
root@raspberrypi:/lib/modules/3.10.33+/build# make mrproper
root@raspberrypi:/lib/modules/3.10.33+/build# gzip -dc /proc/config.gz > .config
root@raspberrypi:/lib/modules/3.10.33+/build# make modules_prepare

然后我们需要下载一个Module.symvers文件,访问地址:【 https://github.com/raspberrypi/firmware/tree/master/extra 】,同样查看代码的版本号码:

如果版本一致,则点击Module.symvers,进入如下页面,点击raw:

然后将网址复制下来:

在树莓派的命令行中,输入:

wget https://github.com/raspberrypi/firmware/blob/master/extra/Module.symvers

当文件下载好之后,理论上来讲就可以了。

最简单的驱动:

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
	printk(KERN_ALERT "Hello world\n");
	return 0;
}

static void hello_exit(void)
{
	printk(KERN_ALERT "Goodbye world\n");
}

module_init(hello_init);
module_exit(hello_exit);

 Makefile:

obj-m := helloworld.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
	make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
	rm *.o *.ko *.mod.c

.PHONY:clean

 编译出的驱动文件如下:

pi@raspberrypi ~/modules/hellomodule $ modinfo helloworld.ko
filename:       /home/pi/modules/hellomodule/helloworld.ko
license:        Dual BSD/GPL
srcversion:     3DEDFD5C9FD8D951BC5630C
depends:        
vermagic:       3.10.33 preempt mod_unload modversions ARMv6 

但是问题就来了,当作者插入该内核时,报错如下,暂时还不知道怎么搞:

上面说的都是系统版本是最新的,那么如果系统版本不是最新的又不想升级怎么办,作者这里提供一种思路,但是作者没有验证过该思路的正确性,仅供参考:

访问Makefile的历史提交页面:【 https://github.com/raspberrypi/linux/commits/rpi-3.10.y/Makefile 】,找到合适的版本,选择browsecode:

然后宣选择到上一级的目录上,这里可以发现代码提交标记已经变了:

当选择到linux页面后,就可以发现Makefile的注释已经是需要的版本了,这样就可以和上面一样,在Download ZIP上点击右键,获取下载地址了。

Module.symvers的历史界面:【 https://github.com/raspberrypi/firmware/commits/master/extra/Module.symvers 】,操作都差不多,就不贴图了。

发表评论

16 − 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据