request_threaded_irq() используется в драйвере, почему не request_irq()? Каковы различия между двумя?

Я разместил эту ветку, которая обсуждала request_threaded_irq, но я не получил никакого ответа. Поэтому я публикую это свежо.

Я работаю над драйвером сенсорного экрана для емкостного сенсорного экрана. Он использовал запрос request_threaded_irq() вместо request_irq(). Я не мог понять принципиальную разницу между двумя. Это говорит:

название

request_threaded_irq - выделить строку прерывания

конспект

int request_threaded_irq (unsigned int irq, обработчик irq_handler_t,irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id);

аргументы

  1. irq - строка прерывания для выделения
  2. handler - функция, которая вызывается при возникновении IRQ. Основной обработчик для потоковых прерываний. Если NULL и thread_fn!= NULL, установлен основной основной обработчик по умолчанию.
  3. thread_fn - функция, вызываемая из потока обработчика irq. Если NULL, поток irq не создается.
  4. irqflags - флаги типа прерывания
  5. devname - имя ascii для запрашивающего устройства
  6. dev_id - cookie передается обратно в функцию-обработчик

аргументы Handler и Thread_fn сбивают с толку. Также нет никакой рабочей функции, определенной в драйвере.

Вот драйвер, к которому я обращаюсь.

Может ли кто-нибудь помочь мне понять это?

2 ответа

Решение

Была добавлена ​​функция request_threaded_irq(), чтобы позволить разработчикам разделить код обработки прерываний на две части. Одна часть будет выполняться с заблокированными прерываниями, а вторая часть может выполняться потоком ядра без блокированных прерываний. Подробнее о том, почему, вы можете прочитать это:

http://lwn.net/Articles/302043/

В вашем случае драйвер, с которым вы связаны, делает это:

err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread,
                           IRQF_TRIGGER_RISING, "touch_reset_key", ts);

Передав NULL для второго аргумента, "обработчик", аргумент для thread_fn или функция cy8ctmg110_irq_thread() будет вызвана при обнаружении прерывания.

Для вас выбор того, какая функция запроса будет зависеть от того, что должен делать ваш драйвер в контексте прерывания.

Еще один важный аспект: "Если вы хотите настроить потоковый обработчик irq для вашего устройства, вам нужно указать обработчик и обработчик thread_fn. Он по-прежнему вызывается в контексте жесткого прерывания и должен проверить, происходит ли прерывание с устройства. Если да, то это необходимо отключить прерывание на устройстве и вернуть IRQ_WAKE_THREAD, что разбудит поток обработчика и запустит thread_fn. "

Источник: https://www.kernel.org/doc/htmldocs/genericirq.html

Другие вопросы по тегам