빠른 답변 감사드립니다.
그러나 제가 원하는 답이 아니어서 다시 질문을 드립니다.
답변주신 것과 같이 하는 방법은 해당 포트를 계속 모니터링하고 있어야 가능한 방법이라고 생각됩니다.
제가 원하는 것은 일정시간 (수십 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에 올려 주십시오
>부디 잘되시기를 바랍니다~^^
>좋은 하루되십시오
>        
>
>