안녕하세요. 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 검출을 테스트 하였을 때는 잘 동작했었습니다.