S3C6410 中的 cascaded irqdomain 之 gpio

文章目录

  • VIC 中断 与 gpio 中断 的硬件拓扑图描述
  • linux cascaded irq domain
    • irq domain 初始化时
    • 获取 IRQ number(软件中断号) 时
    • 中断发生时
    • 如何调试
    • linux irq domain 实例
  • VIC domain 与 gpio domain 的硬件拓扑语言描述
    • VIC 与 INT_EINTx 的关系
    • INT_EINTx 与 GPIO的关系
      • INT_EINT0
      • INT_EINT1
      • INT_EINT2
      • INT_EINT3
      • INT_EINT4
        • INT_EINT4 与 External interrupt Group1-9 的关系
        • External interrupt Group1
        • External interrupt Group2
        • External interrupt Group3
        • External interrupt Group4
        • External interrupt Group5
        • External interrupt Group6
        • External interrupt Group7
        • External interrupt Group8
        • External interrupt Group9

VIC 中断 与 gpio 中断 的硬件拓扑图描述

以下是 s3c6410a 的 irq 拓扑 描述,着重凸显了 gpio irq
以下 每个颜色 的gpio 共享一个vic 的中断线,5 个 中断线
-----------
注意 : 在linux 里面,将每个 gpx 注册为了一个domain!!!

在这里插入图片描述

linux cascaded irq domain

  • irq domain & 级联(cascaded)irq domain

irq domain 初始化时

s3c64xx_eint_eint0_init
	// 0. 处理 parents interrupt console 相关的 中断处理函数
	for (i = 0; i < NUM_EINT0_IRQ; ++i) { // 设置 parent 相关的irq
		irq = irq_of_parse_and_map(eint0_np, i);
		irq_set_chained_handler_and_data(irq, s3c64xx_eint0_handlers[i], data);
	}
	// 1. 创建 irq domain
	for (i = 0; i < d->nr_banks; ++i, ++bank) 
		bank->irq_domain = irq_domain_add_linear(bank->of_node, nr_eints, &s3c64xx_eint0_irqd_ops, ddata);
		// irq_domain_add_simple 的 第三个参数 first_irq如果为0 ,效果等同于 irq_domain_add_linear
		// first_irq: first number of irq block assigned to the domain,
		// pass zero to assign irqs on-the-fly. If first_irq is non-zero, then
		// pre-map all of the irqs in the domain to virqs starting at first_irq.
		// 如果第三个参数 不等于0 ,则 在该函数中 做 irq_create_mapping

获取 IRQ number(软件中断号) 时


使用domain 映射号码
	irq_create_mapping/irq_create_mapping_affinity
		// 2. 获取 软件中断号  并 创建 descs
		virq = irq_find_mapping(domain, hwirq);
		virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node), affinity);
		// 3. 绑定 domain 中的软件中断号 和 硬件中断号
			// 用domain 的 map函数 设置 高层 handler
		irq_domain_associate(domain, virq, hwirq)
			irq_set_chip_and_handler(virq, &s3c64xx_eint0_irq_chip, handle_level_irq);

中断发生时

  • 非级联的中断发生流程
一旦发生硬件中断,经过CPU architecture相关的中断代码之后,会调用irq handler,该函数的一般过程如下:

(1)首先找到root interrupt controller对应的irq domain。

(2)根据HW 寄存器信息和irq domain信息获取HW interrupt ID

(3)调用irq_find_mapping找到HW interrupt ID对应的irq number

(4)调用handle_IRQ(对于ARM平台)来处理该irq number
  • 级联中断发生流程

按照当前 gpio 级联到 vic
假设 vic0 是 A, GPN0-3的domain 是 B
假设 GPN0 发生了中断

A.1首先找到root interrupt controller(在这里是vic)对应的irq domain  // 关注 irq_set_chip_data irq_get_chip_data 
A.2根据VIC HW 寄存器信息和irq domain信息获取HW interrupt ID  // VIC0的 0
A.3调用irq_find_mapping找到HW interrupt ID(在这里是0)对应的irq number
A.4调用irq domain B 注册 的 handler( irq_set_chained_handler 设定的gpio_handle_irq_cascaded)

B.1gpio_handle_irq_cascaded找到gpio对应的irq domain // 和 A.1 中的irq domain完全不同// 关注 irq_set_chip_data irq_get_chip_data 
B.2根据GPIO HW 寄存器信息和irq domain信息获取HW interrupt ID // 和 A.2 中的HW interrupt ID完全不同
B.3调用irq_find_mapping找到HW interrupt ID对应的irq number // 和 A.3 中的 irq number 完全不同
B.4调用 驱动 注册 的 handler( request_irq 设定的) // 这个驱动对应的设备用到了 GPN0

如何调试

CONFIG_DYNAMIC_DEBUG=y
CONFIG_DEBUG_FS=y
CONFIG_GENERIC_IRQ_DEBUGFS=y
----------------
kernel/irq/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 
+ccflags-y += -DDEBUG -DVERBOSE_DEBUG
# pwd
/sys/kernel/debug/irq
# ls
domains  irqs
# ls -l 
total 0
drwxr-xr-x    2 root     root             0 Jan  1 00:00 domains
drwxr-xr-x    2 root     root             0 Jan  1 00:00 irqs

以下的文件都可以读

./domains:
:soc:interrupt-controller@71200000  :soc:pinctrl@7f008000:gph
:soc:interrupt-controller@71300000  :soc:pinctrl@7f008000:gpl
:soc:pinctrl@7f008000:gpa           :soc:pinctrl@7f008000:gpm
:soc:pinctrl@7f008000:gpb           :soc:pinctrl@7f008000:gpn
:soc:pinctrl@7f008000:gpc           :soc:pinctrl@7f008000:gpo
:soc:pinctrl@7f008000:gpd           :soc:pinctrl@7f008000:gpp
:soc:pinctrl@7f008000:gpf           :soc:pinctrl@7f008000:gpq
:soc:pinctrl@7f008000:gpg           default

./irqs:
0   10  12  14  16  18  2   21  23  25  27  29  30  32  4   6   8
1   11  13  15  17  19  20  22  24  26  28  3   31  33  5   7   9

linux irq domain 实例

irq: Added domain :soc:interrupt-controller@71200000
irq: Added domain :soc:interrupt-controller@71300000
irq: Added domain :soc:pinctrl@7f008000:gpa
irq: Added domain :soc:pinctrl@7f008000:gpb
irq: Added domain :soc:pinctrl@7f008000:gpc
irq: Added domain :soc:pinctrl@7f008000:gpd
irq: Added domain :soc:pinctrl@7f008000:gpf
irq: Added domain :soc:pinctrl@7f008000:gpg
irq: Added domain :soc:pinctrl@7f008000:gph
irq: Added domain :soc:pinctrl@7f008000:gpo
irq: Added domain :soc:pinctrl@7f008000:gpp
irq: Added domain :soc:pinctrl@7f008000:gpq
irq: Added domain :soc:pinctrl@7f008000:gpl
irq: Added domain :soc:pinctrl@7f008000:gpm
irq: Added domain :soc:pinctrl@7f008000:gpn
irq: Added domain :soc:pinctrl@7f008000:gpn
irq: -> using domain @c0889d80
SUD File: kernel/irq/irqdomain.c, Line: 00557: irq_domain_associate,domain:c0889d80,virq:33,hwirq:7
SUD File: kernel/irq/irqdomain.c, Line: 00559: irq_domain_associate,c024afa8 // s3c64xx_eint0_irq_map domain->ops->map
SUD File: kernel/irq/irqdomain.c, Line: 00499: irq_domain_set_mapping,7,16
irq: irq 7 on domain gpn mapped to virtual irq 33

VIC domain 与 gpio domain 的硬件拓扑语言描述

VIC 与 INT_EINTx 的关系

Int. No.SourcesDescriptionGroup
53INT_EINT4External interrupt Group 1 ~ Group 9VIC1
33INT_EINT3External interrupt Group 0 20 ~ 27VIC1
32INT_EINT2External interrupt Group 0 12 ~ 19VIC1
1INT_EINT1External interrupt Group 0 4 ~ 11VIC0
0INT_EINT0External interrupt Group 0 0 ~ 3VIC0

INT_EINTx 与 GPIO的关系

INT_EINT0

External interrupt Group 0  0 - 15  <===> GPN0-GPN15
	GPN0-3			: 0
	GPN4-11			: 1
	GPN12-15 & GPL8-GPL11 : 32
External interrupt Group 0  16 - 22 <===> GPL8-GPL14
	GPL12-GPL14 & GPM0-GPM4 : 33
External interrupt Group 0  23 - 27 <===> GPM0-GPM4

INT_EINT1

External interrupt Group 0  0 - 15  <===> GPN0-GPN15
External interrupt Group 0  16 - 22 <===> GPL8-GPL14
External interrupt Group 0  23 - 27 <===> GPM0-GPM4

INT_EINT2

External interrupt Group 0  0 - 15  <===> GPN0-GPN15
External interrupt Group 0  16 - 22 <===> GPL8-GPL14
External interrupt Group 0  23 - 27 <===> GPM0-GPM4

INT_EINT3

External interrupt Group 0  0 - 15  <===> GPN0-GPN15
External interrupt Group 0  16 - 22 <===> GPL8-GPL14
External interrupt Group 0  23 - 27 <===> GPM0-GPM4

INT_EINT4

INT_EINT4 与 External interrupt Group1-9 的关系

在这里插入图片描述

External interrupt Group1

EINT1 0 - 7   <===> GPA 0 - 7
EINT1 8 - 14  <===> GPB 0 - 6

External interrupt Group2

EINT2 0 - 7   <===> GPC 0 - 7

External interrupt Group3

EINT3 0 - 4   <===> GPD 0 - 4

External interrupt Group4

EINT4 0 - 13   <===> GPF 0 - 13

External interrupt Group5

EINT5 0 - 6   <===> GPG 0 - 6

External interrupt Group6

EINT6 0 - 9   <===> GPH 0 - 9

External interrupt Group7

EINT7 0 - 15   <===> GPO 0 - 7

External interrupt Group8

EINT8 0 - 14   <===> GPP 0 - 7

External interrupt Group9

EINT9 0 - 8   <===> GPQ 0 - 8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数电中需要注意的问题

逻辑函数表达式之间的相互转换 &#xff08;更多请详见PPT&#xff09;若题目要求用&#xff1a; 与非门实现逻辑函数&#xff0c;则画卡诺图圈出值为1的然后化简 或非门实现逻辑函数&#xff0c;则画卡诺图圈出值为0的然后化简 与或非门实现逻辑函数&#xff0c;则画卡诺图圈…

c++ 构造函数与析构函数

c构造函数&#xff1a; (1)构造函数名必须与类名相同 (2)无返回值 (3)访问权限符一般设置为public (4)无自定义构造函数&#xff0c;编译器提供默认构造函数&#xff0c;构造函数只调用一次 c析构函数&#xff1a; (1)析构函数与类名相同&#xff0c;前面加~符号 (2)析构…

纯比例控制为什么会存在稳态误差,用纯增益系统举例

warning: 本文仅为个人思考&#xff0c;非常不严谨甚至可能会出现严重错误&#xff0c;请读者仔细甄别&#xff0c;若本文真的存在严重错误&#xff0c;恳请评论区纠正&#xff0c;我看到将会考虑修改或者删除文章 纯比例控制存在稳态误差是由其本质&#xff08;控制逻辑&#…

精炼计算机网络——物理层(一)

文章目录 前言2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 总结 前言 经历了两篇文章的学习&#xff0c;相信读者们一定对计算机网络有了一个基础的了解。接…

一个新的ubuntu

1 安装cmake 方法一&#xff1a;现成的教程 ubuntu安装cmake_yuanzhoulvpi的博客-CSDN博客 方法二&#xff1a;自己总结的 安装openssl系统&#xff1a;sudo apt-get install libssl-dev 安装&#xff1a;sudo apt-get install build-essential 以上是防止安装cmake时缺少文…

PS磨皮插件portraiture最新版磨皮工具

Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;无需手动调整&#xff0c;大大提高P图效率。全新4版本&#xff0c;升级AI算法&#xff0c;并独家支持多人及全身模式…

I2C工作流程

FM33A0XX的I2C接口只用作主机&#xff0c;且不支持多主机&#xff0c;因此挂在总线上的其他设备都是从机。总线上总是由主机提供同步时钟SCL&#xff0c;SDA数据流方向可以是主机发送从机接收&#xff0c;或者从机发送主机接收。 数据发送流程 1、主机发起 START 时序 2、主机…

C++之基础总结

目录 POD类型左值和右值静态全局变量(static)类型转换const/constexprconstconstexpr C中的关键字union基础知识点编译与函数参数入栈总结一些常见用法归纳&#xff1a; POD类型 平凡的和标准布局的——貌似和深度探索C对象模型中关于按位拷贝冲突 平凡的定义&#xff1a;符合…

Camtasia2023最好用的电脑屏幕录制软件

Camtasia2023是市场上最好的录像机和屏幕录制软件之一。强大的软件视频编辑程序的Camtasia 适用于Windows和iOS。 它支持多种流行的媒体格式&#xff0c;并对您创建的视频提供令人印象深刻的控制范围。3000多万专业人士在全球范围内使用Camtasia展示产品&#xff0c;教授课程&a…

文字的显示

文字的显示 文章目录 文字的显示1.文字编码方式2.英文和汉字的点阵显示3.显示中文“中”和“A”show_font.c结果 1.文字编码方式 数字>代表什么->显示为什么 GBK国标拓展 下列代码用不同编码方式保存utf-8.c ansi.c #include <stdio.h>int main(int argc ,char *…

网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))

文章目录 1. 什么是网络编程2. 网络编程中的基本概念1&#xff09;发送端和接收端2&#xff09;请求和响应3&#xff09;客户端和服务端4&#xff09;常见的客户端服务端模型 3. Socket 套接字1&#xff09;Socket 的分类2&#xff09;Java 数据报套接字通信模型3&#xff09;J…

基于Open3D的点云处理2-Open3D的IO与数据转换

三维数据类型 点云 某个坐标系下的点数据集&#xff0c;每个点包括三维坐标X&#xff0c;Y&#xff0c;Z、颜色、分类值、强度值、时间等信息&#xff1b; 储存格式&#xff1a;pts、LAS、PCD、xyz、asc、ply等&#xff1b;Mesh 多边形网格&#xff0c;常见的是三角网格&#…

有研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具(上)

导语&#xff1a;研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具。 Dell PFS BIOS提取器 介绍 解析 Dell PFS BIOS 映像并提取其 SPI/BIOS/UEFI 固件组件。它支持所有Dell PFS 修订版和格式&#xff0c;包括最初在 ThinOS 包中LZMA压缩、ZLIB压缩或拆分成块的格式。输出…

Kafka上的优化经验

1. 平滑扩容 Motivation kafka扩容⼀台新机器的流程 假如集群有 3 个 broker &#xff0c;⼀共有 4 个 TP &#xff0c;每个 3 副本&#xff0c;均匀分布。现在要扩容⼀台机器&#xff0c; 新 broker 加⼊集群后需要通过⼯具进⾏ TP 的迁移。⼀共迁移 3 个 TP 的副…

Spring Boot集成ShardingSphere实现按月数据分片及创建自定义分片算法 | Spring Cloud 44

一、前言 在前面我们通过以下章节对数据分片有了基础的了解&#xff1a; Spring Boot集成ShardingSphere实现数据分片&#xff08;一&#xff09; | Spring Cloud 40 Spring Boot集成ShardingSphere实现数据分片&#xff08;二&#xff09; | Spring Cloud 41 Spring Boot集…

权限提升:信息收集 .(Linux系统)

权限提升&#xff1a;信息收集. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通过 Webshel…

1.1 基于B/S 结构的 Web 应用

文章目录 1.1 基于B/S 结构的 Web 应用1.2 JDK安装与配置1.3 服务器Tomcat下载与安装1.4 Eclipse安装与使用1.4.1 Eclipse 下载及创建Dynamic Web Project1.4.2 Eclipse 中的编码问题1.4.3 将Tomcat和Eclipse相关联1.4.4 Eclipse 自动部署项目到 Tomcat 的 webapps 目录 1.5 My…

【AWS入门】AWS Lamda

目录 创建一个Lamda函数用Lamda函数控制启停EC2实例创建一台EC2实例创建角色创建lamda函数 使用Amazon EventBridge计划启停实例创建EventBridge 用户往S3存储桶上传图片文件&#xff0c;触发Lambda函数&#xff0c;将图片压缩并上传至另一个存储桶创建两个存储桶通过Cloudform…

【SpringMVC】| SpringMVC执行流程原理 | 常用注解 剥析

MVC目录 一. &#x1f981; MVC模型二. &#x1f981; SpringMVC1. SpringMVC执行流程&#xff08;重点&#xff09;Ⅰ. SpringMVC四大组件Ⅱ. 执行流程 2. RequestMapping3. RequestParam4. ReuqestHeader & CookieValue5. RESTful风格支持Ⅰ. 传统 vs restfulⅡ. PathVar…

【网络技术】什么是CNI

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 Never look back unless you are planning to go that way. 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用…