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支持四种类型 介绍
SGI SGI(Software Generated Interrupt,软件生成中断):SGI 是通过向 GIC 中的 SGI 寄存器写入来生成的中断。它通常用于处理器之间的通信,允许一个 PE 发送中断给一个或多个指定的 PE,中断号ID0 - ID15用于SGI。
PPI PPI(Private Peripheral Interrupt,私有外设中断):针对特定 PE 的外设中断。不与其他 PE 共享,中断号ID16 - ID31用于PPI。
SPI SPI(Shared Peripheral Interrupt,共享外设中断):全局外设中断,可以路由到指定的处理器核心(PE)或一组 PE,它允许多个 PE 接收同一个中断。中断号ID32 - ID1019用于SPI,
LPI LPI(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);<
<think>首先,用户的问题是:在RK3568平台上适配Android 13系统以支持LVDS屏幕并实现触摸功能。我需要提供实现方法。 从系统级指令,我必须: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用,但用户提供的引用是关于RK3568 Android11或Android12的,我需要基于这些信息推断Android 13的适配。 用户提供的引用: - [^1]:关于RK3568 Android11的LVDS屏幕配置,提到LVDS与MIPI DSI0共用,需要设备树配置。 - [^2]:关于RK3568 Android的mipi转lvds配置,包含设备树文件修改。 - [^3]:RK3568 Android11触摸芯片移植,涉及设备树配置触摸屏参数。 - [^4]:rk3568点亮LCD(lvds),提到屏幕参数调整、VOP配置、设备树设置。 - [^5]:RK3568 Android12 LVDS屏幕及触摸调试,提供触摸驱动链接。 用户的问题是关于Android 13的适配,所以我要基于Android 11/12的引用,推断Android 13的类似步骤。Android系统的核心配置如设备树、内核驱动等在不同版本中相似,但可能有细微差异。 关键点: 1. **LVDS屏幕支持**:需要配置设备树(dts文件)来启用LVDS,设置分辨率、时序等参数。 2. **触摸功能**:需要配置触摸芯片的设备树节点,如中断、GPIO、分辨率等。 3. **Android 13适配**:Android 13可能使用更新的内核版本或HAL层,但基本设备树配置应该类似。 步骤应该包括: - 修改设备树文件(dts)以启用LVDS和触摸- 配置VOP(Video Output Processor)以匹配LVDS输出。 - 确保内核驱动支持LVDS和触摸芯片。 - 编译和烧写固件。 结构清晰的回答: 1. **引言**:简要说明适配LVDS屏幕和触摸功能的整体方法。 2. **步骤**:分步详细说明如何配置设备树、内核等。 3. **代码示例**:提供设备树配置的代码片段。 4. **验证**:如何验证配置是否生效。 5. **常见问题**:提及可能的问题和解决方法。 6. **相关问题**:生成相关问题。 在回答中引用段落时添加引用标识。例如,基于引用[^1],可以说“RK3568的LVDS与MIPI DSI0是共用关系[^1]”。 生成相关问题:在回答结束后,添加“§§相关问题§§”部分,列出3-5个相关问题。 现在,构建回答大纲: 1. **理解硬件配置**:解释RK3568的LVDS支持(基于引用[^1])。 2. **设备树配置**: - 启用LVDS(基于引用[^1],[^2],[^4])。 - 配置触摸屏(基于引用[^3],[^5])。 3. **内核配置**:确保相关驱动启用(基于引用[^3])。 4. **Android HAL层**:可能需要适配显示和触摸的HAL,但Android 13可能不需要大改。 5. **调试与验证**:使用工具检查VOP状态(基于引用[^4])。 6. **常见问题**:如黑屏、闪屏等(基于引用[^4])。 由于用户提到Android 13,我需要确保信息通用。Android 13的Linux内核版本可能更新,但设备树语法相同。 代码示例:使用设备树配置片段。 最后,生成相关问题: 1. 如何调试RK3568上的LVDS屏幕显示问题? 2. RK3568 Android 13触摸屏校准方法是什么? 3. 如何优化LVDS屏幕的功耗在RK3568平台上?</think>### RK3568 Android 13适配LVDS屏幕并启用触摸功能的实现方法 在RK3568平台上适配Android 13系统以支持LVDS屏幕和触摸功能,需要重点关注设备树配置、内核驱动启用和系统级调试。RK3568的LVDS接口与MIPI DSI0是共用关系,因此必须正确配置设备树以选择LVDS输出模式[^1]。同时,触摸功能依赖于触摸芯片的驱动中断配置。以下是详细的实现步骤,基于Android 13的系统架构(内核版本通常为Linux 5.10或更高),并结合RK3568硬件特性进行说明。整个过程分为硬件配置、软件修改、调试验证三部分,确保结构清晰且可操作。 #### 1. **硬件准备与前提条件** - **LVDS屏幕参数**:获取屏幕规格书,包括分辨率(如$1280 \times 800$)、时序参数(如前后肩、同步信号)、电压要求等。屏幕参数错误会导致闪屏或条纹问题[^4]。 - **触摸芯片选型**:确认触摸芯片型号(如ILI2511或FT5306),并获取其数据手册。触摸芯片通常通过I2C或SPI接口连接,需检查中断和复位GPIO引脚。 - **平台兼容性**:RK3568支持单路LVDS原生输出,若需双路LVDS,需使用转换芯片(如MIPI转LVDS)[^1]。Android 13的BSP(Board Support Package)应基于Rockchip官方SDK更新。 #### 2. **设备树(DTS)配置** 设备树是核心配置,需修改RK3568的DTS文件(如`rk3568-evb.dtsi`或自定义板级DTS)。以下是关键步骤: - **启用LVDS输出**: - 在设备树中关闭MIPI DSI0,启用LVDS接口。例如: ```dts // 关闭MIPI DSI0 &dsi0 { status = "disabled"; }; // 启用LVDS并配置VOP(Video Output Processor) &lvds { status = "okay"; ports { lvds_in: port { // 绑定到VP1(Video Port 1),VP2通常禁用 lvds_in_vp1: endpoint { remote-endpoint = <&vp1_out_lvds>; }; }; }; }; &route_lvds { status = "okay"; connect = <&vp1_out_lvds>; // 确保输出路径正确 }; &vp1 { status = "okay"; }; &vp2 { status = "disabled"; // VP2未使用 }; ``` 此配置确保LVDS信号通过VP1输出,避免与MIPI DSI0冲突[^1][^4]。 - 添加屏幕时序参数:根据规格书设置`display-timings`节点,包括分辨率、刷新率、前后肩等。例如: ```dts lvds_panel: lvds-panel { compatible = "simple-panel"; status = "okay"; display-timings { timing0: timing0 { clock-frequency = <72000000>; // 时钟频率 hactive = <1280>; // 水平分辨率 vactive = <800>; // 垂直分辨率 hfront-porch = <40>; // 水平前肩 hback-porch = <40>; // 水平后肩 hsync-len = <10>; // 水平同步信号长度 vfront-porch = <10>; // 垂直前肩 vback-porch = <10>; // 垂直后肩 vsync-len = <5>; // 垂直同步信号长度 }; }; }; ``` 参数错误会导致显示异常,需严格匹配规格书[^4]。 - **配置触摸功能**: - 添加触摸芯片节点:假设使用ILI2511芯片(支持Android 13),配置I2C地址、中断和复位GPIO: ```dts &i2c1 { status = "okay"; ilidev: ilidev@41 { compatible = "ilitek,ili2511"; // 驱动匹配名 reg = <0x41>; // I2C器件地址 interrupt-parent = <&gpio0>; interrupts = <RK_PB5 IRQ_TYPE_LEVEL_LOW>; // 中断引脚和类型 reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>; // 复位GPIO touchscreen-size-x = <1280>; // 触摸屏水平分辨率 touchscreen-size-y = <800>; // 垂直分辨率 status = "okay"; }; }; ``` 此配置基于引用[^3][^5],确保`compatible`属性与内核驱动匹配。 - 启用触摸中断:在`interrupts`属性中指定GPIO引脚(如`RK_PB5`),避免中断冲突。 设备树修改后,需包含到主DTS文件(如`rk3568-evb1-ddr4-v10.dtsi`)[^2]。 #### 3. **内核与驱动配置** - **内核编译选项**: - 启用LVDS和触摸驱动:在Linux内核配置中(如`make menuconfig`),确保以下选项开启: ``` CONFIG_DRM_PANEL_LVDS=y // LVDS面板支持 CONFIG_TOUCHSCREEN_ILI2511=y // ILI2511触摸驱动 CONFIG_ROCKCHIP_VOP2=y // RK3568 VOP驱动 ``` - 对于其他触摸芯片(如FT5306),选择对应驱动(`CONFIG_TOUCHSCREEN_EDT_FT5X06=y`)[^3]。 - **驱动更新**:Android 13可能使用较新内核,需从Rockchip GitHub仓库获取最新驱动。例如,ILI2511驱动可从官方链接下载(参考引用[^5])。 #### 4. **Android系统层适配** - **HAL层配置**:在Android 13中,显示和触摸的HAL(Hardware Abstraction Layer)通常无需大改,但需确保: - `surfaceflinger`服务正确识别LVDS分辨率。 - 触摸事件通过`inputflinger`传递,验证`getevent`命令输出。 - **编译与烧写**: - 使用Rockchip SDK编译固件:`./build.sh -d rk3568-evb -v userdebug`。 - 烧写固件到设备,并检查`/proc/device-tree`以确认DTS配置生效。 #### 5. **调试与验证** - **显示问题排查**: - 开机黑屏:检查上电时序和信号,使用`cat /d/dri/0/summary`(Android)或`cat /sys/kernel/debug/dri/0/summary`(Linux)查看VOP状态[^4]。 - 闪屏或条纹:重新校准设备树中的时序参数,确保与屏幕规格书一致。 - **触摸功能验证**: - 使用`getevent -l`命令查看触摸事件输入。 -触摸无响应,检查中断和GPIO配置:`cat /proc/interrupts`确认中断触发。 - **常见问题解决**: - **开机无显示,休眠唤醒后正常**:检查上电时序,或尝试禁用开机Logo。 - **触摸点漂移**:执行触摸校准(Android设置或使用`ts_calibrate`工具)。 #### 6. **参考注意事项** - **Android 13差异**:Android 13可能引入新安全策略(如SELinux),需在`te`文件中添加触摸驱动的权限规则。 - **性能优化**:调整VOP时钟频率以降低功耗,公式为: $$f_{\text{clk}} = \frac{(h_{\text{active}} + h_{\text{front-porch}} + h_{\text{back-porch}} + h_{\text{sync-len}}) \times (v_{\text{active}} + v_{\text{front-porch}} + v_{\text{back-porch}} + v_{\text{sync-len}}) \times \text{refresh\_rate}}{1000}$$ 其中参数来自设备树时序设置[^4]。 - **引用资源**:Rockchip官方Wiki和GitHub提供Android 13 BSP更新,触摸驱动下载参考[^5]。 通过以上步骤,RK3568 Android 13可稳定支持LVDS屏幕和触摸功能。若问题持续,提供具体屏幕和触摸芯片型号以进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值