도와주세요!!
글 수 15,339
2003.03.20 14:17:25 (*.231.168.11)
6685
: #define GPIO_11_27_IRQ(i) (11 + (i) - 32) 이부분하고 착각하신 거아닌가요???
:
: 위부분에 보면 따로 #define IRQ_GPIO_11_27(x) (32 + (x) - 11) 이 렇게 정의되어 있는데요..
:
: <위치는 : linux-2.4.10-arm/include/asm-arm/arch-sa1100/irqs.h 에 있습니다...>
:
:
-------------------------- 이전 글 ---------------------------
[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번이 정상입니다..
#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))
==>> 이부분을 계산하면.... (32+21-11) = 42
--------------------------------------------------------
==> 엄...제가 잘못 보았군요.
그런데, 이곳은...
if( !request_irq( IRQ_GPIO21, gpio_interrupt, SA_INTERRUPT, INT_NAME,
NULL) ) // 인터럽트 등록
{
#ifdef SA1100_IRQ_TO_GPIO
set_GPIO_IRQ_edge ( 1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE );
#else
if ( 11 > GPIO_IRQ_21 ) set_GPIO_IRQ_edge ( 1 << GPIO_IRQ_21,
GPIO_RISING_EDGE );
else set_GPIO_IRQ_edge ( 1 <<
GPIO_11_27_IRQ(IRQ_GPIO21), GPIO_RISING_EDGE );
#endif
enable_irq (IRQ_GPIO21); // 인터럽트의 허용
printk(KERN_WARNING "Interrupt GPIO Register Ok...
");
}
else
{
printk(KERN_WARNING "GPIO can't get assigned IRQ [ %d ]
",
IRQ_GPIO21 );
return -EBUSY;
}
이곳에선 set_GPIO_IRQ_edge함수에서 "1 << SA1100_IRQ_TO_GPIO
(GPIO_IRQ_21)"을 사용하고 있습니다.
SA1100_IRQ_TO_GPIO의 정의는
#define GPIO_11_27_IRQ(i) (11 + (i) - 32)
#define SA1100_IRQ_TO_GPIO(i) (((i) < 11) ? (i) : GPIO_11_27_IRQ(i))
SA1100_IRQ_TO_GPIO(21)을 계산해보면 "11 + 21 - 32 = 0" 입니다.
그러니깐..IRQ 42(IRQ_GPIO21)번의 등록은 request_irq에서 이루어 지고
set_GPIO_IRQ_edge는 set_GPIO_IRQ_edge(1 << 0, GPIO_RISING_EDGE)가 아닌가
요..?
이렇게 한다면 "1 << 0"번에 RISING_EDGE가 된다는 말인데....요...
만약 set_GPIO_IRQ_edge(1 << SA1100_GPIO_TO_IRQ(GPIO_IRQ_21),
GPIO_RISING_EDGE)
이렇게 하면 "이전글"에서 말씀하신대로 "32 + 21 - 11 = 42"라는 값을수 있습
니다.
어떤것이 맞는지요?
그런데 밑에 처럼 하면 set_GPIO_IRQ_edge의 첫번째 인수가 int형으로 정의 되
어 있기 때문에
컴파일시 경고가 발생하면서 gpio_sw.o 모듈을 insmod, rmmod시 error이 발생
합니다.
:
: 위부분에 보면 따로 #define IRQ_GPIO_11_27(x) (32 + (x) - 11) 이 렇게 정의되어 있는데요..
:
: <위치는 : linux-2.4.10-arm/include/asm-arm/arch-sa1100/irqs.h 에 있습니다...>
:
:
-------------------------- 이전 글 ---------------------------
[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번이 정상입니다..
#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))
==>> 이부분을 계산하면.... (32+21-11) = 42
--------------------------------------------------------
==> 엄...제가 잘못 보았군요.
그런데, 이곳은...
if( !request_irq( IRQ_GPIO21, gpio_interrupt, SA_INTERRUPT, INT_NAME,
NULL) ) // 인터럽트 등록
{
#ifdef SA1100_IRQ_TO_GPIO
set_GPIO_IRQ_edge ( 1 << SA1100_IRQ_TO_GPIO(GPIO_IRQ_21),
GPIO_RISING_EDGE );
#else
if ( 11 > GPIO_IRQ_21 ) set_GPIO_IRQ_edge ( 1 << GPIO_IRQ_21,
GPIO_RISING_EDGE );
else set_GPIO_IRQ_edge ( 1 <<
GPIO_11_27_IRQ(IRQ_GPIO21), GPIO_RISING_EDGE );
#endif
enable_irq (IRQ_GPIO21); // 인터럽트의 허용
printk(KERN_WARNING "Interrupt GPIO Register Ok...
");
}
else
{
printk(KERN_WARNING "GPIO can't get assigned IRQ [ %d ]
",
IRQ_GPIO21 );
return -EBUSY;
}
이곳에선 set_GPIO_IRQ_edge함수에서 "1 << SA1100_IRQ_TO_GPIO
(GPIO_IRQ_21)"을 사용하고 있습니다.
SA1100_IRQ_TO_GPIO의 정의는
#define GPIO_11_27_IRQ(i) (11 + (i) - 32)
#define SA1100_IRQ_TO_GPIO(i) (((i) < 11) ? (i) : GPIO_11_27_IRQ(i))
SA1100_IRQ_TO_GPIO(21)을 계산해보면 "11 + 21 - 32 = 0" 입니다.
그러니깐..IRQ 42(IRQ_GPIO21)번의 등록은 request_irq에서 이루어 지고
set_GPIO_IRQ_edge는 set_GPIO_IRQ_edge(1 << 0, GPIO_RISING_EDGE)가 아닌가
요..?
이렇게 한다면 "1 << 0"번에 RISING_EDGE가 된다는 말인데....요...
만약 set_GPIO_IRQ_edge(1 << SA1100_GPIO_TO_IRQ(GPIO_IRQ_21),
GPIO_RISING_EDGE)
이렇게 하면 "이전글"에서 말씀하신대로 "32 + 21 - 11 = 42"라는 값을수 있습
니다.
어떤것이 맞는지요?
그런데 밑에 처럼 하면 set_GPIO_IRQ_edge의 첫번째 인수가 int형으로 정의 되
어 있기 때문에
컴파일시 경고가 발생하면서 gpio_sw.o 모듈을 insmod, rmmod시 error이 발생
합니다.