커널 2.6.30 이후부터 request_threaded_irq() 함수가 새롭게 나왔다.

쓰레드를 지원한다는것을 함수의 이름에서 알수 있다.


int request_threaded_irq(

unsigned int irq, 

irq_handler_t handler,

irq_handler_t thread_fn, 

unsigned long irqflags,

const char *devname, 

void *dev_id)


인터럽트를 등록할때 쓰레드 함수를 하나더 등록하는것을 볼수 있다.

인터럽트 함수에서 work_q 를 사용하거나 tasklet 을 이용하여 인터럽트 이후에 어떤 일을 추가적으로 실행하게 된다.

이런것들의 연장선에서 request_threaded_irq() 를 사용하면 등록된 쓰레드 함수가 실행된다.

handler 인자가 null 인 경우 디폴트 인터럽트 핸들러가 등록된 thread_fn 을 실행하여 준다.

thread_fn 가 실행될때에는 해당 인터럽트는 disable 된다.

만일 사용자가 handler 인자를 등록하였다면 이 handler 함수에서 해당 인터럽트를 disable 하고  

핸들러 함수의 반환값으로는 IRQ_WAKE_THREAD 를 주어야 한다.

쓰레드 함수에서는 irq 를 다시 활성화 하거나 다른 곳에서 인터럽트를 활성화 해야한다.


request_threaded_irq() 함수의 활용이 많아질것 같다.

당장 touch 드라이버같은 .. 인터럽트가 발생하면 일정시간 계속적인 반응을 해야 하는 경우 유용할듯 하다.

갠적으로 work_q 를 많이 사용하게 되는데 쓰레드 방식이 나름 편할것 같다는 생각이...