ioctl 로 구동시키는 드라이버를 만들때 여러개의 인자를 넘기고자 한다면 구조체로 만들어 사용 할 수 있습니다.

[드라이버의 해더파일은 test_dev.h 로 가정하고, 소스는 test_dev.c 로 가정하고,  application 은 main.c 파일로 가정 합니다.]


1. 구조체는 test_dev.h 파일에 아래와 같이 선언 합니다.

--------------------------------------

typedef struct 

{

unsigned char  num;

unsigned char  data;

}__attribute__((packed))test_data;

--------------------------------------- 


2. 그리고 같은 dev.h 파일의 아랫쪽에서  iotcl 함수 커맨드 정의 할때  아래와 같이 인자로 받아들이도록 해 줍니다.

--------------------------------------- 

#define IOCTL_OUT _IOW( FNDIP_DRIVER_MAJOR_KEY, 0, test_data )

--------------------------------------- 


3. 마지막으로 IOCTL 함수 에서는 이 test_data 형으로 변수를 하나 선언해서 사용 하면 된다.

---------------------------------------------------------------------------------------

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

{

int ret;

test_data   param;

switch( cmd )

{

case  IOCTL_OUT      :

ret = copy_from_user( (void *)&param, (void *)arg, sizeof(param) );

out_func( param.num, param.data );

return 0;

         }

   return -EINVAL;

}

---------------------------------------------------------------------------------------

물론 이 param.num 값과 param.data 을 사용 하는 out_func 함수가 있어야 겠지요.


4. 이제 이 드라이버를 사용할 어플리케이션이 필요 합니다.

어플리케이션 에서는 test_dev.h 파일을 참조해서 같은 구조체를 사용 하면 됩니다.


맨위에서 #include test_dev.h 를 추가 해주고,

값을 넘길때 

------------------------------------------------------------------------------------------

void test_out(void)

{

    test_data param;

    

    param.num = 1;

    param.data = 'a';

   

    ioctl( test_dev.fd, IOTCL_OUT, &param );

}

------------------------------------------------------------------------------------------

이렇게 넘겨 주면 됩니다.