В драйвере используется request_threaded_irq (), почему не request_irq ()? Каковы различия между двумя? - PullRequest
4 голосов
/ 07 октября 2011

Я разместил эту ветку, которая обсуждала 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 irqflags, const char * devname, void * dev_id);

Аргументы

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

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

Вот драйвер, на который я ссылаюсь.

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

Ответы [ 2 ]

7 голосов
/ 19 ноября 2011

Была добавлена ​​функция 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 будет зависеть от того, что должен делать ваш драйвер в контексте прерывания.

0 голосов
/ 10 апреля 2013

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

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

...