当前位置: 首页 > java >正文

GPIO驱动实例代码

设备树

		gpio1: gpio@fec20000 {compatible = "rockchip,gpio-bank";reg = <0x0 0xfec20000 0x0 0x100>;interrupts = <GIC_SPI 278 IRQ_TYPE_LEVEL_HIGH>;clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;gpio-controller;#gpio-cells = <2>;gpio-ranges = <&pinctrl 0 32 32>;interrupt-controller;#interrupt-cells = <2>;};
	gpio-int {compatible = "gpio-int-demo";interrupt-gpio = <&gpio1 RK_PC6 IRQ_TYPE_EDGE_RISING>;status = "okay";};

MAKEFILE

obj-y                    += gpio-int-demo.o

驱动

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/cpumask.h>struct gpio_int_data {int irq_num;int gpio;
};static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
{{//jimmystatic ktime_t start = 0;ktime_t end = 0;s64 duration_us = 0;static u32 counter = 0;static u32 delay_counter = 0;static u32 print_counter = 0;//printk("gpio_keys_gpio_isr: irq %d\n", irq);if (irq == 135){end = ktime_get();if (start == 0){start = ktime_get();}else{duration_us = ktime_to_us(ktime_sub(end, start));start = end;counter++;if (duration_us > 135){delay_counter++;		}{if (print_counter > 5000){printk("gpio_soft usec_diff = %lld [%d/%d] virq %d\n", duration_us, delay_counter, counter, irq);print_counter = 0;}else{print_counter++;}}}}}// 可以在这里添加去抖、状态读取等逻辑return IRQ_HANDLED;
}static int gpio_int_probe(struct platform_device *pdev)
{struct device *dev = &pdev->dev;struct gpio_int_data *data;enum of_gpio_flags flags;int ret;struct cpumask mask;printk("gpio_int_probe ok\n");data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);if (!data)return -ENOMEM;/* 获取GPIO和中断标志 */data->gpio = of_get_named_gpio_flags(dev->of_node, "interrupt-gpio", 0, &flags);if (!gpio_is_valid(data->gpio)) {dev_err(dev, "Invalid GPIO\n");return -EINVAL;}data->irq_num = gpio_to_irq(data->gpio);/* 请求GPIO */ret = devm_gpio_request_one(dev, data->gpio, GPIOF_IN, "gpio_int");if (ret) {dev_err(dev, "Failed to request GPIO %d\n", data->gpio);return ret;}/* 请求中断 */ret = devm_request_irq(dev, data->irq_num, gpio_irq_handler, flags, dev_name(dev), NULL);if (ret) {dev_err(dev, "Failed to request IRQ %d\n", data->irq_num);return ret;}printk("GPIO %d (IRQ %d) registered successfully.\n", data->gpio, data->irq_num);platform_set_drvdata(pdev, data);return 0;
}static int gpio_int_remove(struct platform_device *pdev)
{pr_info("GPIO interrupt driver removed.\n");return 0;
}static const struct of_device_id gpio_int_of_match[] = {{ .compatible = "gpio-int-demo" },{}
};
MODULE_DEVICE_TABLE(of, gpio_int_of_match);static struct platform_driver gpio_int_driver = {.probe = gpio_int_probe,.remove = gpio_int_remove,.driver = {.name = "gpio-int-demo",.of_match_table = gpio_int_of_match,},
};module_platform_driver(gpio_int_driver);MODULE_AUTHOR("Jimmy.V");
MODULE_DESCRIPTION("GPIO Interrupt Demo Driver for RK3588");
MODULE_LICENSE("GPL v2");

http://www.xdnf.cn/news/9560.html

相关文章:

  • 【客户案例】借助 DHTMLX Gantt 和 Diagram 构建高效项目与流程管理平台
  • 基于SpringBoot开发一个MCP Server
  • vue 中的ref属性
  • chown修改不成功的解决方案
  • ESP8285乐鑫SOCwifi芯片32bit MCU和2.4 GHz Wi-Fi
  • 零衍课堂 | 环境初始化部署流程
  • 从0到1:多医院陪诊小程序开发笔记(上)
  • VMware 安装 Ubuntu 实战教程
  • python学习打卡day38
  • 截图后怎么快速粘贴到notability?
  • day22-定时任务故障案例
  • 秒杀系统—2.第一版初步实现的技术文档
  • 医院闭环系统业务介绍
  • Linux基础 -- 设备树引脚复用之`/omit-if-no-ref/` 用法解析
  • 8.7 基于EAP-AKA的订阅转移
  • Springboot 集成 TDengine3.0版本
  • git stash 的使用
  • qt ubuntu 20.04 交叉编译
  • python实战:在Linux服务器上使用LibreOffice命令行批量接受Word文档的所有修订
  • MCP 与 AI 模型的用户隐私保护——如何让人工智能更懂“界限感”?
  • Python-114:字符串字符类型排序问题
  • HBO Max 中国大陆订阅与使用终极指南(2025 最新)
  • LangChain4j(17)——MCP客户端
  • 在PHP编程中包(Package)和库(Library)怎么区分?
  • 企业级AI开启落地战,得场景者得天下
  • LeeCode 94. 二叉树的中序遍历
  • YARN架构解析:大数据资源管理核心
  • 【MYSQL】mysql单表亿级数据查询优化处理
  • 2021年认证杯SPSSPRO杯数学建模D题(第二阶段)停车的策略全过程文档及程序
  • 探寻黄金奶源带,悠纯乳业打造西北乳业新标杆