关于树莓派内核编译和驱动编写(1)

一周前入手了一块树莓派,算上配件总共307,按照论坛的方法烧好SD卡,启动,那么接下来就要开始折腾了。


鉴于本人是一个新手驱动的事实,于是着手开始在pi上写驱动。

那么按照驱动的基础知识,编写linux驱动,必然是先要有相同版本的的内核源码。

uname -a看了一下,3.18.5的内核,在github上找了一会,末版本号相同的可以说根本找不到,那么干脆重新编译一个内核好了,反正也是学习的过程。

于是开始找linux-rpi-3.18.y.tar.gz的内核源码,当然了,这个源码我再github上只找到linux-rpi-3.18.y.zip格式的,想来没什么区别,网上搜索也说都可以,于是就用unzip命令解压了一下,然后搞配置文件,弄环境,交叉编译器,编译神马的网上教程都很全,我就不再多说,但是最后编译的时候,会发现少文件,比如fs下面的有个叫local.h的文件,好像是这个,这个文件找不到。


问题就来了,解压有问题吗? 在目录下ls -a了一下,发现这个文件时有的,但是它却是一个链接文件,指向一大串代码,把这段代码复制下来之后,发现就是个程序,也就是说解压的时候把代码解压成链接了,这个现象我完全不明白原理,但是总归可以改回来,此处希望大神能够解答。


改好这个文件后,下一个文件也会报错,检查文件后发现是一样的原因,但这次我没有改了,我们知道,内核文件多的看不到边,看来这种现象不是个例,为它消耗时间完全不值得。于是脑补了一下,着手再去找linux-rpi-3.18.y.tar.gz,因为我一直坚信这个后缀的内核一定好用,但是这个东西轻易是找不到的,用git命令实在太慢了,我的网太渣。


最终,我在github的一个地址上找到了这个内核,这个地址是我根据一篇前辈的帖子脑补出来的:http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=4638,前辈已经联系不上了,但是还是留下链接吧。

我得出这样的内核下载地址,居然成功了,我也是佩服自己的勇气。

https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar,gz


解压什么的就不说了,很简单,这次编译成功了,那么就到了第二个关口。怎么让树莓派去启动它???


我们必须知道,树莓派的sd卡的存储结构,我自己没有查看,但是我相信关于这点,网上的信息是很正确,至少和我的分析相同。

树莓派SD卡结构如图:

关于树莓派内核编译和驱动编写(1)_第1张图片

那么当我们把sd卡插入电脑时,会发现只能看到boot分区,里面有很多文件,需要注意的是kernel.img和kernel7.img这两个文件,他们就是当前板子使用的内核。


到此,网上的教程就结束了了,他们最后会说移植vc库,modules,在config.txt里面加上kernel=kernel.img就好。

但事实上!这样还没有结束!!!

如果你买了树莓派2(不知道自己买的是几?百度一下),那么你启动的内核将不是kernel.img,而是kernel7.img!!!

我经过了试验才发现的,我是树莓派2,我把kernel7.img改个名字,就会启动失败,但我把kernel.img改名字,删除,都没关系。

也就是说,我的树莓派事实上是运行的kernel7.img,但这有什么区别呢?我陷入了沉思。


mkimage能把zImage变成kernel.img这个大家肯定都知道。但为什么还有个kernel7.img?


很庆幸的是,最终我在wiki上看到了真相:https://wiki.gentoo.org/wiki/Raspberry_Pi 


不知道是国内资讯过时还是怎么的,这个东西从没看到国内有提起,好吧,也可能是我孤陋寡闻,总之里面提到,树莓派A,B,B+运行的是kernel.img内核镜像,而树莓派2运行的则是kernel7.img,原因就是板子升级了,内核镜像简化了。

关于树莓派内核编译和驱动编写(1)_第2张图片

那么树莓派2的内核制作方式原来就是把zImage改个名字就行了,于是尝试,成功了,终于见到新的内核了,用uname -a查看了一下,确实正确,写了个hello world的内核模块,编译之后,插入内核运行成功。


终于见到曙光了


后面还要进行u-boot的制作,以及led调试灯驱动的编写,那么在后面的文章中我会一一提到,有兴趣的朋友们可以加关注。


那么准备继续研究吧。


你可能感兴趣的:(树莓派)