panda.jpg 


안녕하세요 판다 이우영입니다.


저번 시간부터 IOCTL 공부를 시작했습니다.


오늘도 간단한 복습부터 시작하겠습니다.


1. 복습!!!




ioctl은 디바이스 드라이버가 다양하게 동작 할 수 있도록 도와준다고 했습니다.


그래서 디바이스 드라이버에 매우 의존적이라고 했었죠.


ioctl의 함수 형태 기억나시나요?


한번 더 살펴 보겠습니다.


01.PNG


3개의 인자를 넘겨 준다고 했었습니다.


fd(파일디스크립터번호), request(명령), argp(넘겨줄 변수의 포인터)


오늘은 이함수를 어떤식으로 사용하는지 알아 보도록 하겠습니다.


2. IOCTL 사용법




ioctl도 file_operations 구조체에 등록을 해주어야 합니다.


 struct file_operations ioctl_fops =                                                 

{

             .owner       = THIS_MODULE,

             .read        = ioctl_read,

             .poll        = ioctl_poll,

             .open        = ioctl_open,

     .ioctl       = ioctl_ioctl,

             .release     = ioctl_release,

};


위와 같이 .ioctl에 만든 함수 이름을 넣어주세요


ioctl은 한가지 동작이 아닌 여러가지 동작을 request( cmd ) 를 통해 결정 합니다.


말이 어려울 수 있으나 간다히 switch 문을 통해서 각각의 동작을 구현 해 주기만 하면 됩니다.


아래는 간단한 모습입니다.


int ioctl_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

       ioctl_info   ctrl_info;

       int          size;

 

       if(_IOC_TYPE(cmd) != IOCTL_MAGIC)

       {

             printk("magic err\n");

              return -EINVAL;

       }

       if(_IOC_NR(cmd) >= IOCTL_MAXNR)

       {

             printk("NR err\n");

              return -EINVAL;

       }

      

       size = _IOC_SIZE(cmd);

 

//     printk("ioctl number = %d\n",cmd);

       switch(cmd)

       {

       case LED_ON :

             *led_data  = 0;

             break;

       case LED_OFF:

             if(ptrmng != NULL)

             {

                    del_timer(&(ptrmng->timer));

             }

             *led_data  = LED;

             break; 

}

}


소스를 보시면 LED_ON, LED_OFF 명령을 지원하는 ioctl 함수 입니다.


그저 cmd에 온 명령을 보고 동작만 하도록 해주면 됩니다.

(cmd에 오는 명령은 응용프로그램에서 날려줍니다.)


한가지 조심할것은 cmd가 단순한 변수 형태가 아니라는 점 입니다.


그렇기 때문에 소스에서 못보시던 메크로를 사용하고 그것을 통해 예외처리를 하는 모습도 보입니다.


여기에 대해서는 다음시간에 알아 보도록 하겠습니다.


오늘은 아주 간단하게 마무리 하겠습니다.


그럼 다음 시간에 만나요~~~