RK3568-中断-触摸屏中断

提示:通过RK3568 触摸屏中断 程序,了解中断基本知识,先入门!


前言

在 Linux 驱动开发中,中断(Interrupt) 是一种重要的机制,用于处理硬件设备与 CPU 之间的异步事件(如数据到达、设备状态变化等)。Linux 内核提供了完善的中断处理框架,驱动开发者需要遵循内核的 API 来注册和处理中断。


一、 参考资料

迅为RK3568开发板如何修改默认配置并保存
Linux 驱动开发 三十九:Linux 中断
RK3568驱动指南|第五篇-中断-第39章中断实验
rk3568 | 瑞芯微平台GPIO引脚驱动编写

二、基础概念-知识

1、中断类型

按触发方式分类

这里的类型是后面 申请中断函数request_irq 中的一个触发方式的 参数Flag ,这里先介绍如下:

IRQF_TRIGGER_NONE:无触发方式,表示中断不会被触发。
IRQF_TRIGGER_RISING:上升沿触发方式,表示中断在信号上升沿时触发。
IRQF_TRIGGER_FALLING:下降沿触发方式,表示中断在信号下降沿时触发。
IRQF_TRIGGER_HIGH:高电平触发方式,表示中断在信号为高电平时触发。
IRQF_TRIGGER_LOW:低电平触发方式,表示中断在信号为低电平时触发。
IRQF_SHARED:中断共享方式,表示中断可以被多个设备共享使用。
电平触发中断(Level-triggered):
  • 中断信号保持有效电平直到被处理

  • 适用于共享中断线

边沿触发中断(Edge-triggered):
  • 中断信号在电平变化时触发

  • 通常用于非共享中断

中断类型中断器来分

GIC-V3支持四种类型的中断

分别是SGI、PPI、SPI和LPI,每个中断类型的介绍如下:

GIC-V3支持四种类型介绍
SGISGI(Software Generated Interrupt,软件生成中断):SGI 是通过向 GIC 中的 SGI 寄存器写入来生成的中断。它通常用于处理器之间的通信,允许一个 PE 发送中断给一个或多个指定的 PE,中断号ID0 - ID15用于SGI。
PPIPPI(Private Peripheral Interrupt,私有外设中断):针对特定 PE 的外设中断。不与其他 PE 共享,中断号ID16 - ID31用于PPI。
SPISPI(Shared Peripheral Interrupt,共享外设中断):全局外设中断,可以路由到指定的处理器核心(PE)或一组 PE,它允许多个 PE 接收同一个中断。中断号ID32 - ID1019用于SPI,
LPILPI(Locality-specific Peripheral Interrupt,特定局部外设中断):LPI 是 GICv3 中引入的一种中断类型,与其他类型的中断有几个不同之处。LPI 总是基于消息的中断,其配置存储在内存表中,而不是寄存器中。
GIC-V3四种类型中断号
中断类型INTID范围备注
SGI(软件生成中断)0 - 15每个核心分别存储
PPI(私有外设中断)16 - 31每个核心分别存储
SPI(共享外设中断)32 - 1019
特殊中断号1020 - 1023用于表示特殊情况
保留1024 - 8191
LPI(特定局部外设中断)8192及更大上限由实现定义

2、中断号

在 linux 内核中, 我们使用 IRQ number 和 HW interrupt ID 两个 ID 来标识一个来自外设的中断:

IRQ number

CPU 需要为每一个外设中断编号, 我们称之 IRQ Number。 这个 IRQ number是一个虚拟的 interrupt ID, 和硬件无关, 仅仅是被 CPU 用来标识一个外设中断。

HW interrupt ID

对于 GIC 中断控制器而言, 它收集了多个外设的 interrupt request line 并向上传递, 因此, GIC 中断控制器需要对外设中断进行编码。 GIC 中断控制器用 HW interrupt ID来标识外设的中断。 如果只有一个 GIC 中断控制器, 那 IRQ number 和 HW interrupt ID 是可以一一对应的。

3、常用中断函数API

gpio_to_irq

gpio_to_irq() 是 Linux 内核中用于将 GPIO 引脚号转换为对应中断号(IRQ)的函数,常用于驱动开发中处理 GPIO 中断。

对于硬件来说,一个板卡上面、芯片上面对应的是引脚号。对于系统、软件、cpu 来说 识别的是中断号。 那么就是把这个硬件的触发中断的引脚号转化为 系统、软件、cpu 可识别的中断号

函数原型
int gpio_to_irq(unsigned int gpio);


gpio: 要映射的 GPIO 引脚号。

功能说明
  • 将给定的 GPIO 引脚号转换为对应的中断号
  • 成功时返回有效的 IRQ 号,失败时返回负的错误码
  • 通常在驱动初始化时调用,获取 GPIO 对应的中断号

request_irq

request_irq 函数是在 Linux 内核中用于注册中断处理程序的函数。 它用于请求一个中断号(IRQ number) 并将一个中断处理程序与该中断关联起来

函数原型
int request_irq(unsigned int irq, irq_handler_t handler, 
                unsigned long flags, const char *name, void *dev);

参数说明
参数说明
irq要申请的中断号:可通过 gpio_to_irq() 从 GPIO 获取;或通过平台设备树获取
handler中断处理函数指针:类型为 irq_handler_t;函数原型: irqreturn_t (*irq_handler_t)(int, void *)
flags中断标志位,常用组合:IRQF_TRIGGER_RISING: 上升沿触发;IRQF_TRIGGER_FALLING: 下降沿触发;IRQF_TRIGGER_HIGH: 高电平触发;IRQF_TRIGGER_LOW: 低电平触发;IRQF_SHARED: 共享中断(多个设备使用同一中断线)
name中断名称:出现在 /proc/interrupts 中;用于标识中断所有者
dev设备标识指针:用于共享中断时区分不同设备;会传递给中断处理函数;非共享中断可设为 NULL

free_irq

free_irq() 是 Linux 内核中用于释放已注册中断的函数,它与 request_irq() 配对使用,是中断资源管理的重要组成部分。

函数原型
void free_irq(unsigned int irq, void *dev_id);
参数说明
参数说明
irq要释放的中断号,必须与之前 request_irq() 调用时使用的相同
dev_id设备标识指针:必须与注册中断时提供的指针相同;对于共享中断,用于标识特定的设备;对于非共享中断,必须与注册时一致(通常为 NULL)
功能说明
  • 释放之前通过 request_irq() 或 devm_request_irq() 申请的中断

  • 确保没有正在执行的中断处理程序后才会完成释放

  • 对于共享中断,只释放与特定 dev_id 关联的处理程序

  • 当所有共享中断处理程序都被释放后,才会真正禁用中断线

三、触摸屏触摸中断实验

更改默认配置

本身机器带个屏幕有自己的触摸驱动程序的,既然自己需要做触摸屏中断实验,自己来接收这一套中断逻辑,那么先要做的就是去掉主板的触摸屏驱动。
如何去掉触摸屏程序呢? 要么 源码里面 .mk 文件中去掉,要么直接通过menuconfig 图形化界面去掉对应的屏幕驱动。 这里我们采用第二种。

RK3568 如何修改默认配置并保存

执行 SDK 包中 build.sh 编译脚本编译内核和 uboot 时会先 make 内核和 uboot 的默认的配置文件生产.config, 然后使用.config 文件里面的配置来编译内核和 uboot 镜像。 所以要想修改配置需修改默认的配置文件才行。

在使用 make menuconfig 进行配置之前, 先使用命令“make XXX_defconfig” 生成.config,修改完图形化配置界面的设置并保存, 那么么.config 文件会被更新, 需将修改后的.config 覆盖回默认配置文件。 具体可根据以下章节进行操作

Linux 的默认配置文件 路径如下:

内核: kernel/arch/arm64/configs/rockchip_linux_defconfig
Uboot: u-boot/configs/rk3568_defconfig
rk3568-Linux-menuconfig 配置

步骤如下:执行命令后会进入到配置程序界面,保证FT5X06 触摸屏驱动为空,然后退出保存即可。

图形化配置
cd kernel/
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 menuconfig
解析 make ARCH=arm64 rockchip_linux_defconfig 命令

命令组成解析

指令参数解析
makeLinux 内核使用的构建系统命令,用于执行内核的编译和配置。
ARCH=arm64指定目标架构为 ARM64(AArch64),这会告诉内核构建系统使用 arm64,架构的配置和编译规则,对应源代码中的 arch/arm64 目录
rockchip_linux_defconfig指定使用 Rockchip 平台的默认配置文件;这个文件通常位于 arch/arm64/configs/ 目录下;文件内容包含针对 Rockchip 处理器(如 RK3399、RK3588 等)的默认内核配置选项

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

保存配置到指定的配置目录
Exit 退出图形配置界面后运行以下命令将修改保存到默认配置文件。
 cp .config arch/arm64/configs/rockchip_linux_defconfig //Linux

然后 重新编译kernel,或者整包编译一次。

自己写触摸屏中断程序

上面的基础概念知识和触摸屏驱动去掉了,并且编译了固件,接下来写自己的中断程序,验证中断业务。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>

#define GPIO_PIN 101

// 中断处理函数
static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
{
    printk(KERN_INFO "Interrupt occurred on GPIO %d\n", GPIO_PIN);
    printk(KERN_INFO "This is irq_handler\n");
    return IRQ_HANDLED;
}

static int __init interrupt_init(void)
{
    int irq_num;

    printk(KERN_INFO "Initializing GPIO Interrupt Driver\n");

    // 将GPIO引脚映射到中断号
    irq_num = gpio_to_irq(GPIO_PIN);
    printk(KERN_INFO "GPIO %d mapped to IRQ %d\n", GPIO_PIN, irq_num);

    // 请求中断
    if (request_irq(irq_num, gpio_irq_handler, IRQF_TRIGGER_RISING, "irq_test", NULL) != 0) {
        printk(KERN_ERR "Failed to request IRQ %d\n", irq_num);

        // 请求中断失败,释放GPIO引脚
        gpio_free(GPIO_PIN);
        return -ENODEV;
    }
    return 0;
}

static void __exit interrupt_exit(void)
{
    int irq_num = gpio_to_irq(GPIO_PIN);

    // 释放中断
    free_irq(irq_num, NULL);
    printk(KERN_INFO "GPIO Interrupt Driver exited successfully\n");
}

module_init(interrupt_init);
module_exit(interrupt_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wfc");

编译程序,把 驱动.ko 文件push 到系统里面,加载驱动,然后触摸触摸屏,看kernel 打印如下:
在这里插入图片描述

总结

  • 通过触摸屏中断程序及中断程序需要了解的基本知识、api 来初步熟悉中断。
  • 有人会问:去掉原有屏幕驱动不就是menuconfig 吗,为什么还整一个其它的文件。 那是因为:因为迅为发的这个bsp编译脚本用的rockchip_linux_defconfig这个配置文件,所以需要copy 一次配置到指定目录。
  • 因为涉及到配置更改,新手而言容易改错,导致配置问题无法编译,自行把新源码里面的配置文件copy 覆盖掉,重新编译即可。
  • 中断,对于初学者而言,很难理解的。但是做实验,多多查阅资料,发现很简单了。
  • 这里 涉及到知识点 rk3568 | 瑞芯微平台GPIO引脚驱动,引脚编号的换算,针对rk平台有自己的换算机制,可以自行查阅资料或者直接看官方资料。 有一套自己的换算机制的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值