编译树莓派内核

前言

拿到树莓派后,刚好手里有个360 Wi-Fi网卡(MT7601的芯片),就准备放树莓派上使用
插上去不识别,一搜才知道要重新编译内核,编译驱动什么的

原来没折腾过linux的编译,所以趁此机会,好好学习一下
期间查了网上很多资料,尝试,然后各种错误,最后还是官网资料英文资料最靠谱

搭建ubuntu环境

这个比较简单,请参考网上教程,完成ubuntu基本环境的搭建

搭建交叉编译环境

编译内核,可以在树莓派上进行,也可以在PC主机上进行编译,因为PC主机内存大,CPU性能高,所以一般都是在PC上进行
这里就引入了一个名次“交叉编译环境”

其实,刚听说交叉编译时,以为是多么高大上的技术,后来发现,就是在PC上安装工具,为CPU编译出可执行文件
我们一直以来用MDK,IAR开发STM32,AVR,也算是交叉编译了,,,哈哈

这里不做过多解释

树莓派官方为我们提供了对应的编译工具

官方推荐用git来下载,命令如下

1
$ git clone https://github.com/raspberrypi/tools

但实际下载时,git的速度实在难以恭维,建议直接用浏览器去github页面点击”Down as zip”下载

特别注意:下载完成后,注意检查下载包是否完整,不然在编译时会出现一堆莫名其妙的错误

下载完成后,将tools解压到某一个目录(XXX)下,那么tools的可执行目录为

1
2
3
4
5
32-bit 版本
XXX/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

64-bit 版本
XXX/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

接下来,我们将这个路径添加到PATH环境变量中

这里有一个小插曲,因为我用的是普通用户,添加路径到.bashrc文件中后,编译源码的时候,提示没有系统权限,所以又加了sudo来提升权限
但是仍然编译出错,提示找不到gcc和ld工具,找了半天原因,发现
1)下载的tools压缩包不完整,丢失了一些文件,所以重新下载了tools
2)普通用户的.bashrc和超级用户的.bashrc不在同一个目录,即便是把PATH添加到/etc/profile中也不能,仍然会提示超级用户找不到gcc之类的错误
解决方法就是先通过sudo su来切换为超级用户,然后把PATH添加到root的.bashrc文件中

添加方法如下

  1. 打开root/.bashrc
  2. 在最后一行,添加export PATH=$PATH:XXX/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

添加完成后,注销超级用户,然后重新切换为超级用户,在shell下输入arm-linux-gnueabihf-gcc -v来验证PATH变量是否生效

下载内核源码

到git上下载源码

1
$ git clone --depth=1 https://github.com/raspberrypi/linux

还是那句话,git速度太慢,建议网页直接下载,但注意检查文件完整性
事后证明,很多错误,都是因为下载的源代码不完整导致的

下载后,随意放一个目录下,将目录名改为linux

编译内核

进入linux目录,输入下面的命令

树莓派1代

1
2
3
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

树莓派2代

1
2
3
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

然后就是漫长的编译时间,在mac下,大概编译了一个小时左右
如果你电脑是多核的,可以在make 命令中增加-jn进行多线程编译
原则上,n是你处理器个数多1.5倍,比如我是4核电脑,就可以-j6

1
$ make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

编译完成后的安装过程,请参考INSTALL DIRECTLY ONTO THE SD
CARD

最后,当我编译完成后,突然发现树莓派4.1.y内核已经默认支持了我的360wifi 2代,所以就没有继续编译网卡驱动了
^_^

参考资料

  1. 官方:树莓派Linux文档主页
  2. 官方:内核编译
  3. 官方:无线连接