LInux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析

init/main.c:

1 asmlinkage void start_kernel(void)
2 {
3     ......
4     early_irq_init();
5     init_IRQ();
6     ......
7 }

early_irq_init()函数有两种实现,一种是基于radix tree,一种是定义静态数组,如果要使用radix tree实现的,那么需要打开SPARSE_IRQ配置选项,由于我对数据结构不了解,所以分析以下静态数组实现方式版本的。

/kernel/irq/irqdesc.c

 1 struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
 2     [0 ... NR_IRQS-1] = {
 3         .handle_irq    = handle_bad_irq,
 4         .depth        = 1,
 5         .lock        = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock),
 6     }
 7 };
 8
 9 int __init early_irq_init(void)
10 {
11     int count, i, node = first_online_node;
12     struct irq_desc *desc;
13
14     init_irq_default_affinity();
15
16     printk(KERN_INFO "NR_IRQS:%d\n", NR_IRQS);
17
18     desc = irq_desc;
19     count = ARRAY_SIZE(irq_desc);
20
21     for (i = 0; i < count; i++) {
22         desc[i].kstat_irqs = alloc_percpu(unsigned int);
23         alloc_masks(&desc[i], GFP_KERNEL, node);
24         raw_spin_lock_init(&desc[i].lock);
25         lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
26         desc_set_defaults(i, &desc[i], node);
27     }
28     return arch_early_irq_init();
29 }

  第一次见到这种初始化数组全部成员为同样内容的方式,可以学习积累下。

  NR_IRQS在arch/arm/mach-s5pv210/include/mach/irqs.h下定义:

1 #define NR_IRQS            (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1)

  上面函数的核心就是调用desc_set_defaults()来初始化上述中断描述符数组,kernel/irq/irqdesc.c:

 1 static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node)
 2 {
 3     int cpu;
 4
 5     desc->irq_data.irq = irq;
 6     desc->irq_data.chip = &no_irq_chip;
 7     desc->irq_data.chip_data = NULL;
 8     desc->irq_data.handler_data = NULL;
 9     desc->irq_data.msi_desc = NULL;
10     irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS);
11     irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);
12     desc->handle_irq = handle_bad_irq;
13     desc->depth = 1;
14     desc->irq_count = 0;
15     desc->irqs_unhandled = 0;
16     desc->name = NULL;
17     for_each_possible_cpu(cpu)
18         *per_cpu_ptr(desc->kstat_irqs, cpu) = 0;
19     desc_smp_init(desc, node);
20 }

  最后返回时调用的arch_early_irq_init()函数并没有做事情。

  接着看init_IRQ():

1 void __init init_IRQ(void)
2 {
3     machine_desc->init_irq();
4 }

  machine_desc是全局变量,定义在板文件中,由于我们使用的是s5pv210,且demo板号选的是smdkv210,所以这个全局变量就在arch/arm/mach-s5pv210/mach-s5pv210.c中:

1 MACHINE_START(SMDKV210, "SMDKV210")
2     /* Maintainer: Kukjin Kim <[email protected]> */
3     .boot_params    = S5P_PA_SDRAM + 0x100,
4     .init_irq    = s5pv210_init_irq,
5     .map_io        = smdkv210_map_io,
6     .init_machine    = smdkv210_machine_init,
7     .timer        = &s5p_timer,
8 MACHINE_END

arch/arm/mach-s5pv210/mach-s5pv210.c中还有如下函数定义:

 1 void __init s5pv210_init_irq(void)
 2 {
 3     u32 vic[4];    /* S5PV210 supports 4 VIC */
 4
 5     /* All the VICs are fully populated. */
 6     vic[0] = ~0;
 7     vic[1] = ~0;
 8     vic[2] = ~0;
 9     vic[3] = ~0;
10
11     s5p_init_irq(vic, ARRAY_SIZE(vic));
12 }

arch/arm/plat-s5p/irq.c

 1 void __init s5p_init_irq(u32 *vic, u32 num_vic)
 2 {
 3 #ifdef CONFIG_ARM_VIC
 4     int irq;
 5
 6     /* initialize the VICs */
 7     for (irq = 0; irq < num_vic; irq++)
 8         vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);
 9 #endif
10
11     s3c_init_vic_timer_irq(5, IRQ_TIMER0);
12
13     s3c_init_uart_irqs(uart_irqs, ARRAY_SIZE(uart_irqs));
14 }

  上面涉及到的函数都是去操作VIC相关的寄存器,这部分操作还不是很清楚,先不往下继续追踪了。

原文地址:https://www.cnblogs.com/tech-lqh/p/9206153.html

时间: 2024-10-29 10:50:19

LInux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析的相关文章

LInux-3.0.8中基于S5PV210的GPIO模块代码追踪和分析

编写按键驱动时,想知道内核是如何管理GPIO的,所以开始追踪代码,中间走了一些弯路,现记录于此. 追踪代码之前,我猜测:第一,这部分代码应该在系统set up阶段执行:第二,GPIO的代码应该在machine或者platform或者vendor相关的目录下.事实证明,第一点是正确的,第二点基本是错误的,因为内核依靠对GPIO的抽象来管理之,这层抽象层给具体的machine留出了一些它们需要是实现的接口,这与其他的设备驱动框架在使用上是很类似的,当然,GPIO也是一种设备啊... ...所以,管理

linux ubuntu14.0.4中配置Apache tomcat的方法

首先我们要安装tomcat服务器,首先肯定得装java运行环境jdk,因为tomcat是用java编写的服务器,安装jdk见:http://blog.csdn.net/u013412497/article/details/47000275 安装好jdk后,在官网上下载apache,我下载的是目前的最小版本apache-tomcat-8.0.24.tar.gz,当然高版本是兼容低版本的,如果我们在myeclipse中开发的时候,我们也可以选择比这个低的其他版本. 下载下来后,解压文件.下载的默认地

Web浏览器中动态添加修改HTML页面代码的问题分析

引言:在Web的世界里,浏览器加载页面,展示给用户最终的内容,可是最终展示的HTML代码与服务器上存储的代码一致吗? 1.  xpath为什么不能正常工作? XPath是用来快速定位页面元素的方式和方法,忽然有一天,发现在页面中截取的XPath在代码的匹配中是无法工作的,那问题出在哪里呢? 页面地址:http://www.66ip.cn/ 截取匹配页面中的IP地址,基于Chrome浏览器自带的开发者工具,我们截取到某一个匹配的XPath路径为: //*[@id="main"]/div/

Linux——获取IP及其中发现的问题

由于最近在学习网络编程,喜欢玩弄IP地址. 首先,我需要搞清楚如何获得本机IP. 1.利用Linux系统 在bash中输入ifconfig可获得以下代码: (ev1)[[email protected] bin]# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1

Linux 4.0+内核对硬件交换模块的支持(HW Switch Offload)

Linux内核最近跃进到了4.x时代,初看没啥大的动作,但是对于我而言,最令人兴奋的还是它对硬交换模块的支持.这也是为全面迎合SDN做好准备的第一步. Linux上的路由与交换 Linux诞生于网络,天生对网络拥有全面且强大的支持,即便再复杂的协议,再封闭的技术,几乎都可以找到对应的Linux实现.然而这并不是说Linux网络就天下无敌了,它存在很多不合理的地方.       Linux拥有对路由的强大支持,在数据平面,你可以很轻松地实现一种路由查找算法,在控制平面,你也可以在用户态实现任何已有

基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5P100开始出现的,在s5pv210里面的定义是摄像头接口,但是它同样具有图像数据颜色空间转换的作用.而exynos4412对它的定义看起来更清晰些,摄像头接口被定义为FIMC-LITE .颜色空间转换的硬件结构被定义为FIMC-IS.不多说了,我们先来看看Linux3.0.8 三星的BSP包中与fimc驱动相关的文件. 上面的源码文件组成了整个fimc的驱动框架.通

嵌入式Linux学习笔记(基于S5PV210 TQ210)

基于S5PV210.TQ210平台. 本文更多的是教会大家如何学习! 包括如下内容: 1.前言 2.开发环境搭建 3.制作交叉编译器 4.裸机编程 4.1.汇编学习 4.2.S5PV210启动流程 4.3.点亮一个LED 4.4.串口 4.5.实现printf 4.6.时钟配置 4.7.重定位 4.8.DDR 4.9.NAND读写 4.11.LCD操作 5.移植u-boot(基于u-boot-2014.4版本) 5.1.概述 5.2.u-boot配置过程分析 5.3.u-boot编译过程分析 5

《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接

<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub   spm=a1z10.3-b.w4011-10017777404.30.kvceXB&id=521111707813&rn=4cf013961288ab7c4dfd2016aeb21fa8&abbucket=5">天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等