闲来无事,试水写个博客,各位大神看看就好
也希望能帮助到别人呗
由于学习驱动编译需要,驱动模块所依赖的系统版本必须跟内核相同,然后更换内核得把驱动更新一遍
所以,现在先编译一遍树莓派的内核吧
平台版本ubuntu16.04、树莓派3b、4.4.21内核的jessie系统、4.9.34linux内核源码
一、准备阶段
https://github.com/raspberrypi
从上面这网站把源码包linux-rpi-4.9.y还有交叉编译工具链tools_master下载回来
这里我下载的版本是4.9.34的,相对比较新
使用unzip解压工具得到tool_master还有linux-rpi-4934-succeed文件夹
这里我使用的树莓派系统的旧内核版本如下
4.4.21-v7+,其实还是比较新了,但是还是更新一下吧,不然后面驱动编译出来也用不了
现在要在树莓派中采集原来的内核配置文件
使用以下命令,就可以拿到这个文件
1.sudo modprobe configs
2.zcat /proc/config.gz > /configs
3.把configs重命名为.config(带点),并放置到之前解压得到的源码根目录下
然后修改Makefile文件,把编译平台还有交叉编译工具链的参数修改好
具体大概在源码根目录下Makefile的第200行左右
ARCH当然是ARM
CROSS_COMPILE参数的话要具体到tools-master目录中的编译程序
大概是这样子:xxx/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
由于我虚拟机是64位的,所以我们在这里使用gcc-linaro-arm-linux-gnueabihf-raspbian-x64这个编译工具链,应该就可以了
二、编译
先执行下make menuconfig
出现这样子的界面的话,一般就选择exit退出就可以了,证明.config文件没问题了,然后检查.config文件是否存在问题,一般能顺利进入界面然后退出就可以了,注:记得把Enable loadable module support选上,以后编译内核需要本地模块支持
然后现在直接运行sudo make zImage dtbs modules -j4 #编译kernel镜像 dtbs文件 驱动模块文件 4线程全速编译
然后等编译完成就可以了
三、内核、驱动文件与dtb文件更换
把树莓派内存卡插到读卡器中,并连接到虚拟机(这里最好用外置usb读卡器,笔记本内置的那个读卡器会连接不到虚拟机,原因不明)
#以下为boot分区文件更变记录
sudo cp arch/arm/boot/zImage /media/chan/boot/kernel7.img #把arch/arm/boot/zImage复制到树莓派fat32分区下并重命名为kernel7.img
sudo cp arch/arm/boot/dts/*.dtb /media/chan/boot#把一同编译出来的dtb文件复制到fat32分区,设备树描述文件,少了这东西开不了机,有些内核版本编译了会没有生成
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/chan/boot/overlays/ #同上
sudo cp arch/arm/boot/dts/overlays/README /media/chan/boot/overlays/ #这个应该可以忽略,不过还是加上吧
#以下为ext4分区文件更变记录
执行sudo make INSTALL_MOD_PATH=/media/chan/402bfe3d-37db-48a7-a515-31edccf953df/ modules_install
#上面这行代码吧kernel依赖的驱动模块放置到ext4分区中,没有这一步开机是不存在的
四、开机
成功更新内核,内核建立时间也是写博客的时间,完美收工
注意事项:
3.-j*(编译线程)
只有内核版本号完全与驱动版本号一致,设备才能正常使用!
提示找不到curses.h(内核编译make的时候图形界面依赖)
sudo apt install *curses*
配置好但提示找不到gcc
sudo apt install lsb-core