linux源码配置
实现声明:树莓派4b以下步骤指定的内核文件均是kernel7l,树莓派3b是kernel7
驱动代码的编写需要一个提前编译好的内核,所以烧入树莓派的linux内核需要提前配置。
内核源码获取
在链接1中选取自己需要的内核源码,下载后将压缩包传入ubuntu虚拟机中进行配置、编译
解压.tar.gz的压缩包:
sudo xz -d 文件路径
sudo tar -xvf 文件路径
#或者:
sudo tar xf ./linux-rpi-5.15.y.tar.gz
第一种方式
复制厂家配的linux内核源码,如树莓派的厂家就配置好的工程信号:
树莓派2/3:bcm2907_defconfig
树莓派4:bcm2911_defconfig
然后将这个源码复制入我们需要用的.config文件
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make bcm2711_defconfig
第二种方式
一项项配置源码(基于我们需要挂载的芯片厂家的操作手册)
由于要进入图形页面交互所以,需要我们下载ncurses
下载地址:https://ftp.gnu.org/pub/gnu/ncurses/
tar -zxvf ncurses-6.2.tar.gz
cd ncurses-6.2
./configure
make
make install
ls /usr/lib/libnc*
/usr/lib/libncurses.a /usr/lib/libncurses_g.a
如果make错误,就加个超级权限试试看
然后输入指令交互编辑内核源码:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make menuconfig
每个选项前面可以显示我们需不需要这个内核驱动,左右键切换
Y为表示该驱动需要编辑进内核
M为表示以模块生成驱动文件,系统启动后通过命令inmosd xxx.ko加载
空为不需要
内核编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make -j4 zImage modules dtbs
可能会出现编译错误是工具不行要安装最新工具
sudo apt install libssl-dev
安装成功后能在==./arch/boot/目录底下看到文件:zImage==,和==./vmlinux==
内核移植内核安装到TF卡
将TF卡接到Linux交叉编译主机上(如果是VMwar虚拟机,则需要将"设置->硬件->USB控制机->USB兼容性©”调成“USB 1.1”)
运行lsblk命令查看识别到的TF卡设备节点,如下:
linux@ubuntu:~/linux$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 20G 0 part /
sdb 8:16 1 14.6G 0 disk
├─sdb1 8:17 1 256M 0 part /media/linux/boot
└─sdb2 8:18 1 3.3G 0 part /media/linux/rootfs
正常TF卡设备会自动挂载到/media/${当前用户目录}/下的boot和rootfs目录下,如果没有自动挂载,则根据识别到实际TF卡的设备节点,将设备挂载到主机上,如下:
#创建新文件夹
sudo mkdir /media/linux/rootfs -p
sudo mkdir /media/linux/boot -p
#挂载在sd卡的两个分区上
sudo mount /dev/sdb1 /media/linux/boot
sudo mount /dev/sdb2 /media/linux/rootfs
然后将内核模块安装到SD中:
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/linux/rootfs modules_install
最后备份原理SD卡中的旧内核, 并将新内核和设备树配置文件到SD卡中:
#将旧的内核文件备份为KERNEL-backup.img
cp /home/pi/Desktop/data-fat/kernel7l.img kernel7lBak.img
#将我们刚刚编译好的内核文件移植入tf卡中
sudo cp arch/arm/boot/zImage /media/linux/boot/kernel7l.img
#将需要的一些文件也复制入tf卡中
sudo cp arch/arm/boot/dts/*.dtb /media/linux/boot
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/linux/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/linux/boot/overlays/
#断开tf卡的两个分区的连接
sudo umount /media/linux/boot
sudo umount /media/linux/rootfs
当然,你也可以不备份旧的内核,而是通过重命令编译出来的内核名称,如将编译出来的img改为kernel-new.img,然后修改config.txt的配置文件种的kernel字段,如下:
kernel=kernel-new.img
这么做的好处是保证原有的内核不被破坏,如果新的内核无法启动,只需要将config.txt的kernel字段改回来即可。
使用md5sum /文件路径/
可以查看复制前后两个文件的文件路径的代号吧(具体是什么不太清楚),可以判别文件复制过程有没有损坏
最后,将TF卡插回Pi上,然后启动Pi即可。