디바이스 드라이버
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 *)¶m, (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, ¶m );
}
------------------------------------------------------------------------------------------
이렇게 넘겨 주면 됩니다.