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

【随笔记】全志 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 引脚无法被正常设置为中断模式的问题分析

相关信息 硬件平台&#xff1a;全志T507 系统版本&#xff1a;Android 10 / Linux 4.9.170 问题描述&#xff1a;PF4 无法通过标准接口设置为中断模式&#xff0c;而 PF1、PF2、PF3、PF5 正常可用。 分析过程 一开始以为是引脚被其它驱动占用引起&#xff0c;或者该引脚不具…...

人手一个 Midjourney,StableStudio 重磅开源!

人手一个 Midjourney&#xff0c;StableStudio 重磅开源&#xff01; Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型&#xff0c;包含了 30 亿和 70 亿参数&#xff0c;并且支持商用。如今他们再次推出了 AI 图像生成平台 StableStudio&#xff0c;这…...

iptables防火墙(2)

iptables防火墙&#xff08;2&#xff09; 一、SNATSNAT应用环境SNAT原理SNAT转换前条件扩展 二、DNATDNAT应用环境DNAT原理DNAT转换前提条件扩展 三、防火墙规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;还原&#xff09;规则 一、SNAT SNA…...

Windows和Kali上使用proxychains代理流量

Windows和Kali上使用proxychains代理流量 PS. 本文演示都是在kali进行的&#xff0c;如有出入还请联系我哦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高清晰度示波器 附加功能&#xff1a; 2 GHz 带宽&#xff08;可升级&#xff09; 4 个模拟通道和 16 个数字通道 最大存储深度&#xff1a;800 Mpts&#xff08;2 通道&#xff09;&#xff0c;400 Mpts&#xff08;4 通道&#xff09; 最大…...

最新Java适配商城系统

城前端功能展示 商城移动端 后端基于SpringBoot 研发&#xff0c;前端使用 Vue、uniapp开发 前后端分离&#xff0c;支持分布式部署&#xff0c;支持Docker&#xff0c;各个API独立&#xff0c;并且有独立的消费者 api不需要单独部署&#xff0c;只需启动一个jar包就可以正…...

【KVM虚拟化】· virsh管理命令

目录 &#x1f341;libvirt架构概述 &#x1f341;使用virsh管理虚拟机 &#x1f342;常用命令总结 &#x1f341;kvm基本功能管理 &#x1f342;帮助命令 &#x1f342;KVM的配置文件存放目录 &#x1f342;查看虚拟机状态 &#x1f342;虚拟机关机与开机 &#x1f342;强制虚…...

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() 方法创建一个新的数组&#xff0c;新数组中的元素是通过检查指定数组中符合条件的所有元素。 some() 方法用于检测数组中的元素是否满足指定条件&#x…...

python获取某电商平台口红数据并制作词云

目录标题 前言开发环境:模块使用数据来源分析代码展示获取数据制作词云 尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 开发环境: Python 3.8 Pycharm 模块使用 requests jieba 结巴分词 wordcloud 词云 第三方模块安装&#xff1a; win R 输…...

阿里成立AIDC,用“增长”解题国际化

随着阿里巴巴集团2023财年年报的披露&#xff0c;AIDC也随即浮出了水面。 AIDC是阿里国际数字商业集团的英文简称&#xff0c;AIDC即Alibaba International Digital Commerce。阿里是在5月18日公布的截至2023年3月31日的2023财年Q4及全年财报&#xff0c;财报数据之外&#xff…...

全面理解:在计算机科学中同步、异步、并行、并发,他们之间到底有什么区别,如果正确更好的区分它们?

同步&#xff0c;异步&#xff0c;并行&#xff0c;并发的基础概念 在计算机中同步的基础概念 在计算机科学中&#xff0c;同步&#xff08;Synchronization&#xff09;是指在多个过程或线程中&#xff0c;它们的执行在时间上是有序的。换句话说&#xff0c;要执行一个特定的…...

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&#xff0c;雅盖隆大学-波兰PMLR2019 Houlsby N, Giurgiu A, Jastrzebski S, et al. Parameter-efficient transfer learning for NLP[C]//Internationa…...

0基础转行居然拿到9.5K!尘埃深处是繁花,强者从未停下!

人总是越长大越胆小&#xff0c;很多事情不敢做&#xff0c;以后就更不敢做了。 为梦想颠簸的人有很多&#xff0c;可能不差你这个&#xff0c;不如意的时候我们都会想要放弃&#xff0c;但是生活不是一个点&#xff0c;它是一条长长的线&#xff0c;唯有行动&#xff0c;才能摆…...

软考初级程序员上午单选题(13)

1、下列不能兼作输入设备和输出设备的是______。 A&#xff0e;可擦除型光盘 B&#xff0e;软盘 C&#xff0e;硬盘 D&#xff0e;键盘 2、文件型计算机病毒主要感染______。 A&#xff0e;.TXT文件 B&#xff0e;.GIF文件 C&#xff0e;.EXE文件 D&#xff0e;.MP3文件 3、_…...

【WSN覆盖】基于麻雀搜索算法的三维无线传感器网络覆盖优化 三维WSN覆盖优化【Matlab代码#26】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. SSA算法2. 三维覆盖模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 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的区别和使用场景,以及如何在实际开发中灵活运用它们

在前端开发中&#xff0c;我们经常使用rem和em作为长度单位来设置页面元素的大小。虽然它们都可以用于实现响应式布局&#xff0c;但是它们之间存在着一些区别。本文将深入探讨rem和em的区别和使用场景&#xff0c;以及如何在实际开发中灵活运用它们。 什么是rem rem是相对于…...

Outlook邮箱爆满无法接收邮件怎么办?一篇文章教你用“归档”快速释放空间

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

nuScenes 与 nuImages 对比分析:两大数据集工具使用全攻略

nuScenes 与 nuImages 对比分析&#xff1a;两大数据集工具使用全攻略 【免费下载链接】nuscenes-devkit The devkit of the nuScenes dataset. 项目地址: https://gitcode.com/gh_mirrors/nu/nuscenes-devkit nuScenes 与 nuImages 是自动驾驶领域的两大重要数据集&…...

用了这么久 Claude Code,你可能从来没打开过它最重要的文件夹!

点击上方卡片关注我设置星标 学习更多AI出海知识装完 Claude Code 跑第一个项目的时候&#xff0c;根目录会多出一个 .claude/ 文件夹。大部分人看到了&#xff0c;没点开过&#xff0c;也没想过里面有什么。这就错过了 Claude Code 最值得折腾的部分。.claude/ 不是缓存目录&a…...

Unity微信小游戏包体瘦身实战:搞定代码剪裁与TMP字体优化,首包加载快一倍

Unity微信小游戏包体瘦身实战&#xff1a;代码剪裁与TMP字体优化全攻略 微信小游戏的WASM包体大小直接影响用户首次进入游戏的体验。当包体过大时&#xff0c;不仅下载耗时增加&#xff0c;编译时间也会显著延长。本文将深入探讨两种最有效的包体优化方案&#xff1a;代码剪裁与…...

Multisim电路仿真与Qwen3.5-2B结合:自动化生成电路分析报告

Multisim电路仿真与Qwen3.5-2B结合&#xff1a;自动化生成电路分析报告 1. 电子工程师的设计痛点 每个电子工程师都经历过这样的场景&#xff1a;在Multisim中反复调整电路参数&#xff0c;盯着示波器波形来回对比&#xff0c;手动记录各项性能指标&#xff0c;最后还要花大量…...

不止于测距:用蓝桥杯开发板DIY一个简易超声波倒车雷达(含蜂鸣器报警)

从测距到实战&#xff1a;蓝桥杯开发板打造智能超声波雷达系统 第一次倒车时听到蜂鸣器急促的"滴滴"声&#xff0c;我意识到这个简单的超声波模块能做的远不止显示数字。作为参加过蓝桥杯的电子爱好者&#xff0c;我们手头的开发板其实蕴藏着解决实际问题的潜力——…...

STK 9.2.2 实战:手把手教你用TLE文件导入中国空间站轨道数据

STK 9.2.2 实战&#xff1a;手把手教你用TLE文件导入中国空间站轨道数据 航天仿真领域的新手们常常被一个问题困扰&#xff1a;如何在自己的STK项目中快速添加真实卫星轨道数据&#xff1f;本文将带你从零开始&#xff0c;一步步完成中国空间站轨道数据的导入&#xff0c;避开那…...

FastAPI Pydantic配置终极指南:如何高效管理数据验证与API文档

FastAPI Pydantic配置终极指南&#xff1a;如何高效管理数据验证与API文档 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI框架…...

粒子群算法调参指南:如何避免陷入局部最优(附非线性递减权重实现)

粒子群算法调参实战&#xff1a;非线性权重策略与全局优化技巧 粒子群优化算法&#xff08;PSO&#xff09;作为群体智能领域的经典方法&#xff0c;其性能高度依赖参数配置。许多工程师在基础应用阶段能够获得可接受的结果&#xff0c;但当问题复杂度提升时&#xff0c;常常陷…...

快速上手Qwen3-ASR-0.6B:无需代码基础,Gradio界面点点鼠标就能用

快速上手Qwen3-ASR-0.6B&#xff1a;无需代码基础&#xff0c;Gradio界面点点鼠标就能用 1. 零门槛语音识别体验 语音识别技术正在改变我们与设备交互的方式&#xff0c;但对于非技术人员来说&#xff0c;部署和使用专业模型往往存在门槛。Qwen3-ASR-0.6B通过预置的Gradio界面…...