request_irq 함수의 flags 매개변수에 대한 궁금증이요~~~~
글쓴이: kkyama / 작성시간: 일, 2009/11/22 - 3:32오후
안녕하세요.
디바이스드라이버를 공부하기 시작한 학생입니다.
인터럽트처리를 공부하는중에 궁금한점이 생겨서 글을 올립니다.
인터럽트 등록에 사용되는 request_irq함수의 형식을 보면
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long frags, const char * device, void * dev_id)
이자나요..
근데 여기서 frags 매개변수들을 보면 대부분의 디바이스 드라이버책에서는 SA_INTERRUPT,SA_SHIRQ,SA_SAMPLE_RANDOM 이렇게 3개의
frgs값만을 예제로 들더군요..
근데 헤더파일을 뒤져보니 linux/interrupt.h 파일을 살펴보니 저 3가지의 내용과 함께 여러가지의 플래그값들이 있더군요..
#define IRQF_TRIGGER_NONE 0x00000000 #define IRQF_TRIGGER_RISING 0x00000001 #define IRQF_TRIGGER_FALLING 0x00000002 #define IRQF_TRIGGER_HIGH 0x00000004 #define IRQF_TRIGGER_LOW 0x00000008 #define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING) #define IRQF_TRIGGER_PROBE 0x00000010 /* * These flags used only by the kernel as part of the * irq handling routines. * * IRQF_DISABLED - keep irqs disabled when calling the action handler * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator * IRQF_SHARED - allow sharing the irq among several devices * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur * IRQF_TIMER - Flag to mark this interrupt as timer interrupt * IRQF_PERCPU - Interrupt is per cpu * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing * IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is * registered first in an shared interrupt is considered for * performance reasons) */ #define IRQF_DISABLED 0x00000020 #define IRQF_SAMPLE_RANDOM 0x00000040 #define IRQF_SHARED 0x00000080 #define IRQF_PROBE_SHARED 0x00000100 #define IRQF_TIMER 0x00000200 #define IRQF_PERCPU 0x00000400 #define IRQF_NOBALANCING 0x00000800 #define IRQF_IRQPOLL 0x00001000 /* * Migration helpers. Scheduled for removal in 1/2007 * Do not use for new code ! */ #define SA_INTERRUPT IRQF_DISABLED #define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM #define SA_SHIRQ IRQF_SHARED #define SA_PROBEIRQ IRQF_PROBE_SHARED #define SA_PERCPU IRQF_PERCPU #define SA_TRIGGER_LOW IRQF_TRIGGER_LOW #define SA_TRIGGER_HIGH IRQF_TRIGGER_HIGH #define SA_TRIGGER_FALLING IRQF_TRIGGER_FALLING #define SA_TRIGGER_RISING IRQF_TRIGGER_RISING #define SA_TRIGGER_MASK IRQF_TRIGGER_MASK
이것들에 대한 설명은 인터넷으로 찾아보려해도 쉽게 찾을수가 없더라고요..
그리고 IRQF_TRIGGER_RISING과IRQF_TRIGGER_FALLING을 플래그로 이용할때와 SA_INTERRUTP를 이용할때랑 인터럽트 호출 단계가 다른것을 못느꼈구요..(버튼과 led를 이용하여 시도해보았습니다.)
이 플래그들을 사용해도 무관한 것인가요?? 그리고 상승엣지와 하강엣지시 인터럽트 발생으로 인터럽트를 만들려면 어디를 참고해야할지
알려주세요...^^
Forums:
댓글 달기