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);
аргументы
- irq - строка прерывания для выделения
- handler - функция, которая вызывается при возникновении IRQ. Основной обработчик для потоковых прерываний. Если NULL и thread_fn!= NULL, установлен основной основной обработчик по умолчанию.
- thread_fn - функция, вызываемая из потока обработчика irq. Если NULL, поток irq не создается.
- irqflags - флаги типа прерывания
- devname - имя ascii для запрашивающего устройства
- 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