0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK3568外部IO中断示例

武汉万象奥科 2023-11-03 13:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

  1. 外部IO中断介绍

本篇文章以万象奥科HD-RK3568-IOT评估板中GPIO30为例,介绍Linux内核中断的注册方法,使用中断的方式检测GPIO30是否出现上升沿信号。中断在linux、设备驱动开发里使用的都非常多,可以更加实时的检测GPIO30的状态。

Linux内核提供了中断的注册接口:

  1. 注册中断

头文件 include\linux\interrupt.h

定义文件 include\linux\interrupt.h

函数原型 int request_irq(unsigned int irq, /* 做实参传递给中断服务函数第1个参数 */

Irq_handler_t handler, /* 中断服务函数指针 */

unsigned long flags,

const char *name,

void *dev_id); /* 做实参传递给中断服务函数第2个参数 */

函数功能: 向内核注册一个中断服务函数;

当发生中断号为irq的中断时,会执行handler指针函数。

函数参数:

irq: 中断编号(每个中断有唯一的编号)。

handler: 中断服务函数指针。

原型 typedef irqreturn_t(*irq_handler_t)(int, void *)。

flag: 中断的标志,用来描述本中断的基本特征的。

有固定的值,由中断源的特征决定;

比如外中断有: 上升沿,下降沿触发中断这类标志。

name: 中断名字,注册后会出现cat /proc/interrupts

dev_id: 这个参数是传递给中断服务函数。

对共享中断来说,这个参数一定有要;

当注销共享中断中的其中一个时,用这个标识要注销哪一个。

对于有唯一入口的中断,可以传递NULL;

但是一般来说都会传递一个有意义指针,在中断程序中使用,以方便编程

返回值 0 标识成功

-EINVAL (无效参数22) 表示中断号无效。

-EBUSY (设备或者资源忙16) 表示中断已经被占用。

2) 注销中断

void free_irq(unsigned int irq, void *dev_id)

irq: 要注销的中断号

dev_id: 其实就是注册时需要使用的dev参数,在共享中断必不可少,不能传递NULL。

注意:为防止在注销时同时发生中断,调用时候,先禁掉中断。

3) 中断开启与关闭

禁止中断:

void disable_irq_nosync(unsigned int irq);

void disable_irq(unsigned int irq);

参数: irq,要禁止的中断对应的编号。

注意:在中断服务程序中不能使用disable_irq这个函数,否则内核崩溃,可以使用disable_irq_nosync,

disable_irq: 函数调用后,函数不会马上返回,而等待中断程序执行完成才返回,在中断调用会导致死锁。

使能中断:

void enable_irq(unsigned int irq);

参数: irq, 要使能的中断对应的编号。

4) 获取irq中断号

Int gpio_to_irq(unsigned int irq);

参数: irq,要使能的中断对应的编号

  1. 外部IO中断驱动编写
    1. IO原理图
wKgZomVEizqAAaH_AAFy1JumMiQ719.png

图 2.1 GPIO0_D6

GPIO0_D6=0*32+(4-1)-8+6=30

    1. 驱动示例代码

#include

#include

#include

#include

#include

#define GPIO_PIN 30 // 替换为你的GPIO引脚

static unsigned int irq_number;

// GPIO中断处理函数

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

printk("GPIO中断触发!\n");

return IRQ_HANDLED;

}

static int __init mymodule_init(void) {

int ret;

// 请求GPIO

ret = gpio_request(GPIO_PIN, "my_gpio");

if (ret) {

printk("无法请求GPIO %d\n", GPIO_PIN);

return ret;

}

// 配置GPIO引脚为输入

ret = gpio_direction_input(GPIO_PIN);

if (ret) {

printk("无法配置GPIO %d 为输入\n", GPIO_PIN);

gpio_free(GPIO_PIN);

return ret;

}

// 请求GPIO中断

irq_number = gpio_to_irq(GPIO_PIN);

ret = request_irq(irq_number, gpio_irq_handler, IRQF_TRIGGER_RISING, "my_gpio_irq", NULL);

/* IRQF_TRIGGER_RISING 上升沿有效 */

if (ret) {

printk("无法请求GPIO中断 %d\n", irq_number);

gpio_free(GPIO_PIN);

return ret;

}

printk("模块加载成功\n");

return 0;

}

static void __exit mymodule_exit(void) {

// 释放GPIO中断

free_irq(irq_number, NULL);

// 释放GPIO

gpio_free(GPIO_PIN);

printk("模块卸载成功\n");

}

module_init(mymodule_init);

module_exit(mymodule_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("zou");

MODULE_DESCRIPTION("Sample GPIO and Timer Interrupt Kernel Module");

  1. 外部IO中断验证

将驱动编译成模块,insmod加载模块后。 由于驱动检测GPIO0_D6上升沿有效,当给该引脚提供高电平时,会触发中断执行中断处理函数。

wKgaomVEi0uAQ_CwAAA8UPgHinc576.png

图3.1 触发IO中断

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55698
  • 评估板
    +关注

    关注

    1

    文章

    890

    浏览量

    30905
  • LINUX内核
    +关注

    关注

    1

    文章

    318

    浏览量

    23036
  • RK3568
    +关注

    关注

    5

    文章

    628

    浏览量

    7571
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【迅为工业RK3568稳定可靠】itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解

    【迅为工业RK3568稳定可靠】itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解
    的头像 发表于 11-21 13:25 636次阅读
    【迅为工业<b class='flag-5'>RK3568</b>稳定可靠】itop-<b class='flag-5'>3568</b>开发板Linux驱动开发实战:<b class='flag-5'>RK3568</b>内核模块符号导出详解

    【作品合集】合众HZ-RK3568开发板测评

    合众HZ-RK3568开发板测评作品合集 产品介绍: HZ-EVM-RK3568开发板采用核心板+底板组合形式设计,两者通过四个80PIN稳定可靠的板对板连接器连接,扩展RK3568全部资源接口功能
    发表于 09-10 10:22

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别
    的头像 发表于 08-25 14:55 1065次阅读
    迅为<b class='flag-5'>RK3568</b>开发板模型推理测试实战LPRNet 车牌识别

    【HZ-RK3568开发板免费体验】HZ-RK3568开发板操作系统编译

    开发环境搭建好了后,接下来就是HZ-RK3568开发板操作系统编译工作。 一、menuconfig 先确保虚拟机的开发环境OK。 sudo apt install build-essential
    发表于 08-17 09:15

    rk3568快速开机 快速启动实现

    想了解下rk官方目前对rk3568快速开机的实现有哪些,是否有成熟的方案。在官方文档上看到rv1126方案,不知道可否应用在rk3568上。有专业人士回答吗
    发表于 08-07 08:37

    迅为RK3568 重制版RK3568驱动指南全面升级

    迅为RK3568 重制版RK3568驱动指南全面升级
    的头像 发表于 07-28 15:25 1483次阅读
    迅为<b class='flag-5'>RK3568</b> 重制版<b class='flag-5'>RK3568</b>驱动指南全面升级

    Rockchip RK3568技术参考手册

    电子发烧友网站提供《Rockchip RK3568技术参考手册.pdf》资料免费下载
    发表于 05-17 17:24 34次下载

    揭秘RK3568 HDMI IN 实现核心:RK628D芯片的桥接方案

    前言:随着多媒体应用需求的不断升级,越来越多的场景要求设备能够接入外部视频(HDMI-IN)信号,RK3568不直接支持HDMI-IN接口,SOC有MIPI-CSI功能;需将HDMI-IN转换成
    的头像 发表于 04-18 08:32 2112次阅读
    揭秘<b class='flag-5'>RK3568</b> HDMI IN 实现核心:<b class='flag-5'>RK</b>628D芯片的桥接方案

    HZ-EVM-RK3568-技术规格书

    电子发烧友网站提供《HZ-EVM-RK3568-技术规格书.pdf》资料免费下载
    发表于 04-17 15:47 1次下载

    HZ-CORE-RK3568-规格书

    电子发烧友网站提供《HZ-CORE-RK3568-规格书.pdf》资料免费下载
    发表于 04-17 15:45 0次下载

    rk3568开发工具

    rk3568开发工具
    发表于 04-16 17:03 7次下载

    【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发GPIO基础知识

    【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发GPIO基础知识
    的头像 发表于 03-06 11:23 1002次阅读
    【北京迅为】iTOP-<b class='flag-5'>RK3568</b>OpenHarmony系统南向驱动开发GPIO基础知识

    RK3568原理图及规格书资料

    RK3568 IoT设备官方参考原理图
    发表于 02-07 15:28 25次下载

    迅为RK3568开发板驱动指南Linux中通用SPI设备驱动

    迅为RK3568开发板驱动指南Linux中通用SPI设备驱动
    的头像 发表于 01-23 11:02 3418次阅读
    迅为<b class='flag-5'>RK3568</b>开发板驱动指南Linux中通用SPI设备驱动

    RK3568的显示问题及其解决方法

    概述 RK3568作为一款高性能的处理器,在显示方面有着广泛的应用。然而,在实际使用过程中,用户可能会遇到一系列显示相关的问题。本文旨在针对这些问题进行分析,并提供相应的解决方案,以帮助用户更好
    发表于 12-16 09:14