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:


댓글 달기