字符设备(4)ioctl

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命令(内核方式)*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值