request_irq возвращает -16 (-EBUSY) - PullRequest
1 голос
/ 18 июня 2019

Вот моя проблема.В настоящее время я обновляю ядро ​​машины со встроенным Linux, переходя с 4.1 на 4.14.73 .

У меня проблема с драйвером.В ядре 4.1 непосредственно перед регистрацией irq с помощью request_irq флаг IRQF_VALID будет установлен для драйвера set_irq_flags.

Как указано здесь ,

set_irq_flags является специфичным для ARM с пользовательскими флагами, которые имеют эквиваленты genirq.Конвертируйте драйверы для непосредственного использования интерфейсов genirq, чтобы мы могли отключить set_irq_flags.Перевод флагов выглядит следующим образом:

IRQF_VALID -> !IRQ_NOREQUEST

IRQF_PROBE -> !IRQ_NOPROBE

IRQF_NOAUTOEN -> IRQ_NOAUTOEN

Следовательно, я заменил set_irq_flags на irq_clear_status_flags(irq, IRQ_NOREQUEST).

Дело в том, что теперь вызов request_irq возвращает -16 (-EBUSY), и у меня естьпонятия не имею почему.Я проверил каждый запрос IRQ (во время выполнения), и все они отличаются от того, который запрашивает этот драйвер.

Я также заметил эту строку в журнале:

genirq: Несоответствие флагов irq 40. 00000004 (digitalGPIO) против 00000000 ((ноль))

Я очень озадачен именем устройства (null).

Что я делаюне так?

Надеюсь, я включил достаточно контекстной информации.

1 Ответ

0 голосов
/ 24 июня 2019

В конце, как очевидно, IRQ действительно уже был зарегистрирован как not shared до загрузки моего модуля.

Это было связано с изменением используемого мной ядра, котороеверсия Altera на основе на ядре Linux.Они изменили поведение драйвера, связанного с этим IRQ, в предыдущем обновлении ядра.

Я не могу понять, почему предыдущий запрос был зарегистрирован как (null) вместо правильного имени.Единственный способ показать правильную информацию о том, кто ранее запрашивал IRQ, - это установить его как shared непосредственно в ядре Altera.

...