编译树莓派内核4.1.y
前言拿到树莓派后,刚好手里有个360 Wi-Fi网卡(MT7601的芯片),就准备放树莓派上使用
插上去不识别,一搜才知道要重新编译内核,编译驱动什么的
原来没折腾过linux的编译,所以趁此机会,好好学习一下
期间查了网上很多资料,尝试,然后各种错误,最后还是官网资料英文资料最靠谱
搭建ubuntu环境这个比较简单,请参考网上教程,完成ubuntu基本环境的搭建
搭建交叉编译环境编译内核,可以在树莓派上进行,也可以在PC主机上进行编译,因为PC主机内存大,CPU性能高,所以一般都是在PC上进行
这里就引入了一个名次“交叉编译环境”
其实,刚听说交叉编译时,以为是多么高大上的技术,后来发现,就是在PC上安装工具,为CPU编译出可执行文件
我们一直以来用MDK,IAR开发STM32,AVR,也算是交叉编译了,,,哈哈
这里不做过多解释
树莓派官方为我们提供了对应的编译工具
官方推荐用git来下载,命令如下
但实际下载时,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文件中
添加方法如下
- 打开root/.bashrc
- 在最后一行,添加export PATH=$PATH:XXX/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
添加完成后,注销超级用户,然后重新切换为超级用户,在shell下输入arm-linux-gnueabihf-gcc -v来验证PATH变量是否生效
下载内核源码到git上下载源码
还是那句话,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
|
最后,当我编译完成后,突然发现树莓派4.1.y内核已经默认支持了我的360wifi 2代,所以就没有继续编译网卡驱动了
^_^
参考资料