我正在为包含 DMA Controller 的 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 号码?

最佳答案

基于 PowerPC 的系统使用 设备树 Blob (DTB) ,也称为 设备树源 (DTS) ,它是表示给定硬件组件(处理器配置、总线、外设等)的数据库木板。 Linux 内核在启动期间需要有关它运行的硬件的某些信息。根据 开放固件 标准,引导加载程序软件(例如:u-boot)将硬件信息从 DTB 传递到内核。一旦内核获得硬件信息,它就会将所有软件设置作为内核初始化例程的一部分。

从这里开始,如果任何内核软件组件(例如:设备驱动程序)需要硬件详细信息,它应该使用一组 开放固件标准二进制接口(interface) 从内核获取它。其中一些如下所列:

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 空间。通常这将由系统的中断 Controller 设备驱动程序完成。中断映射完成后,可以引用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 接口(interface):linux-2.6/drivers/of/irq.c

关于linux - 在linux内核中映射DMA中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6040253/

10-16 05:11