1.无参数
//ioctl 命令
static int test_ioctl(struct file *filp, unsigned long cmd, unsigned long arg)//2.6.23 (后没有inode参数) 对应的函数指针变为ulocked_ioctl
{
int ret;
struct test_dev_t *dev = filp->private_data;
/*既然这么费劲定义了命令,当然要检验命令是否有效*/
if(_IOC_TYPE(cmd) != TEST_MAGIC)
return - EINVAL;
if(_IOC_NR(cmd) > TEST_MAX_NR)
return - EINVAL;
switch (cmd) {
case TEST_CLEAR:
memset(dev->kbuf,0,DEVSIZE);
dev->curr_size = 0;
ret = 0;
break;
default:
P_DEBUG("ERR CMD!\n");
ret = -EINVAL;
}
return ret;
}
2.整形参数
//ioctl 命令
static int test_ioctl(struct file *filp, unsigned long cmd, unsigned long arg)
{
int ret;
struct test_dev_t *dev = filp->private_data;
/*既然这么费劲定义了命令,当然要检验命令是否有效*/
if(_IOC_TYPE(cmd) != TEST_MAGIC)
return - EINVAL;
if(_IOC_NR(cmd) > TEST_MAX_NR)
return - EINVAL;
switch (cmd) {
case TEST_CLEAR:
memset(dev->kbuf,0,DEVSIZE);
dev->curr_size = 0;
filp->f_pos = 0;
ret = 0;
break;
case TEST_OFFSET:
filp->f_pos += (int)arg; //整数传参需要知道参数的类型
P_DEBUG("chang offset !\n");
ret = 0;
break;
default:
P_DEBUG("ERR CMD!\n");
ret = -EINVAL;
}
return ret;
}
3.指针传参
static int test_ioctl(struct file *filp, unsigned long cmd, unsigned long arg)//2.6.23 (后没有inode参数) 对应的函数指针变为ulocked_ioctl
{
int ret;
struct test_dev_t *dev = filp->private_data;
struct test_data val;
/*既然这么费劲定义了命令,当然要检验命令是否有效*/
if(_IOC_TYPE(cmd) != TEST_MAGIC)
return - EINVAL;
if(_IOC_NR(cmd) > TEST_MAX_NR)
return - EINVAL;
switch (cmd) {
case TEST_CLEAR:
memset(dev->kbuf,0,DEVSIZE);
dev->curr_size = 0;
filp->f_pos = 0;
ret = 0;
break;
case TEST_OFFSET: //整数传参需要知道参数的类型
filp->f_pos += (int)arg;
P_DEBUG("chang offset !\n");
ret = 0;
break;
case TEST_KBUF: //指针传参(传入一个结构体数据)
if (copy_from_user(&val,(struct test_data*)arg,sizeof(struct test_data))) { //用的时候使用copy_xx_user()检查
ret = -EFAULT;
goto RET;
}
memset(dev->kbuf,0,DEVSIZE);
memcpy(dev->kbuf,val.buf,val.size);
filp->f_pos = 0;
dev->curr_size = val.size;
ret = 0;
break;
default:
P_DEBUG("ERR CMD!\n");
ret = -EINVAL;
}
RET:
return ret;
}
4.ioctl 命令的定义
#ifndef __test_cmd__h
#define __test_cmd__h
struct test_data
{
int size;
char buf[10];
};
//#define TEST_CLEAR 0 //自定义命令方式
#define TEST_MAGIC 'x' //定义幻数
#define TEST_MAX_NR 3 //定义命令的最大序数 只有一个为1
#define TEST_CLEAR _IO(TEST_MAGIC,0) //定义命令(无参数)
#define TEST_OFFSET _IO(TEST_MAGIC,1)
#define TEST_KBUF _IO(TEST_MAGIC,2)
#endif/*定义ioctl命令(内核方式)*/