蜗窝科技

NR_IRQS 和 irq_desc 的定义在哪里? Kernel 4.7

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 Kerry · 2016-06-23 · 8 帖

本文是原「蜗窝讨论区」的历史存档(2016-06-23),来自版块「Linux kernel技术问答」,共 8 帖。讨论区已停止服务,此处仅供查阅。

Kerry · 2016-06-23 08:41

我在移植一个班子,正在写中断控制器的驱动,想改一下中断的个数,却发现找不到irq_desc的定义。 在 arch/xxx/.../irqs.h(irq.h) 里有定义 NR_IRQS 。 我也需要自己做一个irqs.h吗?

先谢谢下。。

Kerry · 2016-06-23 09:00

irq_desc的定义找到了 http://lxr.free-electrons.com/source/kernel/irq/irqdesc.c#L289

搜索 http://lxr.free-electrons.com/ident?i=irq_desc 居然找不到所有变量的定义,不能相信这个了。。。。。。。

还剩一个问题, NR_IRQS 怎么重新定义。。。。。。

wowo · 2016-06-23 09:09

Kerry 写道: irq_desc的定义找到了 http://lxr.free-electrons.com/source/kernel/irq/irqdesc.c#L289

搜索 http://lxr.free-electrons.com/ident?i=irq_desc 居然找不到所有变量的定义,不能相信这个了。。。。。。。

还剩一个问题, NR_IRQS 怎么重新定义。。。。。。

如果是ARM,随便参考一个“arch/arm/mach-xxx/include/mach/irqs.h”中的NR_IRQS的定义就行了。 个数可以随便定,只要大于实际的数目就行了。

Kerry · 2016-06-23 09:17

谢谢回答,我猜想也是这样,就是不知道为什么是这样。。。。。。。 是因为 arch/arm/include/asm/irq.h 中有一行

include <mach/irqs.h>

吗? 感觉应该还有其他的途径,因为并不是所有的板子都有mach/irqs.h

wowo · 2016-06-23 10:09

Kerry 写道: 谢谢回答,我猜想也是这样,就是不知道为什么是这样。。。。。。。 是因为 arch/arm/include/asm/irq.h 中有一行

include <mach/irqs.h>

吗? 感觉应该还有其他的途径,因为并不是所有的板子都有mach/irqs.h

这里的<mach/irqs.h>,就是“arch/arm/mach-xxx/include/mach/irqs.h。 如果没有这个头文件,在这里有默认值:include/asm-generic/irq.h。

Kerry · 2016-06-24 08:46

我试了一下,不好使,然后发现,CONFIG_SPARSE_IRQ=y 。是这个选线影响的吧应该,以为在 arch/arm/include/asm/irq.h 里面


[== C++ ==]
  6 #ifndef CONFIG_SPARSE_IRQ
  7 #include <mach/irqs.h>
  8 #else
  9 #define NR_IRQS NR_IRQS_LEGACY
 10 #endif

我看了一下,应该是 ARCH_MULTIPLATFORM = y 导致了 CONFIG_SPARSE_IRQ=y

但是呢,我用的CPU是ARM926,是通过在”ARM system type“ 菜单 里面选择Allow multiple platforms to be selected(ARCH_MULTIPLATFORM = y )然后在 "Multiple platform selection" 菜单里面选择 "ARMv5 based platforms..."

现在的问题是,如果想用静态的irq_desc分配的话,我需要自己在”ARM system type“ 菜单定义一个 ARCH_xxxx 吗? 一般移植一个新板子的话,,大家怎么做呢:

  • 自己定义一个ARCH?[/*]

  • 还是大部分人就用 CONFIG_SPARSE_IRQ=y 呢?[/*]

对了,忘记说了,以为versatile-ab板子也是ARM926,所以我的移植是在versatile-ab板子的配置的基础上改的。

wowo · 2016-06-24 11:34

Kerry 写道: 我试了一下,不好使,然后发现,CONFIG_SPARSE_IRQ=y 。是这个选线影响的吧应该,以为在 arch/arm/include/asm/irq.h 里面


[== C++ ==]
  6 #ifndef CONFIG_SPARSE_IRQ
  7 #include <mach/irqs.h>
  8 #else
  9 #define NR_IRQS NR_IRQS_LEGACY
 10 #endif

我看了一下,应该是 ARCH_MULTIPLATFORM = y 导致了 CONFIG_SPARSE_IRQ=y

但是呢,我用的CPU是ARM926,是通过在”ARM system type“ 菜单 里面选择Allow multiple platforms to be selected(ARCH_MULTIPLATFORM = y )然后在 "Multiple platform selection" 菜单里面选择 "ARMv5 based platforms..."

现在的问题是,如果想用静态的irq_desc分配的话,我需要自己在”ARM system type“ 菜单定义一个 ARCH_xxxx 吗? 一般移植一个新板子的话,,大家怎么做呢:

  • 自己定义一个ARCH?[/*]

  • 还是大部分人就用 CONFIG_SPARSE_IRQ=y 呢?[/*]

对了,忘记说了,以为versatile-ab板子也是ARM926,所以我的移植是在versatile-ab板子的配置的基础上改的。

你这应该是没有移植好,ARCH_MULTIPLATFORM,CONFIG_SPARSE_IRQ,都不应该打开的。至于要怎么移植,这不是一两句话可以说清的。

Kerry · 2016-06-24 13:43

对,我的确没有移植好,我刚开始移植。 但是,内核的 arch/arm/configs/versatile_defconfig 文件 应该是打开了ARCH_MULTIPLATFORM,CONFIG_SPARSE_IRQ 这两个参数。


[== Undefined ==]
$ make versatile_defconfig
$ grep -E "ARCH_MULTIPLATFORM|CONFIG_SPARSE_IRQ" .config
CONFIG_SPARSE_IRQ=y
CONFIG_ARCH_MULTIPLATFORM=y

我自己再看看吧。。。。