도와주세요!!
글 수 15,339
2007.02.13 11:52:12 (*.138.143.52)
7949
안녕하세요..
여러개의 인터럽트에 하나의 인터럽트 함수를 사용하는것은 가능합니다..
이 경우 인터럽트 함수등록의 frags 매개 변수를 SA_SHIRQ로 설정하여 인터럽트함수를 공유한다고 알려 줘야 합니다. 그리고 dev_id에 인터럽트 서비스 함수를 수행할때 필요한 정보를 넣어 주셔야 합니다..
참고할 곳은 EZ-X5 커널의 driver/char/serial.c
#if defined(CONFIG_SERIAL_EZ_X5)
switch( state->irq )
{
case IRQ_GPIO(0) ... IRQ_GPIO(1) :
set_GPIO_IRQ_edge ( state->irq - IRQ_GPIO(0), GPIO_RISING_EDGE );
break;
case IRQ_GPIO(2) ... IRQ_GPIO(80) :
set_GPIO_IRQ_edge ( IRQ_TO_GPIO_2_80(state->irq), GPIO_RISING_EDGE );
break;
}
#endif
retval = request_irq(state->irq, handler, SA_SHIRQ,
"serial", &IRQ_ports[state->irq]);
를 참조하세요..
시리얼 부분의 디바이스는 상당히 복잡한것으로 알고 있습니다.
디바이스를 만들실 거라면 이것을 어느정도 분석을 해보셔야 합니다.
그럼 수고하세요.
>제가 작성하는것이 맞는것인지 답변좀 부탁 드림니다.
>4port UART의 인터럽트 신호를 GP6,GP7,GP8,GP9 에 각각 연결하였습니다)
>
>아래와 같이 4개의 인터럽트를 등록 합니다(인터럽트를 등록하고, 하나의 인터럽트 함수를 사용합니다.
>이런것 가능한가요?)
>
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM0_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM1_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM2_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM3_IRQ, GPIO_FALLING_EDGE );
>
> // IRQ를 등록한다. =============================================
> if( request_irq( IO_COM0_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM0_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM1_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM1_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM2_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM2_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM3_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM3_IRQ );
> return -EBUSY;
> }
>
>
>다음 으로 인터럽트 처리 함수에서,, irq를 이용해 4개의 UART 인터럽트를 처리하려고 합니다. 이것이 가능한지요,,,,,
>여기에서 irq 가 request_irq( IO_COM0_IRQ, io_interrupt0, 0, COM_NAME, NULL )
>
>void io_interrupt0(int irq, void *dev_id, struct pt_regs *regs)
>{
>
> int irq_num;
> irq_num = irq;
>..................
>}
여러개의 인터럽트에 하나의 인터럽트 함수를 사용하는것은 가능합니다..
이 경우 인터럽트 함수등록의 frags 매개 변수를 SA_SHIRQ로 설정하여 인터럽트함수를 공유한다고 알려 줘야 합니다. 그리고 dev_id에 인터럽트 서비스 함수를 수행할때 필요한 정보를 넣어 주셔야 합니다..
참고할 곳은 EZ-X5 커널의 driver/char/serial.c
#if defined(CONFIG_SERIAL_EZ_X5)
switch( state->irq )
{
case IRQ_GPIO(0) ... IRQ_GPIO(1) :
set_GPIO_IRQ_edge ( state->irq - IRQ_GPIO(0), GPIO_RISING_EDGE );
break;
case IRQ_GPIO(2) ... IRQ_GPIO(80) :
set_GPIO_IRQ_edge ( IRQ_TO_GPIO_2_80(state->irq), GPIO_RISING_EDGE );
break;
}
#endif
retval = request_irq(state->irq, handler, SA_SHIRQ,
"serial", &IRQ_ports[state->irq]);
를 참조하세요..
시리얼 부분의 디바이스는 상당히 복잡한것으로 알고 있습니다.
디바이스를 만들실 거라면 이것을 어느정도 분석을 해보셔야 합니다.
그럼 수고하세요.
>제가 작성하는것이 맞는것인지 답변좀 부탁 드림니다.
>4port UART의 인터럽트 신호를 GP6,GP7,GP8,GP9 에 각각 연결하였습니다)
>
>아래와 같이 4개의 인터럽트를 등록 합니다(인터럽트를 등록하고, 하나의 인터럽트 함수를 사용합니다.
>이런것 가능한가요?)
>
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM0_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM1_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM2_IRQ, GPIO_FALLING_EDGE );
> set_GPIO_IRQ_edge ( IO_SAMPLE_COM3_IRQ, GPIO_FALLING_EDGE );
>
> // IRQ를 등록한다. =============================================
> if( request_irq( IO_COM0_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM0_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM1_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM1_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM2_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM2_IRQ );
> return -EBUSY;
> }
>
> if( request_irq( IO_COM3_IRQ, io_interrupt0, 0, COM_NAME, NULL ) )
> {
> printk( " unable to get IRQ %dn", IO_SAMPLE_COM3_IRQ );
> return -EBUSY;
> }
>
>
>다음 으로 인터럽트 처리 함수에서,, irq를 이용해 4개의 UART 인터럽트를 처리하려고 합니다. 이것이 가능한지요,,,,,
>여기에서 irq 가 request_irq( IO_COM0_IRQ, io_interrupt0, 0, COM_NAME, NULL )
>
>void io_interrupt0(int irq, void *dev_id, struct pt_regs *regs)
>{
>
> int irq_num;
> irq_num = irq;
>..................
>}