我正在为包含 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/