树莓派参考文档真多,感谢各位作者!
为编译树莓派内核,重新装了Debian11,又查了好几个文档,最后要结合起来才成功,干脆自己整理下。目标系统为raspbian 5.10。
1、在Debian的用户目录$HOME下新建文件夹raspberrypi,用于存放编译文件,进入该目录
2、 树莓派官方网址https://github.com/raspberrypi,选linux下载(右侧Code下拉有Download ZIP)
或以下方式获得文件(进入目录后执行cd $HOME/raspberrypi,会生成linux和tools两个目录)
sudo git clone git://github.com/raspberrypi/linux.git
sudo git clone git://github.com/raspberrypi/tools.git(这个可以不用了,看第5点)
最终结构如下:
~
└── raspberrypi
├── linux
└── tools
3、安装编译环境
sudo apt-get install bc libncurses-dev libssl-dev build-essential kmod cpio flex bison
4、获取树莓派原内核配置
在树莓派中执行sudo modprobe configs
在/proc/找到原配置的压缩文件 config.gz
执行zcat config.gz > .config,会生成.config文件
将.config放到Debian自建目录的linux下(方法很多,可以顺便在树莓派上装samba)
5、配置交叉编译环境(可以跳到本点最后)
Debian自建目录的tools下一共有5个不同版本的交叉编译工具
arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的,每一个交叉编译工具的目录下都有bin目录进入,执行./arm-linux-gnueabihf-gcc -v可查看gcc版本。
( 参考https://blog.csdn.net/iefenghao/article/details/88815093)
添加环境变量(和window的PATH一个意思,为了能找到程序,是否写到启动脚本/etc/bash.bashrc或/etc/profile里大家自己看,生效命令:source /etc/bash.bashrc)
经测试,64位debian11下只有arm-rpi-4.9.3-linux-gnueabihf可用:
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin
(这个gcc版本编译时会报错export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin)
(32位:export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin 这条原文的路径有误)
最后在这:在看官方自带内核信息时猛然发现有新版本的交叉编译工具,
经过apt list gcc*arm*gnueabihf有没有很惊喜,挑个喜欢的装
sudo apt-get install gcc-10-arm-linux-gnueabihf
安装后arm-linux-gnueabihf-gcc-10位于/usr/bin/下
cd /usr/bin
sudo ln -s arm-linux-gnueabihf-gcc-10 arm-linux-gnueabihf-gcc
建立链接方便后续使用
6、在同一终端的任意目录测试执行arm-linux-gnueabihf-gcc -v应该要可以显示版本号
注意:直接运行export配置PATH的方式在关闭终端后会失效(按5最后装的不用理会这个)
7、配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
实际就是要求arm-linux-gnueabihf-后面加gcc的命令可以运行(即要配置正确的tools路径)
ARCH=后面为目标的架构,树莓派为arm
空格后的menuconfig即是原来 make menuconfig的后半部
8、编译内核模块等
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs(解释同上)
4核CPU的可以开4个线程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 4 zImage modules dtbs
多次编译的先make clean
9、安装模块(注意要root权限,使用sudo命令)
如SD卡或U盘(19年4月以后的eeprom已经可以完全用U盘代替TF卡了)根目录挂载为/media/roofs,以下为一条命令
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/roofs modules_install
会安装在/media/roofs/lib/modules/5.10.63-v7l(版本号下)
10、安装dtbs
如SD卡或U盘boot目录(就是windows下可以读取到的盘fat32格式)挂载为/media/boot
进入linux目录(cd $HOME/raspberrypi/linux)
sudo cp arch/arm/boot/dts/*.dtb /media/boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/boot/overlays/
11、生成树莓派可用内核
tools下的mkimage工具生成内核已不可用,需要mkknlimg
从官网查询到在5.2版本后的linux/cripts/mkknlimg工具也已被移除,就直接提取了一个,有知道新工具的帮留言告知下,谢谢!
https://download.csdn.net/download/ttham/29206209
下载到linux/scripts后进入目录赋于运行权限并运行(不能下载的看这里可直接复制代码linux/mkknlimg at rpi-5.2.y · raspberrypi/linux · GitHub)
cd $HOME/linux/scripts
chmod 755 mkknlimg
./mkknlimg ../arch/arm/boot/zImage /media/boot/$KERNEL.img
编辑/media/boot/config.txt,加入kernel=kernel.img(上一行可以直接指定名称为kernel.img),如未加入据说
如果config.txt里没指定kernel参数,则默认是先后搜寻kernel8.img、kernel8-32.img、kernel7.img、kernel.img,分别对应ARMv8-aarch64、ARMv8-aarch32、ARMv7和之前版本的。
tools下的mkimage工具生成内核已不可用(留着旧版本参考)
sudo apt-get install python2,安装python2后运行下面命令
python2 $HOME/raspberrypi/tools/mkimage/imagetool-uncompressed.py $HOME/raspberrypi/linux/arch/arm/boot/zImage
在当前目录下会生成可用的内核文件kernel.img
然后把当前目录(假设为$HOME/raspberrypi/tools/mkimage/)生成的kernel.img替换掉Raspberry Pi的/boot目录下的kernel.img文件
sudo cp $HOME/raspberrypi/tools/mkimage/kernel.img /media/boot/kernel.img
12、解除SD卡或U盘挂载
umount /mnt/boot
umount /mnt/rootfs
13、插入测试成功
wifi模块加载已解决,有空再更
14、参考文档:
树莓派Linux内核编译_嵌入式-CSDN博客_树莓派编译内核