关于树莓派内核编译和驱动编写(1)

本文介绍了作者在树莓派上进行内核编译和驱动开发的过程,从寻找合适的内核源码,解决解压过程中遇到的链接文件问题,到成功编译内核,并探讨了树莓派2使用kernel7.img的原因。通过修改内核镜像名称,作者成功启动了新编译的内核,并验证了驱动模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一周前入手了一块树莓派,算上配件总共307,按照论坛的方法烧好SD卡,启动,那么接下来就要开始折腾了。


鉴于本人是一个新手驱动的事实,于是着手开始在pi上写驱动。

那么按照驱动的基础知识,编写linux驱动,必然是先要有相同版本的的内核源码。

uname -a看了一下,3.18.5的内核,在github上找了一会,末版本号相同的可以说根本找不到,那么干脆重新编译一个内核好了,反正也是学习的过程。

于是开始找linux-rpi-3.18.y.tar.gz的内核源码,当然了,这个源码我再github上只找到linux-rpi-3.18.y.zip格式的,想来没什么区别,网上搜索也说都可以,于是就用unzip命令解压了一下,然后搞配置文件,弄环境,交叉编译器,编译神马的网上教程都很全,我就不再多说,但是最后编译的时候,会发现少文件,比如fs下面的有个叫local.h的文件,好像是这个,这个文件找不到。


问题就来了,解压有问题吗? 在目录下ls -a了一下,发现这个文件时有的,但是它却是一个链接文件,指向一大串代码,把这段代码复制下来之后,发现就是个程序,也就是说解压的时候把代码解压成链接了,这个现象我完全不明白原理,但是总归可以改回来,此处希望大神能够解答。


改好这个文件后,下一个文件也会报错,检查文件后发现是一样的原因,但这次我没有改了,我们知道,内核文件多的看不到边,看来这种现象不是个例,为它消耗时间完全不值得。于是脑补了一下,着手再去找linux-rpi-3.18.y.tar.gz,因为我一直坚信这个后缀的内核一定好用,但是这个东西轻易是找不到的,用git命令实在太慢了,我的网太渣。


最终,我在github的一个地址上找到了这个内核,这个地址是我根据一篇前辈的帖子脑补出来的:

### 如何在树莓派编写Linux内核驱动程序 #### 准备工作 为了能够在树莓派上成功编写测试Linux内核模块,需要先准备好开发环境。这包括安装必要的工具链以及获取适合目标平台的内核源码。 对于ARM架构下的树莓派而言,在主机端配置交叉编译器是常见的做法之一。通过指定`ARCH=arm` `CROSS_COMPILE=arm-linux-gnueabihf-` 参数可以告知Makefile使用正确的编译选项[^3]。 #### 获取硬件信息 了解所使用的具体型号非常重要,因为不同版本之间可能存在接口差异。可以通过命令`cat /proc/cpuinfo` 来查询当前系统的处理器详情;例如,如果是在树莓派 3B 上操作,则应查阅BCM2835的相关文档以确定可用的外设资源及其寄存器映射地址[^4]。 #### 设计思路 采用面向对象的设计理念有助于提高代码可读性维护性。当构建LED控制类别的驱动时,遵循分层原则能够使各功能单元职责分明——即把底层硬件访问逻辑封装起来供高层调用者简单地开关灯泡即可[^1]。 此外,现代Linux系统倾向于利用总线设备模型来管理外围组件间的关联关系。这意味着开发者不必显式创建`platform_device`实例,而是让其自动匹配相应的驱动程序完成初始化过程[^2]。 #### 实现步骤概览 下面给出一段简化版的GPIO LED控制器实现片段作为参考: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/gpio.h> #define GPIO_LED_PIN 17 /* 假定连接至BCM编号为17号引脚 */ static int __init led_init(void){ printk(KERN_INFO "Loading LED driver\n"); if (!gpio_is_valid(GPIO_LED_PIN)){ printk(KERN_ERR "Invalid GPIO number!\n"); return -ENODEV; } gpio_request(GPIO_LED_PIN, "sysled"); // 请求占用该管脚 gpio_direction_output(GPIO_LED_PIN, 0); // 设置方向为输出模式,默认关闭状态 return 0; } static void __exit led_exit(void){ printk(KERN_INFO "Unloading LED driver\n"); gpio_set_value(GPIO_LED_PIN, 0); gpio_free(GPIO_LED_PIN); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE("GPL"); ``` 这段简单的例子展示了如何请求特定编号的GPIO,并将其配置成输出方式以便于后续的操作。实际应用中可能还需要考虑更多细节比如中断处理机制等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值