nixp.ru v3.0

17 января 2017,
вторник,
03:50:40 MSK

DevOps с компанией «Флант»
Аватар пользователя Максим
Максим написал 23 мая 2012 года в 16:52 (1207 просмотров) Ведет себя как мужчина; открыл 3 темы в форуме, оставил 10 комментариев на сайте.

Вопрос спецам по драйверам.

Никак не могу решить проблему с обработкой прерывания. Ситуация следующая:

Есть PCI-E устройство. Необходимо по шине получать и отдавать данные. Мастером является это устройсто, т.е. драйвер должен указать устройству адрес в памяти компьютера, а оно читает/пишет туда данные. По оканчанию транзакции устройство генерит прерывание. Вот с ним то и возьникла проблема.

После регистрации обработчика первое прерывание срабатывает как и положено. Но потом оно не сбрасывается. А именно, линия прерывания (сам сигнал) обнуляется в обработчике, но ядро продолжает беспрерывно вызывать обработчик. Как правило по прошедствии некоторого времени система виснет. Также она висьнет при попытке вызвать free_irq().

Вот обработчик прерывания:

static irqreturn_t mydevice_irq(int irq, void *dev_id)

{

printk(KERN_INFO«mydevice: interrupt %d\n», irq);

struct mydevice *mydevicep = dev_id;

iowrite32(1, mydevicep->registers + MYDEVICE_DCSR);

wmb();

iowrite32(0, mydevicep->registers + MYDEVICE_DCSR);

mydevicep->was_read = 1;

wake_up_interruptible(&mydevicep->wait_queue);

return IRQ_HANDLED;

}

Прошу помочь с вопросом. В чём может быть проблема?
P.S.

Обратил внимание, что по написанию драйверов (в частности по обработке прерываний) в инете устаревшая инфа. Может кто подскажет «свежие источники».

Заранее всем спасибо. :)

myst

Я не специалист в этом вопросе, но вот это выглядит достаточно новым.

Максим

Спасибо за ссылку!

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.