树莓派驱动开发之树莓派本地编译内核

一.环境要求

硬件设备:树莓派4B

树莓派搭载的操作系统:Ubuntu Server 20.04.5 LTS(64-bit)-----由raspberry Pi image烧录

树莓派官方教程:https://www.raspberrypi.com/documentation/computers/linux_kernel.html#applying-patches

二.本地编译

     1.内核版本查看以及内核源码下载

        要进行内核编译,首先要确定已经安装的内核版本:

uname -r

        

         之后再官方内核库中下载匹配的内核源码:树莓派内核源码链接

         博主的内核版本为5.4.0,因此这里选择5.4.y的内核源码 

      2.内核解压以及编译

        下载得到的内核压缩包,若是.zip文件包,使用解压命令解压,命令如下:

 sudo apt-get update
 sudo apt-get upgrade
 sudo apt install unzip
 unzip -q xxxxxx.zip

         进入内核源码,安装相关依赖以及gcc编译器:

cd linux-rpi-5.4.y
sudo apt install git bc bison flex libssl-dev make
sudo apt install gcc

        内核源码配置以及编译,以64位,v8架构为例,32位版本或其他可参考官方文档:

        (编译时间较长,请耐心等待,1+h)

KERNEL=kernel8
make bcm2711_defconfig
make -j4 Image.gz modules dtbs

        3.内核安装以及测试

        安装命令如下,此时应该是在内核源码目录下操作:

sudo make modules_install

        简单查看内核是否安装成功,命令为ls /lib/modules,看是否有我们下载的版本:

ls /lib/modules

         测试生成的环境:

        可采用远程开发将代码映射到树莓派中,方法在此

//简单的内核模块示例
//不是一个驱动程序
//内核驱动程序是作为一个可以加载的内核模块存在的
#include <linux/init.h>
#include <linux/module.h> 

//生命该模块对应的源代码遵循什么样的软件发布协议
MODULE_LICENSE("GPL");

//模块加载的时候的函数
//由于模块加载函数只被调用一次,因此这个对应的代码必须声明为STATIC
//模块加载其insmod程序根据返回值确定模块是否正确的被加载到内核中
static int __init hello_init(void)
{
	printk(KERN_INFO"Hello module has been loaded!\n");
	return 0;
}

//模块的卸载将调用的函数
static void __exit hello_exit(void)
{
	printk(KERN_INFO"Hello module has beed removed!\n");
	return ;
}
//告诉编译器哪个函数是加载及卸载执行的函数
module_init(hello_init);
module_exit(hello_exit);

     Makefile: 

obj-m =helloword.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
	rm  *.ko *.symvers *.order *.mod.c *.o

     最后在root权限下安装模块、卸载模块并查看内核信息:

sudo insmod helloword.ko
sudo rmmod helloword
dmesg |tail -2

       

 三.结语

        结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值