디바이스 드라이버
커널 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 를 많이 사용하게 되는데 쓰레드 방식이 나름 편할것 같다는 생각이...