Картографиране на DMA прекъсвания в ядрото на linux

Пиша модул на ядрото за 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);

но не мога да получа номера на virq за горните прекъсвания. Какви API могат да бъдат налични за достъп до VIRQ номерата?


person vijayaraj    schedule 18.05.2011    source източник
comment
Когато публикувате код, моля, маркирайте го и натиснете бутона {}   -  person Damien_The_Unbeliever    schedule 18.05.2011
comment
arch/powerpc/include/asm/irq.h има много препратки към virqs. Гледал ли си там?   -  person Brian Cain    schedule 28.11.2011


Отговори (1)


Системата, базирана на PowerPC, използва Device Tree Blob (DTB), наричан още Device Tree Source (DTS), който е база данни, която представлява хардуерните компоненти (Конфигурация на процесора, шини , периферни устройства и т.н...) на дадена платка. Ядрото на Linux по време на своето зареждане очаква определена информация за хардуера, на който работи. Хардуерната информация се предава от DTB към ядрото от софтуера за зареждане (напр.: u-boot) според стандарта Отворен фърмуер. След като ядрото получи информацията за хардуера, то ще извърши цялата настройка на софтуера като част от рутинната процедура за инициализация на ядрото.

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

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 пространство. Обикновено това се прави от драйвера на устройството Interrupt Controller на системата. След като съпоставянето на прекъсването е направено, можете да получите източника на прекъсване virq, като се обърнете към of_irq_to_resource() повикване. Тази стъпка ще бъде необходима за регистриране на манипулатора на прекъсване към източника на прекъсване. Затова опитайте да използвате of_irq_to_resource() вместо irq_of_parse_and_map().

Справка:

Device Tree 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

person Praveen Felix    schedule 01.12.2011