【随笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析
相关信息
硬件平台:全志T507
系统版本:Android 10 / Linux 4.9.170
问题描述:PF4 无法通过标准接口设置为中断模式,而 PF1、PF2、PF3、PF5 正常可用。
分析过程
一开始以为是引脚被其它驱动占用引起,或者该引脚不具备中断功能,经过排查,已排除这两种可能,因此通过从源码分析来找问题的根因。
以下是以 gpio_keys.c 驱动为入口进行分析:
// drivers/input/keyboard/gpio_keys.c
static int gpio_keys_setup_key(struct platform_device *pdev,struct input_dev *input,struct gpio_button_data *bdata,const struct gpio_keys_button *button)
{......error = devm_request_any_context_irq(&pdev->dev, bdata->irq,isr, irqflags, desc, bdata);
}// kernel/irq/devres.c
int devm_request_any_context_irq(struct device *dev, unsigned int irq,irq_handler_t handler, unsigned long irqflags,const char *devname, void *dev_id)
{......rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id);if (rc < 0) {devres_free(dr);return rc;}......return rc;
}// kernel/irq/manage.c
int request_any_context_irq(unsigned int irq, irq_handler_t handler,unsigned long flags, const char *name, void *dev_id)
{......ret = request_irq(irq, handler, flags, name, dev_id);return !ret ? IRQC_IS_HARDIRQ : ret;
}// include/linux/interrupt.h
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
{return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}// kernel/irq/manage.c
int request_threaded_irq(unsigned int irq, irq_handler_t handler,irq_handler_t thread_fn, unsigned long irqflags,const char *devname, void *dev_id)
{......chip_bus_lock(desc);retval = __setup_irq(irq, desc, action);chip_bus_sync_unlock(desc);......return retval;
}// kernel/irq/manage.c
static int __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
{......if (!shared) {ret = irq_request_resources(desc);if (ret) {pr_err("Failed to request resources for %s (irq %d) on irqchip %s\n",new->name, irq, desc->irq_data.chip->name);goto out_mask;}......} ......
}// kernel/irq/manage.c
static int irq_request_resources(struct irq_desc *desc)
{struct irq_data *d = &desc->irq_data;struct irq_chip *c = d->chip;return c->irq_request_resources ? c->irq_request_resources(d) : 0;
}// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static struct irq_chip sunxi_pinctrl_edge_irq_chip = {.name = "sunxi_pio_edge",.irq_ack = sunxi_pinctrl_irq_ack,.irq_mask = sunxi_pinctrl_irq_mask,.irq_unmask = sunxi_pinctrl_irq_unmask,.irq_request_resources = sunxi_pinctrl_irq_request_resources,.irq_release_resources = sunxi_pinctrl_irq_release_resources,.irq_set_type = sunxi_pinctrl_irq_set_type,.irq_set_wake = sunxi_pinctrl_irq_set_wake,
};// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static int sunxi_pinctrl_irq_request_resources(struct irq_data *d)
{struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);struct sunxi_desc_function *func;func = sunxi_pinctrl_desc_find_function_by_pin(pctl,pctl->irq_array[d->hwirq], "irq");if (!func)return -EINVAL;/* Change muxing to INT mode */printk(KERN_EMERG"[lmx] irq:%d set int mode pin:%d d->hwirq:%ld func->muxval:%d\n", d->irq, pctl->irq_array[d->hwirq], d->hwirq, func->muxval);sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval);return 0;
}// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static void sunxi_pmx_set(struct pinctrl_dev *pctldev,unsigned pin,u8 config)
{struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);unsigned long flags;u32 val, mask;raw_spin_lock_irqsave(&pctl->lock, flags);pin -= pctl->desc->pin_base;val = readl(pctl->membase + sunxi_mux_reg(pin));mask = MUX_PINS_MASK << sunxi_mux_offset(pin);writel((val & ~mask) | config << sunxi_mux_offset(pin),pctl->membase + sunxi_mux_reg(pin));raw_spin_unlock_irqrestore(&pctl->lock, flags);
}
无论有多复杂的代码,最终都需要通过读写寄存器的方式来实现控制芯片,而通过上述代码分析,即可发现 sunxi_pmx_set() 接口用于配置寄存器,是最底层的接口,可以通过打印输出传入的参数,来检查是否有问题。
PF3 打印输出为:
[ 10.683205] [lmx] irq:148 set int mode pin:163 d->hwirq:131 func->muxval:6
PF4 打印输出为:
[ 10.683557] [lmx] irq:149 set int mode pin:196 d->hwirq:132 func->muxval:6
这里就能看出很奇怪的地方,PF3 的引脚编号是 163,而 PF4 却是 196,跨度很大。
通过以下指令查询 PF4 的正确引脚编号,也可以得知 196 引脚编号是哪一组:
mercury-demo:/ # cat /sys/kernel/debug/pinctrl/pio/pins
registered pins: 137
......
pin 160 (PF0)
pin 161 (PF1)
pin 162 (PF2)
pin 163 (PF3)
pin 164 (PF4)
pin 165 (PF5)
pin 166 (PF6)
......
pin 196 (PG4)
pin 197 (PG5)
......
确认 PF4 正确引脚编号是 164,而 196 对应是 PG4,实际生效的是 PG4,通过以下指令即可确认:
mercury-demo:/sys/kernel/debug/sunxi_pinctrl # echo PG4 > sunxi_pin
mercury-demo:/sys/kernel/debug/sunxi_pinctrl # cat *
pin[PG4] data: 1
pio
pin[PG4] dlevel: 1
pin[PG4] funciton: 6
NOMATCH
pin[PG4] pull: 1
PG4
pin[PG4] funciton: 6
pin[PG4] data: 1
pin[PG4] dlevel: 1
pin[PG4] pull: 1
根据代码确定引脚编号来源于 pctl->irq_array 数组,通过 pctl->irq_array 赋值的地方进行打印输出,是否一开始就出错了:
// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static int sunxi_pinctrl_build_state(struct platform_device *pdev)
{....../* Count functions associated groups */for (i = 0; i < pctl->desc->npins; i++) {const struct sunxi_desc_pin *pin = pctl->desc->pins + i;struct sunxi_desc_function *func = pin->functions;while (func->name) {/* Create interrupt mapping while we're at it */if (!strcmp(func->name, "irq")) {int irqnum = func->irqnum + func->irqbank * IRQ_PER_BANK;pctl->irq_array[irqnum] = pin->pin.number;printk(KERN_EMERG"[lmx] pctl->irq_array[%d] = %d (func->irqnum:%d func->irqbank:%d)\n", irqnum, pin->pin.number, func->irqnum, func->irqbank);}sunxi_pinctrl_add_function(pctl, func->name);func++;}}......return 0;
}
// drivers/pinctrl/sunxi/pinctrl-sunxi.h
#define IRQ_PER_BANK 32

可以发现,PF4(164)对应的索引是 132,原本被正确赋值为 164,但又被覆盖为 PG4(196)。
不难发现,出现覆盖的原因是因为 PG4 的 func->irqbank 数值错误(4),导致索引下标计算错误。
根据前后文来看,func->irqbank 的正确数值应该是 5,代入计算得到正确的值 164:
int irqnum(164) = func->irqnum(4) + func->irqbank(5) * IRQ_PER_BANK(32);
大概率硬件资源描述配置出错,通过搜索 irqbank 被赋值的方法,来定位描述配置出错的地方:
// drivers/pinctrl/sunxi/pinctrl-sunxi.h
#define SUNXI_FUNCTION_IRQ_BANK(_val, _bank, _irq) \{ \.name = "irq", \.muxval = _val, \.irqbank = _bank, \.irqnum = _irq, \}
使用的是 SUNXI_FUNCTION_IRQ_BANK 宏,重点检查第二个参数:
// drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
static const struct sunxi_desc_pin sun50iw9p1_pins[] = {......SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),SUNXI_FUNCTION(0x0, "gpio_in"),SUNXI_FUNCTION(0x1, "gpio_out"),SUNXI_FUNCTION(0x2, "sdc1"), /* D1 */SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 3), /* PG_EINT3 */SUNXI_FUNCTION(0x7, "io_disabled")),SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),SUNXI_FUNCTION(0x0, "gpio_in"),SUNXI_FUNCTION(0x1, "gpio_out"),SUNXI_FUNCTION(0x2, "sdc1"), /* D2 */// 可以发现第二个参数恰好是 4,根据分析结果,以及结合上下文,正确的应该是 5SUNXI_FUNCTION_IRQ_BANK(0x6, 4, 4), /* PG_EINT4 */SUNXI_FUNCTION(0x7, "io_disabled")),SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),SUNXI_FUNCTION(0x0, "gpio_in"),SUNXI_FUNCTION(0x1, "gpio_out"),SUNXI_FUNCTION(0x2, "sdc1"), /* D3 */SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 5), /* PG_EINT5 */SUNXI_FUNCTION(0x7, "io_disabled")),......
};
修改之后的 pctl->irq_array 打印输出正确:

进行实测,PF4 已经可以正常的被设置为中断模式。
问题总结
全志原厂提供的 SoCs pinctrl driver 中的 PG4 中断信息描述错误,导致覆盖了 PF4 的引脚编号,因此只要修正 PG4 的描述信息,即可解决问题。
这个问题不仅仅会影响 PF4 无法使用,也会影响 PG4 引脚无法使用,从代码来看,想要设置为 PG4 为中断模式,实际修改的会 PA0(0)。
--- a/longan/kernel/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
+++ b/longan/kernel/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
@@ -693,7 +693,7 @@SUNXI_FUNCTION(0x0, "gpio_in"),SUNXI_FUNCTION(0x1, "gpio_out"),SUNXI_FUNCTION(0x2, "sdc1"), /* D2 */
- SUNXI_FUNCTION_IRQ_BANK(0x6, 4, 4), /* PG_EINT4 */
+ SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 4), /* PG_EINT4 */SUNXI_FUNCTION(0x7, "io_disabled")),SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),SUNXI_FUNCTION(0x0, "gpio_in"),相关文章:
【随笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析
相关信息 硬件平台:全志T507 系统版本:Android 10 / Linux 4.9.170 问题描述:PF4 无法通过标准接口设置为中断模式,而 PF1、PF2、PF3、PF5 正常可用。 分析过程 一开始以为是引脚被其它驱动占用引起,或者该引脚不具…...
人手一个 Midjourney,StableStudio 重磅开源!
人手一个 Midjourney,StableStudio 重磅开源! Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型,包含了 30 亿和 70 亿参数,并且支持商用。如今他们再次推出了 AI 图像生成平台 StableStudio,这…...
iptables防火墙(2)
iptables防火墙(2) 一、SNATSNAT应用环境SNAT原理SNAT转换前条件扩展 二、DNATDNAT应用环境DNAT原理DNAT转换前提条件扩展 三、防火墙规则的备份和还原导出(备份)所有表的规则导入(还原)规则 一、SNAT SNA…...
Windows和Kali上使用proxychains代理流量
Windows和Kali上使用proxychains代理流量 PS. 本文演示都是在kali进行的,如有出入还请联系我哦1. Linux(Debian)1.1. 检查一下是否有proxychains1.2 修改config文件 2. Linux(Debian)安装proxychians43. Windows3.1 下载3.2 配置 4. Windows下的配置5. 测试 PS. 写这…...
KEYSIGHT MSOS204A 2GHZ 4通道DSOS204A高清晰度示波器
KEYSIGHT是德DSOS204A/MSOS204A高清晰度示波器 附加功能: 2 GHz 带宽(可升级) 4 个模拟通道和 16 个数字通道 最大存储深度:800 Mpts(2 通道),400 Mpts(4 通道) 最大…...
最新Java适配商城系统
城前端功能展示 商城移动端 后端基于SpringBoot 研发,前端使用 Vue、uniapp开发 前后端分离,支持分布式部署,支持Docker,各个API独立,并且有独立的消费者 api不需要单独部署,只需启动一个jar包就可以正…...
【KVM虚拟化】· virsh管理命令
目录 🍁libvirt架构概述 🍁使用virsh管理虚拟机 🍂常用命令总结 🍁kvm基本功能管理 🍂帮助命令 🍂KVM的配置文件存放目录 🍂查看虚拟机状态 🍂虚拟机关机与开机 🍂强制虚…...
JS Es6中判断b数组对象是否有跟a数组对象相同的数值(例如:id),有的话就过滤掉
如下[数组]对象a和b let a[{id:1,value:this},{id:2,value:is}] let b[{id:1,value:hello},{id:3,value:world}]filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。 some() 方法用于检测数组中的元素是否满足指定条件&#x…...
python获取某电商平台口红数据并制作词云
目录标题 前言开发环境:模块使用数据来源分析代码展示获取数据制作词云 尾语 💝 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 开发环境: Python 3.8 Pycharm 模块使用 requests jieba 结巴分词 wordcloud 词云 第三方模块安装: win R 输…...
阿里成立AIDC,用“增长”解题国际化
随着阿里巴巴集团2023财年年报的披露,AIDC也随即浮出了水面。 AIDC是阿里国际数字商业集团的英文简称,AIDC即Alibaba International Digital Commerce。阿里是在5月18日公布的截至2023年3月31日的2023财年Q4及全年财报,财报数据之外ÿ…...
全面理解:在计算机科学中同步、异步、并行、并发,他们之间到底有什么区别,如果正确更好的区分它们?
同步,异步,并行,并发的基础概念 在计算机中同步的基础概念 在计算机科学中,同步(Synchronization)是指在多个过程或线程中,它们的执行在时间上是有序的。换句话说,要执行一个特定的…...
9、Ray核心框架介绍
9、Ray核心框架介绍 导航 1.简介和背景 2.Ray的基本概念和核心组件 3.分布式任务调度和依赖管理 4.对象存储和数据共享 5.Actor模型和并发编程 6.Ray的高级功能和扩展性 7.使用Ray构建分布式应用程序的案例研究 8.Ray社区和资源 9.核心框架介绍 10.扩展1...
【华为OD机试python】工单调度策略【 2023 Q1 A卷|100分】
华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! ■ 题目描述 当小区通信设备上报警时,系统会自动生成待处理的工单, 工单调度系统需要根据不同的策略,调度外线工程师(FME)上站去修复工单对应的问题。 根据与运营商签订的合同,不同严重程度…...
[论文阅读72]Parameter-Efficient Transfer Learning for NLP
1. 基本信息 题目论文作者与单位来源年份Parameter-Efficient Transfer Learning for NLPNeil Houlsby等Google Research,雅盖隆大学-波兰PMLR2019 Houlsby N, Giurgiu A, Jastrzebski S, et al. Parameter-efficient transfer learning for NLP[C]//Internationa…...
0基础转行居然拿到9.5K!尘埃深处是繁花,强者从未停下!
人总是越长大越胆小,很多事情不敢做,以后就更不敢做了。 为梦想颠簸的人有很多,可能不差你这个,不如意的时候我们都会想要放弃,但是生活不是一个点,它是一条长长的线,唯有行动,才能摆…...
软考初级程序员上午单选题(13)
1、下列不能兼作输入设备和输出设备的是______。 A.可擦除型光盘 B.软盘 C.硬盘 D.键盘 2、文件型计算机病毒主要感染______。 A..TXT文件 B..GIF文件 C..EXE文件 D..MP3文件 3、_…...
【WSN覆盖】基于麻雀搜索算法的三维无线传感器网络覆盖优化 三维WSN覆盖优化【Matlab代码#26】
文章目录 【可更换其他算法,获取资源请见文章第5节:资源获取】1. SSA算法2. 三维覆盖模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法,获取资源请见文章第5节:资源获取】 1. SSA算法 2. 三维覆盖模型 三维覆盖模…...
【学习日记2023.5.20】 之 菜品模块完善
文章目录 3. 功能模块完善之菜品模块3.1 公共字段自动填充3.1.1 问题分析3.1.2 实现思路3.1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 3.1.4 功能测试3.1.5 提交代码 3.2 新增菜品3.2.1 需求分析与设计3.2.2 代码开发3.2.2.1 文件上传实现3.2.2.2 新增菜品实现 3.2.3 功…...
MySQL高级SQL语句
创建两个表用于演示 location store_info use kgc; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into lo…...
rem和em的区别和使用场景,以及如何在实际开发中灵活运用它们
在前端开发中,我们经常使用rem和em作为长度单位来设置页面元素的大小。虽然它们都可以用于实现响应式布局,但是它们之间存在着一些区别。本文将深入探讨rem和em的区别和使用场景,以及如何在实际开发中灵活运用它们。 什么是rem rem是相对于…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
HTML中各种标签的作用
一、HTML文件主要标签结构及说明 1. <!DOCTYPE html> 作用:声明文档类型,告知浏览器这是 HTML5 文档。 必须:是。 2. <html lang“zh”>. </html> 作用:包裹整个网页内容,lang"z…...
npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...
