Вопрос спецам по драйверам.
Никак не могу решить проблему с обработкой прерывания. Ситуация следующая:
Есть 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.
Обратил внимание, что по написанию драйверов (в частности по обработке прерываний) в инете устаревшая инфа. Может кто подскажет «свежие источники».
Заранее всем спасибо. :)
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Я не специалист в этом вопросе, но вот это выглядит достаточно новым.
Спасибо за ссылку!