Отображение прерываний DMA в ядре Linux - PullRequest
3 голосов
/ 18 мая 2011

Я пишу модуль ядра для PowerPC SoC, который содержит контроллер DMA. Я хочу отобразить прерывания DMA в ядре Linux. моя структура 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);

но я не могу получить вирк для перечисленных выше прерываний. Какие API могут быть доступны для доступа к номерам VIRQ?

1 Ответ

2 голосов
/ 01 декабря 2011

Система на основе PowerPC использует Blob Tree Device Blob (DTB) , также называемый Источник дерева устройств (DTS) , который представляет собой базу данных, которая представляет аппаратные компоненты (Конфигурация процессора,Автобусы, периферия и т. Д.) На данной доске.Ядро Linux во время загрузки ожидает определенной информации об оборудовании, на котором оно работает.Информация об оборудовании передается от DTB к ядру программным обеспечением загрузчика (например, u-boot) в соответствии со стандартом Open Firmware .Как только ядро ​​получит информацию об оборудовании, оно выполнит все настройки программного обеспечения как часть процедуры инициализации ядра.

С этого момента, если какой-либо программный компонент ядра (например, драйвер устройства) нуждается в деталях аппаратного обеспечения, он должен получить его от ядра, используя набор Стандартные двоичные интерфейсы открытого встроенного программного обеспечения .Некоторые из них перечислены ниже:

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.Обычно это будет сделано драйвером устройства контроллера прерываний системы.Когда сопоставление прерываний выполнено, вы можете получить источник прерывания virq , обратившись к вызову of_irq_to_resource().Этот шаг потребуется для регистрации обработчика прерывания в источнике прерывания.Поэтому попробуйте использовать of_irq_to_resource() вместо irq_of_parse_and_map().

Ref:

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

Открыть прошивку: http://www.openfirmware.org/

интерфейса IRQ: linux-2.6 / drivers / of / irq.c

...