OK6410A 开发板 (八) 12 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 irq

发布者:chwwdch最新更新时间:2022-09-16 来源: csdn关键字:OK6410A  开发板  11  start_kernel  irq 手机看文章 扫描二维码
随时随地手机看文章

irq 涉及的概念

1. 硬件A : 异常向量表

2. 硬件A : irq硬件流程及建议的软件流程

3. 硬件B : 芯片实现的中断控制器

数据手册 12 VECTORED INTERRUPT CONTROLLERS P409

4. 软件A : linux中断处理的软件流程(irq部分)

5. 软件B : linux中断处理的软件流程(中断控制器部分)

6. 软件C : linux中断处理的软件流程(irq_desc部分)


硬件

2个VIC(Vectored Interrupt Controller, ARM PrimeCell

PL192)

2个TZIC(TrustZone Interrupt Controller, SP890)

1个VIC支持32个中断源

可编程的  interrupt priority levels 和 可编程的 interrupt priority level masking

可产生 FIQ IRQ 和 SWI 异常

可查询的 Raw interrupt status/Interrupt request status


start_kernel

local_irq_disable

// include/linux/irqflags.h

// 224 #define local_irq_disable() do { raw_local_irq_disable(); } while (0)

// 155 #define raw_local_irq_disable()     arch_local_irq_disable()

// arch/arm/include/asm/irqflags.h

// 46 #define arch_local_irq_disable arch_local_irq_disable

// 47 static inline void arch_local_irq_disable(void)                                  

// 48 {                                                                                

// 49     asm volatile(                                                                

// 50         "   cpsid i         @ arch_local_irq_disable"                            

// 51         :                                                                        

// 52         :                                                                        

// 53         : "memory", "cc");                                                       

// 54 } 

early_boot_irqs_disabled = true;

// init/main.c

// 124 bool early_boot_irqs_disabled __read_mostly;

early_irq_init

// kernel/irq/irqdesc.c

// 521 int __init early_irq_init(void)

// 打印信息

// NR_IRQS: 16, nr_irqs: 229, preallocated irqs: 229


// 流程: 

// 1. 计算 NR_IRQS nr_irqs initcnt

// 2. 根据 initcnt 的数量(229),创建(229个) irq_desc ,并插入数据结构(radix_tree) 变量 irq_desc_tree 中

init_IRQ

// arch/arm/kernel/irq.c

// 78 void __init init_IRQ(void)

// 打印信息

/*

S3C6410 clocks: apll = 532000000, mpll = 532000000

        epll = 96000000, arm_clk = 532000000

VIC @(ptrval): id 0x00041192, vendor 0x41

irq: Cannot allocate irq_descs @ IRQ32, assuming pre-allocated

VIC @(ptrval): id 0x00041192, vendor 0x41

irq: Cannot allocate irq_descs @ IRQ64, assuming pre-allocated

*/

// 流程:

// 1. 调用 machine_desc->init_irq/即s3c6410_init_irq 做 芯片的 irq 初始化(vic)


s3c6410_init_irq

s3c64xx_init_irq(~0 & ~(1 << 7), ~0);

s3c64xx_clk_init(NULL, xtal_f, xusbxti_f, soc_is_s3c6400(), S3C_VA_SYS);

// void __init vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources);

/*

// map.pfn:71200,map.virtual:f6000000,map.length:4000,map.type:0 // S3C64XX_PA_VIC0

// map.pfn:71300,map.virtual:f6010000,map.length:4000,map.type:0 // S3C64XX_PA_VIC1

*/

/* VIC0 is missing IRQ7, VIC1 is fully populated. */

// 0xf6000000,0x20,0xffffff7f,0x4

// hwirq_max 编号  < 0x20 , 不等于 0x20

vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME);

// 0xf6010000,0x40,0xffffffff,0x53020000

// hwirq_max 为0x40

vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME);

__vic_init

vic_disable(base);

vic_clear_interrupts(base);

vic_init2(base);

vic_register(base, NULL, irq_start, vic_sources, resume_sources, NULL);

填充vic_devices[0,1]

set_handle_irq(vic_handle_irq);

handle_arch_irq = vic_handle_irq;

v->irq = IRQ_VICx_BASE;


// 建立 硬件中断号与软件中断号的映射


// 1.向系统注册一个irq domain 

// 因为 一个硬件系统可能有多个 中断控制器

//  A中断控制器的硬件中断号 无法与 B中断控制器的硬件中断号区分

// 所以加了一层 irq domain

// 目前 是 软件中断号 <-> domain <-> 硬件中断号

v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, &vic_irqdomain_ops, v);

// 2. 建立 该 domain 内的硬件中断号与软件中断号的映射

// 建立HW interrupt ID和IRQ number的映射关系。

// 该接口函数以irq domain和HW interrupt ID为参数,返回IRQ number(这个IRQ number是动态分配的)

针对每一个 irq source ,irq_create_mapping(v->domain, i);

// vic_sources : 有效的中断源, bit 为 1 ,表示 有效

// resume_sources : 可以resume唤醒的中断源 , bit 为 1 , 表示 有效


其他

硬件中断号 <-> domain <-> 软件中断号 是 通过 什么结构体 关系到一起的


irq_create_mapping -> irq_create_mapping_affinity -> irq_domain_associate(domain, virq, hwirq)

int irq_domain_associate(struct irq_domain *domain, unsigned int virq, irq_hw_number_t hwirq)

struct irq_data *irq_data = irq_get_irq_data(virq); 

struct irq_desc *desc = irq_to_desc(irq); // 通过 irq 找到 irq_desc  , 这个关系被封印在了 数据结构 radix_tree 中 

radix_tree_lookup(&irq_desc_tree, irq);

return desc ? &desc->irq_data : NULL;

irq_data->hwirq = hwirq; // irq_desc 中存在着 irq_data->hwirq 

irq_data->domain = domain; // irq_desc 中存在着 irq_data->domain 


相关代码

$ ls kernel/irq

autoprobe.c  debug.h   dummychip.c     handle.c     irqdesc.c    Kconfig   manage.c  proc.c    settings.h

chip.c       devres.c  generic-chip.c  internals.h  irqdomain.c  Makefile  pm.c      resend.c  spurious.c

$ ls drivers/irqchip/

irqchip.c  irq-vic.c  Kconfig  Makefile


# cat /proc/interrupts 

           CPU0      

软件中断号 次数  中断控制器 硬件中断号(有的是vic0上的,有的是vic1上的) 中断触发 中断名称 

 58:          0       VIC  26 Edge      s3c2410-wdt

 59:     757035       VIC  27 Edge      samsung_time_irq

 62:     478966       VIC  30 Edge      s3c-lcd

 69:        183       VIC   5 Edge      s3c6400-uart

 79:         25       VIC  15 Edge      ohci_hcd:usb1

 88:         35       VIC  24 Edge      mmc0

108:      87366  s3c-eint     Level     eth0

Err:          0


驱动如何使用 中断

1. 根据 硬件中断号/或引脚id 找到 软件中断号

platform_get_resource(pdev, IORESOURCE_IRQ, 0); 等

2. 根据 软件中断号 申请 handler

request_threaded_irq/request_irq

关键字:OK6410A  开发板  11  start_kernel  irq 引用地址:OK6410A 开发板 (八) 12 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 irq

上一篇:OK6410A 开发板 (八) 13 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 console
下一篇:OK6410A 开发板 (八) 11 linux-5.11 OK6410A start_kernel 打印角度 第一阶段 mem

推荐阅读最新更新时间:2024-11-02 16:10

iOS 11.2传漏洞 苹果修正下周软件更新
电子网消息,据9to5Mac报导,iOS 11.2操作系统出现安全漏洞,黑客 能从远程控制支持HomeKit智能家庭平台的设备,苹果已从服务器端采取紧急措施来修正此问题。 9to5Mac报导指出,这项安全漏洞可在用户未授权的情况下,让黑客控制连接到HomeKit平台的设备,包括智能照明、自动调温器、智能插座等,甚至可从远程开启智能门锁或连网的车库门。 根据苹果向9to5Mac发布的声明,这项影响iOS11.2系统中HomeKit用户的问题已被修正,苹果从服务器端暂时关闭了HomeKit的共享功能,预计下周释出软件更新。
[手机便携]
基于HX711数显称重仪的设计
本文设计的数显称重仪是基于电阻应变式传感器、以单片机为控制核心的称重控制显示系统,测量范围为0-10kg,测量精度±2g,液晶屏显示测量数据,同时可将多次测量数据通过串口送计算机显示。该系统具有精度高、性能稳定、操作简便等特点。称重仪设计框图如下图1所示: 图1 称重仪设计框图 1、硬件电路设计 1.1、称重传感器 电阻应变式称重传感器由电阻应变片、弹性体和检测电路等几个主要部分组成。弹性体在外力作用下产生弹性变形,使粘贴在他表面的电阻应变片也随同产生变形,电阻应变片变形后,它的阻值将发生变化(增大或减小),再经相应的测量电路把这一电阻变化转换为电信号(电压或电流),从而完成了将外力变换为电信号的过程。 检测电路如图2
[单片机]
基于HX7<font color='red'>11</font>数显称重仪的设计
华为家用新能源充电桩上线:最高功率11kW 可远程操控
电动车车主都想要的家用充电桩,也能买到华为产品了。6月9日消息,华为本月上线了“家充桩”新能源汽车充电桩,是一款针对家庭用户打造的交流充电桩,最高支持11kW充电规格,内置智能平台,可远程操控并分享给亲友家人使用。 华为“家充桩”控制盒表面采用钢化玻璃面板制作,桩体上设置了急停按钮,安全方面支持过流保护、欠压保护、防雷保护、过压保护、漏电保护等安全防护措施。 枪线长度为7.3m,枪头内置温度检测功能,防止充电过热,枪头采用国标7孔标准,支持单相220V7kW、三相380V11kW两种电力规格。 针对市面上家用充电桩无锁,谁都能用的问题,华为家充桩内置4G通讯模块,并支持5.0蓝牙,随桩体赠送一张移动物联网SIM卡和
[汽车电子]
华为家用新能源充电桩上线:最高功率<font color='red'>11</font>kW 可远程操控
多串流MIMO驱动 11ac射频前端迈向28nm
无线区域网路(Wi-Fi)射频(RF)前端朝先进制程迈进。着眼于多重输入多重输出(MIMO)天线在设计上日趋复杂,射频前端元件开发商开始导入数位技术,使元件制造商得以朝向更先进制程发展以增加系统效能与整合度,进一步提升Wi-Fi的资料传输速率。 RFaxis董事长兼执行长Mike Neshat表示,在智慧型手机与平板电脑等无线通讯装置中,射频前端在最大化Bar数量以及确保最高的资料传输率上扮演着关键角色。但由于射频设计难度较高,前端元件过去一直依赖着昂贵的砷化镓(GaAs)或矽锗(SiGe)制程,直到现在才得以采用互补式金属氧化物半导体(CMOS)制程作为解决方案。 得力于智慧型手机、个人电脑/平板电脑、高解析影音
[网络通信]
LPC2103开发板WDT看门狗测试试验
#include config.h #define LED1 (1 19) #define KEY1 (1 18) void DelayNS(uint32 dly) { uint32 i; for(;dly 0; dly--) { for(i = 0; i 50000; i++); } } void WDTInit(uint32 uiTime) { WDTC = uiTime; WDMOD = 0x03; WDFEED = 0xaa; WDFEED = 0x55; } void FeedDog(void) { IRQDisable(); WDFEED = 0xa
[单片机]
Marvell推出车用Wi-Fi、蓝牙5.0和802.11p组合方案
迈威尔(Marvell)近日宣布推出全球首款整合Wi-Fi、蓝牙、车对车和基础设施功能的汽车级芯片88W8987xA。这款非常先进的芯片支持Wi-Fi、蓝牙5.0和802.11p,是车载应用的最佳解决方案。现今的互联汽车对于可靠和高性能的无线连接提出了前所未有的需求,车载信息娱乐(IVI)、安全远程信息处理,车载无线网关和增强安全功能的需求大大增加了汽车电子开发的成本和复杂性。 Marvell 88W8987xA系列封装兼容的解决方案使汽车制造商能够简化无线实现,并为其客户快速提供市场领先功能。 基于Marvell在提供可靠、稳定和安全的汽车IC方面的经验,此第四代无线解决方案针对汽车产品需求进行了功能优化,符合最高质量的AEC-
[半导体设计/制造]
arm开发板实现U盘自动挂载和卸载
原理先不讲,先给各位看官看一下实现的过程: 第一步: 配置内核Makefile 【2.6.22.6版本内核】 make menuconfig General setup ---- Configure standard kernel features (for small systems) ---- | | --- Load all symbols for debugging/ksymoops | | Include all symbols in kallsyms | | Do an extra
[单片机]
arm<font color='red'>开发板</font>实现U盘自动挂载和卸载
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved