도와주세요!!
글 수 15,339
2003.03.19 18:53:45 (*.231.168.11)
6674
[root@ezboard nfs]$ cat /proc/interrupts
10: 0 mk712_touchscreen
11: 232 GPIO 11-27
12: 0 SA1100
17: 569 serial_sa1100
26: 3694 timer
42: 0 SW_INT <<==== 요 부분
47: 232 cs89x0
Err: 0
[root@ezboard nfs]$
인터럽트 번호가 42번이 정상입니다..
>>>>> 저두 /proc/interrupts에서 장형기님과 같은 message가 나왔습니다.
test프로그램에서 5번(interrup test)을 누르면 interruptible_sleep_on
에 의해 sleep이 되는것을 확인했습니다.
그리고 wake_up하기 위해 interrup switch(GPIO21과 연결된) 버튼을 눌
으면 아무런 반응이 없습니다. 즉..깨어나지 않습니다.
H/W적으로 button을 눌렀을때, GPIO21쪽으로 Low가 들어가는 것을 확인
했습니다.
test프로그램에서 나머지 부분은 정상적으로 동작합니다.
#define GPIO_IRQ_21 21 // GPIO21
set_GPIO_IRQ_edge(1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
#define IRQ_GPIO_11_27(x) (32 + (x) - 11)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
>>>>> 그런데 이상한 부분이 있습니다.
제가 가지고 있는 kernel2.4.10(falinux로부터 받음)은
이부분이
#define IRQ_GPIO_11_27(x) (32 + (x) - 11)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
다음 처럼 되어 있습니다.
#define IRQ_GPIO_11_27(x) (11 + (x) - 32)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
그래서 장형님처럼 수정하였습니다.
그리고
set_GPIO_IRQ_edge(1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
부분을
set_GPIO_IRQ_edge(SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
수정하였습니다.
하드 코딩으로 수정도 해보았구요.
set_GPIO_IRQ_edge(42, GPIO_RISING_EDGE); // 32 + 21 - 11
set_GPIO_IRQ_edge(0, GPIO_RISING_EDGE); // 11 + 21 - 32
결과는 모두 같았습니다.
무엇이 문제인지...요..
set_GPIO_IRQ_edge() 에서 GPIO_RISING_EDGE, GPIO_FALLING_EDGE는 언제
언제 사용하나요?
예)GPIO_FALLING_EDGE는 GPIO_21번이 High->Low일때 IRQ를 동작하게 한다
(?) 맞는지요?
10: 0 mk712_touchscreen
11: 232 GPIO 11-27
12: 0 SA1100
17: 569 serial_sa1100
26: 3694 timer
42: 0 SW_INT <<==== 요 부분
47: 232 cs89x0
Err: 0
[root@ezboard nfs]$
인터럽트 번호가 42번이 정상입니다..
>>>>> 저두 /proc/interrupts에서 장형기님과 같은 message가 나왔습니다.
test프로그램에서 5번(interrup test)을 누르면 interruptible_sleep_on
에 의해 sleep이 되는것을 확인했습니다.
그리고 wake_up하기 위해 interrup switch(GPIO21과 연결된) 버튼을 눌
으면 아무런 반응이 없습니다. 즉..깨어나지 않습니다.
H/W적으로 button을 눌렀을때, GPIO21쪽으로 Low가 들어가는 것을 확인
했습니다.
test프로그램에서 나머지 부분은 정상적으로 동작합니다.
#define GPIO_IRQ_21 21 // GPIO21
set_GPIO_IRQ_edge(1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
#define IRQ_GPIO_11_27(x) (32 + (x) - 11)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
>>>>> 그런데 이상한 부분이 있습니다.
제가 가지고 있는 kernel2.4.10(falinux로부터 받음)은
이부분이
#define IRQ_GPIO_11_27(x) (32 + (x) - 11)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
다음 처럼 되어 있습니다.
#define IRQ_GPIO_11_27(x) (11 + (x) - 32)
#define SA1100_GPIO_TO_IRQ(i) (((i) < 11) ? SA1100_IRQ(i) :
IRQ_GPIO_11_27(i))
그래서 장형님처럼 수정하였습니다.
그리고
set_GPIO_IRQ_edge(1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
부분을
set_GPIO_IRQ_edge(SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE);
수정하였습니다.
하드 코딩으로 수정도 해보았구요.
set_GPIO_IRQ_edge(42, GPIO_RISING_EDGE); // 32 + 21 - 11
set_GPIO_IRQ_edge(0, GPIO_RISING_EDGE); // 11 + 21 - 32
결과는 모두 같았습니다.
무엇이 문제인지...요..
set_GPIO_IRQ_edge() 에서 GPIO_RISING_EDGE, GPIO_FALLING_EDGE는 언제
언제 사용하나요?
예)GPIO_FALLING_EDGE는 GPIO_21번이 High->Low일때 IRQ를 동작하게 한다
(?) 맞는지요?