树莓派4B 64bit系统内核驱动学习 源码下载、编译、替换、加载驱动模块

学习记录

一、使用raspberry官方工具将64bit系统刷入SD卡

二、拉取git代码

首先确认当前树莓派上的内核版本

uname -r

我这里显示的是 6.1.63-v8+ 接下来要确认拉取的代码分支和这里一样

git clone https://github.com/raspberrypi/linux.git -branch rpi-6.1.y

三、编译源码

  1. 配置环境
sudo apt install raspberrypi-kernel-headers
sudo apt install bc bison flex libssl-dev make
  1. 安装64位使用的交叉编译工具aarch64-linux-gnu-(32位使用arm-linux-gnueabihf-)
sudo apt-get install gcc-aarch64-linux-gnu
  1. 编译源码(源码目录下)
KERNEL=kernel8 //(64bit os)
//配置编译环境,生成config文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig 
//使用配置文件构建    -j是使用的核心数
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j16

四、替换内核

  1. 将树莓派上的内存卡插入ubuntu主机上,使用命令sudo dmesg打印内核信息查看ubuntu将读卡器识别成sdb或是sdc亦或其他
  2. 挂在sd卡到ubuntu主机上
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdc1 mnt/fat32	//这里根据自己的来
sudo mount /dev/sdc2 mnt/ext4	//根据自己的来
  1. 将内核模块安装到sd卡上
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
  1. 将内核和设备树复制到sd卡上,使用不同的名字,以备份旧的内核,通过修改config.txt来生效
sudo cp arch/arm64/boot/Image mnt/fat32/kernel8_new.img

//拷贝剩下的文件
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/

编辑文件mnt/fat32/config.txt,使用新的内核

#Run in 64-bit mode
arm_64bit=1

下面一行添加上

kernel=kernel8_new.img

保存并退出
5. 卸载sd卡

sudo umount mnt/fat32
sudo umount mnt/ext4

重启后查看内核版本 uname -r

至此内核替换完成,可以开始内核驱动模块开发学习环节,下面添加一个hello world内核模块驱动试一下

五、hello world内核模块加载测试

  1. 在源码目录下找到drivers/char,添加一个hello.c文件
cd drivers/char
touch hello.c
  1. 代码内容:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
 

 
static int hello_init(void)
{
    printk(KERN_ALERT"Hello, world\n");
    return 0;
}
 
static void hello_exit(void)
{
    printk(KERN_ALERT"Goodbye, cruel world\n");
}
 
module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");

  1. 修改char目录下的Makefile
    添加一行
obj-m 				+= hello.o
  1. 编译模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules

成功生成ko文件在drivers/char目录下:hello.ko
5. 将hello.ko复制到树莓派上

scp drivers/char/hello.ko xxx@192.168.1.xx:/home/name/       //注意替换成自己的路径和ip,看不懂建议百度一下scp用法
  1. 加载ko文件
insmod hello.ko  //在树莓派上

可以看到打印的消息hello world了
如果看不到,是设置的系统打印日志等级过高,可以运行dmesg来看

此致,敬礼

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45786595

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值