在Linux内核中映射DMA中断

3

我正在为一个包含DMA控制器的PowerPC SoC编写内核模块。我希望在Linux内核中映射DMA中断。我的DMA结构有两个中断:

struct dma
{
  u32 dma1;
  u32 dma2;
}*dma;

我已经在内核中进行了DMA结构的内存映射。我使用了irq_of_parse_and_map()函数来获取相应中断的虚拟中断(virq)号码。

dma->dma1=irq_of_parse_and_map(ofdev->node,0);
dma->dma2=irq_of_parse_and_map(ofdev->node,1);

但我无法获取上述中断的VIRQ编号。有哪些API可用于访问VIRQ编号?

当发布代码时,请将其高亮显示并点击“{}”按钮。 - Damien_The_Unbeliever
arch/powerpc/include/asm/irq.h 中有许多对 virq 的引用。你看过那里了吗? - Brian Cain
1个回答

2

基于PowerPC的系统使用一种称为“Device Tree Blob(DTB)”或“Device Tree Source(DTS)”的数据库来表示给定板上的硬件组件(处理器配置、总线、外围设备等)。Linux内核在启动过程中需要某些关于其运行硬件的信息。引导加载程序软件(例如:u-boot)根据“Open Firmware”标准将硬件信息从DTB传递给内核。一旦内核获取了硬件信息,它将在内核初始化例程的一部分中进行所有软件设置。

从这里开始,如果任何内核软件组件(例如:设备驱动程序)需要硬件详细信息,则应通过使用一组“Open Firmware Standard Binary Interfaces”从内核中获取它们。以下是其中一些:

of_register_platform_driver()   - Register driver for device
of_unregister_platform_driver() - Unregister driver for device 
of_address_to_resource()    - Obtain physical address of peripheral
of_get_property()           - Find property with a given name for a given node
of_find_node_by_phandle()   - Find a node given a phandle
irq_of_parse_and_map()      - Parse and map an interrupt into linux virq space
of_irq_to_resourse()        - Obtain virtual IRQ of peripheral
...
...

现在来谈谈这里提出的问题。 irq_of_parse_and_map() 用于解析并将中断映射到Linux virq空间。通常,这将由系统的中断控制器设备驱动程序完成。完成中断映射后,您可以通过引用 of_irq_to_resource() 调用来获取中断源 virq。此步骤将需要为注册中断处理程序到中断源。因此,请尝试使用 of_irq_to_resource() 而不是 irq_of_parse_and_map()

参考:

设备树 Blob:http://www.informit.com/articles/article.aspx?p=1647051&seqNum=5

开放固件:http://www.openfirmware.org/

OF IRQ接口:linux-2.6/drivers/of/irq.c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接