树莓派3B点灯(5)-- 自写驱动(按键版)(TODO)

news/2024/9/18 3:11:54 标签: 嵌入式

在树莓派上新增一个按键并通过内核模块(ko 驱动)来处理,可以通过编写一个 Linux 内核模块来实现。以下是一个简单的示例,展示如何编写和加载一个内核模块来处理 GPIO 按键输入。

硬件连接

假设你已经将按键连接到树莓派的 GPIO 17 引脚,并且另一端连接到 GND。

编写内核模块

  1. 创建内核模块源文件:创建一个名为 gpio_button.c 的文件。
 
 

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/gpio.h>

#include <linux/interrupt.h>

#include <linux/irq.h>

#define GPIO_BUTTON 17 // GPIO 引脚号

static unsigned int irqNumber;

static bool buttonPressed = false;

// 中断处理函数

static irqreturn_t gpio_irq_handler(int irq, void *dev_id) {

buttonPressed = !buttonPressed;

printk(KERN_INFO "GPIO Button: Interrupt! Button state is %d\n", buttonPressed);

return IRQ_HANDLED;

}

// 模块初始化函数

static int __init gpio_button_init(void) {

int result = 0;

// 请求 GPIO

if (!gpio_is_valid(GPIO_BUTTON)) {

printk(KERN_INFO "GPIO Button: Invalid GPIO\n");

return -ENODEV;

}

gpio_request(GPIO_BUTTON, "sysfs");

gpio_direction_input(GPIO_BUTTON);

gpio_set_debounce(GPIO_BUTTON, 200);

gpio_export(GPIO_BUTTON, false);

// 获取 IRQ 编号

irqNumber = gpio_to_irq(GPIO_BUTTON);

printk(KERN_INFO "GPIO Button: The button is mapped to IRQ: %d\n", irqNumber);

// 请求 IRQ

result = request_irq(irqNumber, (irq_handler_t) gpio_irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "gpio_button_handler", NULL);

if (result) {

printk(KERN_INFO "GPIO Button: Unable to request IRQ: %d\n", result);

return result;

}

printk(KERN_INFO "GPIO Button: Module loaded\n");

return result;

}

// 模块退出函数

static void __exit gpio_button_exit(void) {

free_irq(irqNumber, NULL);

gpio_unexport(GPIO_BUTTON);

gpio_free(GPIO_BUTTON);

printk(KERN_INFO "GPIO Button: Module unloaded\n");

}

module_init(gpio_button_init);

module_exit(gpio_button_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Your Name");

MODULE_DESCRIPTION("A simple GPIO Button Driver");

MODULE_VERSION("0.1");

  1. 编译内核模块:创建一个名为 Makefile 的文件,用于编译内核模块。
 
 

obj-m += gpio_button.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

  1. 编译和加载内核模块
 
 

# 编译内核模块

make

# 加载内核模块

sudo insmod gpio_button.ko

# 检查内核日志

dmesg | tail

  1. 卸载内核模块
 
 

# 卸载内核模块

sudo rmmod gpio_button

# 检查内核日志

dmesg | tail

代码解释

  • 中断处理函数gpio_irq_handler 是中断处理函数,当按键状态发生变化时会被调用。它会切换 buttonPressed 变量的状态,并打印按键状态。
  • 模块初始化函数gpio_button_init 是模块的初始化函数。它请求 GPIO 引脚,设置为输入模式,并请求中断。
  • 模块退出函数gpio_button_exit 是模块的退出函数。它释放中断和 GPIO 引脚。
  • 模块信息MODULE_LICENSEMODULE_AUTHORMODULE_DESCRIPTION 和 MODULE_VERSION 用于描述模块信息。

总结

通过编写和加载一个内核模块,可以在树莓派上处理 GPIO 按键输入。这种方法适用于需要在内核空间处理硬件事件的场景。上述示例展示了如何编写一个简单的内核模块来处理 GPIO 按键的中断,并在内核日志中打印按键状态。


http://www.niftyadmin.cn/n/5653300.html

相关文章

语义分割数据集|河流湖泊分割|水灾预警

江河湖泊自然水灾检测数据集&#xff0c;数据集整理不易&#xff0c;获取地址在最后&#xff0c;具体信息如下&#xff1a; 总数&#xff1a;290张 类别&#xff1a;1类 数据集大小&#xff1a;约106M 数据整理不易&#xff0c;数据集获取地址如下&#xff1a; https://…

vue-watch监听功能(侦听器)详解使用

在Vue中&#xff0c;watch侦听器允许我们观察和响应Vue实例上数据的变化。当被侦听的数据发生变化时&#xff0c;可以执行异步操作或开销较大的操作&#xff0c;这是computed属性可能不适合的场景。watch侦听器提供了更灵活的方式来处理数据变化时的副作用。 基本用法 watch选…

数据处理与统计分析篇-day01-Linux基础与环境搭建

day01-Linux基础 计算机简介 概述 电子计算机, 电脑, PC, Computer, 就是由 软件 硬件组成的 电子设备. 组成 计算机硬件 CPU(运算器, 控制器) 存储器(内存, 外存) 输入设备 输出设备 计算机软件 系统软件: 充当 用户 和 计算机硬件之间的 桥梁的. PC端: windows, Linu…

【重学 MySQL】十二、SQL 语言的规则与规范

【重学 MySQL】十二、SQL 语言的规则与规范 基本规则注释语法规则命名规则基本命名规则具体命名规范其他注意事项 数据导入指令 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维…

分布式中间件-redis相关概念介绍

文章目录 什么是redis?示意图Redis的主要特点Redis的主要用途Redis的工作原理Redis的持久化与备份 redis 6.x新增特性多线程数据加载客户端缓存新的 RESP 3 协议支持ACL&#xff08;Access Control List&#xff09;功能新增数据类型性能改进配置文件的改进其他改进 redis数据…

CompletableFutrue默认系统线程数量

CompletableFutrue默认系统线程数量 CompletableFuture 是 Java 8 引入的一个类&#xff0c;用于表示异步计算的结果。它使用 Java 的 ForkJoinPool 作为默认的线程池来执行异步任务。ForkJoinPool 的默认线程数量是根据可用处理器数量&#xff08;Runtime.getRuntime().avail…

Vue3使用vue-qrcode-reader实现扫码绑定设备功能

需求描述 移动端进入网站后&#xff0c;登录网站进入设备管理界面。点击添加设备&#xff0c;可以选择直接添加或者扫一扫。点击扫一扫进行扫描二维码获取设备序列号自动填充到添加设备界面的序列号输入框中。然后点击完成进行设备绑定。 安装vue-qrcode-reader 这里使用的版…

软件测试认知篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 软件测试的认知篇, 从什么是软件测试出发, 其次是测试和开发之间的区别, 软件测试有哪些岗位, 以及测试人员需求具备的素质, 最后是3道软件测试的面试题~ &#xff0…