제가 잘 못 이해를 했던거 같습니다.

그러한 방법으로는 테스트를 해보지 않아서 정확히 말씀은 못 드리겠습니다만은
리눅스가 올라있는 상태에서는 어렵지 않을까 싶습니다.
그래서 저희는 보통 request_irq 함수를 이용하고 있습니다.

깔끔한 답변을 드리지 못 해서 죄송합니다.

>빠른 답변 감사드립니다.
>그러나 제가 원하는 답이 아니어서 다시 질문을 드립니다.
>답변주신 것과 같이 하는 방법은 해당 포트를 계속 모니터링하고 있어야 가능한 방법이라고 생각됩니다.
>제가 원하는 것은 일정시간 (수십 ms)마다 한번정도 호출해서 그 사이에 active-low edge가 인가 되었나를 체크하고 싶은 것입니다. 즉, edge 검출을 원하는 것이지 현재 상태값을 얻고자 함이 아닙니다.
>앞선 질문에서와 같이 active-low 시간 길이가 약 20us 정도 밖에 되지 않아 20us이내의 주기를 가지고 계속 호출하여 상태를 모니터링하는 것은 시스템에 너무 많은 부하가 걸립니다.
>
>GEDR0 레지스터를 사용하여 falling edge검출이 가능하도록 gpio driver 프로그램을 하는 방법을 알려주시면 감사하겠습니다.
>
>>
>>>안녕하세요. EZ-X5보드를 이용해서 드라이버를 작성하는데 문제가 있어서 글을 올립니다.
>>>
>>>제가 GPIO27에 외부 신호를 연결해서 이 신호의 falling edge를 검출하는 드라이버를 작성하고자 합니다.
>>>검출하는 방법은 메인 프로그램에서 드라이버의 read함수를 주기적으로 호출하여 falling edge가 발생했는지 여부를 받아 사용하는 것입니다. 즉, 인터럽트를 이용하는 것이 아니라 수순하게 falling edge가 발생했는지 여부만 검출하고자 합니다.
>>>
>>>CD에 제공해주신 gpio 드라이버 작성 프로그램을 조금 수정하여 다음과 같이 드라이버 프로그램을 작성하였습니다. 설정부분은 다음과 같습니다.
>>>
>>>
>>>#define GPIO_SLOTCLKN                27 // GPIO27
>>>#define MASK_GPIO_SLOTCLKN        ( 1 << GPIO_SLOTCLKN )
>>>#define GPIO_OUTPUT_MASK        ( MASK_GPIO_SLOTCLKN )
>>>#define GPIO_INPUT_MASK                ( MASK_GPIO_SLOTCLKN )
>>>
>>>void GPIO_IO_Init( void )
>>>{
>>>        
>>>        GPDR0 &= ~( GPIO_INPUT_MASK ); // 입력 전용으로 설정
>>>        GAFR0_U &= ~(3 << ((GPIO_SLOTCLKN-16)*2));        // Disable Alternative Function
>>>        GRER0   &= ~( GPIO_INPUT_MASK );        // Clear Rising edge trigger.
>>>        GFER0   |= ( GPIO_INPUT_MASK );        // Set as Falling Edge Detect
>>>        
>>>/*        printk("GPDR0&GPIO_INPUT_MASK: %Xn",GPDR0&GPIO_INPUT_MASK);
>>>        printk("GRER0&GPIO_INPUT_MASK: %Xn",GRER0&GPIO_INPUT_MASK);
>>>        printk("GFER0&GPIO_INPUT_MASK: %Xn",GFER0&GPIO_INPUT_MASK);
>>>        printk("GEDR0&GPIO_INPUT_MASK: %Xn",GEDR0&GPIO_INPUT_MASK);
>>>*/
>>>}
>>>
>>>
>>>그리고, 메인함수에서 falling edge가 발생하였는지 여부를 검출하기 위해 주기적으로 read함수를 호출하는데 read함수는 다음과 같습니다.
>>>
>>>ssize_t gpio_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)
>>>{
>>>        int count1=0;
>>>
>>>/*        printk("GPDR0&GPIO_INPUT_MASK: %Xn",GPDR0&GPIO_INPUT_MASK);
>>>        printk("GRER0&GPIO_INPUT_MASK: %Xn",GRER0&GPIO_INPUT_MASK);
>>>        printk("GFER0&GPIO_INPUT_MASK: %Xn",GFER0&GPIO_INPUT_MASK);
>>>        printk("GEDR0&GPIO_INPUT_MASK: %Xn",GEDR0&GPIO_INPUT_MASK);
>>>*/
>>>        if((GEDR0&GPIO_INPUT_MASK)) {
>>>                GFER0   |= ( GPIO_INPUT_MASK );        // Set as Falling Edge Detect
>>>                GEDR0   = ( GPIO_INPUT_MASK );
>>>                buf[0]= 1;
>>>                count1 =1;
>>>        }
>>>        else buf[0]=0;
>>>        
>>>        return count1;
>>>        
>>>}
>>>
>>>드라이버를 동작시키면 gpio27에 주기펄스 신호를 인가하면 GFER0값이 reset이 되어버리고, GEDR0의 해당비트에 값이 설정되지 않습니다.
>>>그리고 gpio27에 신호를 인가하지 않은 상태에서 driver를 올리면 GFER0값은 설정한 값으로 유지됩니다.
>>>
>>>제가 원하는 동작(falling edge가 발생했는지 여부만 검출)을 하기 위해 위 드라이버 프로그램을 어떻게 수정을 해야할까요..?
>>>
>>>참고로, gpio27에 인가하는 신호는 약 2.5V정도 되고 펄스의 high상태를 수십 ms동안 유지하다 low상태로 떨어져서 약 20 us 이후에 다시 high로 상태가 변경됩니다. 그리고, 인터럽트를 이용해서 falling edge 검출을 테스트 하였을 때는 잘 동작했었습니다.
>>>
>>
>>안녕하세요. ^^
>>GPIO 쓰시는 문제가 좀 있으신거 같습니다.
>>원하시는 것은 인터럽트 검출이 아니라 소프트웨어적으로 검사를 하셔서 검출하시는 것으로 생각이 됩니다.
>>
>>1번째로 GPIO_IO_Init() 에서 GFER0   |= ( GPIO_INPUT_MASK ); 를 사용하셨는데 이렇게 되면 Falling edge 인터럽트를 활성화가 됩니다. 그러므로 GFER0   &= ~(GPIO_INPUT_MASK ); 식으로 비활성화를 시켜 주셔야 합니다.
>>
>>2. ssize_t gpio_read () 에서
>>        if((GEDR0&GPIO_INPUT_MASK)) {
>>                GFER0   |= ( GPIO_INPUT_MASK );        // Set as Falling Edge Detect
>>                GEDR0   = ( GPIO_INPUT_MASK );
>>                buf[0]= 1;
>>                count1 =1;
>>        }..............
>>
>>이 부분이 gpio 의 상태를 읽으시려 했던것으로 생각됩니다. gpio의 상태를 읽으시려면 GEDR0로 대신 GPLR0를 사용하셔야하고요. 위와 같이 Falling Edge와 Rising Edge는 모두 비활성화를 시켜 주셔야합니다.
>>
>>수정후 안되시면 Q/A에 올려 주십시오
>>부디 잘되시기를 바랍니다~^^
>>좋은 하루되십시오
>>        
>>
>>
>