RaspberryPi4B树莓派4B,Linux5.4本地编译驱动开发从下载Linux源码到编译更新系统,以及安装⾃⼰的驱动,整个流程全在树莓派上完成,不需要借助PC机。
青春寄语本⼈的树莓派Linux版本是5.4.51-v7l+,最新Linux版本是5.4.61-v7l+,因此直接下载GitHub的源码编译更新系统。
安装更新之前
更新系统之后
主要参考官⽅⽂档:Kernel building
在Raspberry Pi上,⾸先安装最新版本的Raspberry Pi OS。 然后启动树莓派,然后登录,确保能联⽹更新软件。
准备⼯作
⾸先安装Git和构建依赖项
sudo apt install git bc bison flex libssl-dev make
在树莓派上新建⼀个⽂件夹来存储Linux源码,例如:/home/pi/work
最好确保是否要使⽤最新的Linux版本,请访问github并检查最新的版本是什么:
查看最新的版本号
如果想要下载最新的源码,在终端中输⼊:
获取最新源码
选择其他版本的Linux源码
上⾯的git clone命令省略--depth = 1将下载整个存储库,包括所有分⽀的完整历史记录,但这会花费更长的时间并占⽤更多的存储空间。要下载其他分⽀,请使⽤--branch选项:(其中<branch>是要下载的分⽀的名称)
请参阅原始GitHub存储库以获取有关可⽤分⽀的信息。
⾄此,你已经获得了Linux源码。
内核配置
⼀般根据不同树莓派版本使⽤默认配置
⾸先,根据您的Raspberry Pi版本,通过运⾏以下命令来准备默认配置:
Raspberry Pi 1,Pi Zero,Pi Zero W和Compute Module默认构建配置
cd linux
KERNEL=kernel
make bcmrpi_defconfig
Raspberry Pi 2,Pi 3,Pi 3+和Compute Module 3默认构建配置
cd linux
KERNEL=kernel7
make bcm2709_defconfig
国庆高速公路免费几天?Raspberry Pi 4默认构建配置
cd linux
KERNEL=kernel7l # 请⽤复制粘贴的⽅式,这⾥是的l是L的⼩写make bcm2711_defconfig
树莓派4B的默认配置Linux源码编译
根据使⽤的Pi型号,此步骤可能需要很长时间:
make -j4 zImage modules dtbs
注意:在Raspberry Pi 2/3/4上,-j4标志在所有四个内核之间分配⼯作,加快了编译速度。更新系统内核(可选)
安装内核,模块和设备树;(可选)
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
然后重新启动系统。
如果内核更新失败(系统还是之前的版本)或者想保留之前的内核(每次启动后都可以更改内核版本):
回到linux⽬录:
sudo cp arch/arm/boot/zImage /boot/kernel-my.img # 将新内核命名为kernel-my.img 修改,请⽤管理员⾝份运⾏:
sudo nano / # 修改启动配置⽂件
在⽂件中添加⼀⾏:
kernel=kernel-my.img
修改启动配置⽂件
游戏名称符号然后,重启系统。
通过dmsg命令查看启动信息:
Linux启动信息
玉怎么识别好坏测试驱动编写
写⼀个简单的驱动⽂件example.c:
# example.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/device.h>
中国诺贝尔奖获得者#include <linux/uaccess.h>
int __init example_init(void) //真实⼊⼝改名申请书
{
printk("init the module example\n"); // 内核的打印函数 和printf类似
return 0;
}
void __exit example_exit(void)
{
printk("the example module is uninstalled\n"); // 内核的打印函数 和printf类似
}
module_init(example_init); //⼊⼝ 内核加载该驱动的时候 这个宏会被调⽤
module_exit(example_exit);
MODULE_LICENSE("GPL");
写⼀个简单的Makefile:
# Makefile
ifneq ($(KERNELRELEASE),)
$(MODULE_NAME)-y := example.o
obj-m := example.o
else
KDIR := /home/pi/work/linux ### 这个⽬录需要和你下载并编译的Linux源码的⽬录⼀致PWD := $(shell pwd)
all:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论