arm-linux嵌入式学习手记
jj807
全部博文(75)
c语言100例(22)
启动代码分析(3)
2011年(1)
2010年(15)
2009年(59)
fuyuande
long程飞
dahai046
25115879
萦绕08
zhajiaoh
wonderfu
dx_bin
15815261
分类: C/C++
2010-04-14 14:21:55
//头文件#include <linux/ioctl.h>/* 定义幻数 ,定义一个字符,8位,用于检测是否是这类设备,ioctl-number.txt中给出了已经使用的幻数,定义的时候注意避免冲突*/#define MEMDEV_IOC_MAGIC 'k' /* 定义命令 ,这里的命令都是unsigned int类型*/#define MEMDEV_IOCPRINT _IO(MEMDEV_IOC_MAGIC, 1)#define MEMDEV_IOCGETDATA _IOR(MEMDEV_IOC_MAGIC, 2, int)#define MEMDEV_IOCSETDATA _IOW(MEMDEV_IOC_MAGIC, 3, int)#define MEMDEV_IOC_MAXNR 3 //定义命令的最大序列号
//头文件
#include <linux/ioctl.h>/* 定义幻数 ,定义一个字符,
8位,用于检测是否是这类设备,ioctl-number.txt中给出了已经使用的幻数,定义的时候注意避免冲突*/#define MEMDEV_IOC_MAGIC 'k' /* 定义命令 ,这里的命令都是unsigned int类型*/#define MEMDEV_IOCPRINT _IO(MEMDEV_IOC_MAGIC, 1)#define MEMDEV_IOCGETDATA _IOR(MEMDEV_IOC_MAGIC, 2, int)#define MEMDEV_IOCSETDATA _IOW(MEMDEV_IOC_MAGIC, 3, int)#define MEMDEV_IOC_MAXNR 3 //定义命令的最大序列号
int memdev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg){ int err = 0; int ret = 0; int ioarg = 0; /* 检测命令的有效性 */ if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)//命令是否操作这一类设备 return -EINVAL; if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR) // 命令序列号是否超出定义 return -EINVAL; /* 根据命令类型,检测参数空间是否可以访问 */ if (_IOC_DIR(cmd) & _IOC_READ) err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; /* 根据命令,执行相应的操作 */ switch(cmd) { /* 打印当前设备信息 */ case MEMDEV_IOCPRINT: printk("<--- CMD MEMDEV_IOCPRINT Done--->\n\n"); break; /* 获取参数 */ case MEMDEV_IOCGETDATA: ioarg = 1101; ret = __put_user(ioarg, (int *)arg); break; /* 设置参数 */ case MEMDEV_IOCSETDATA: ret = __get_user(ioarg, (int *)arg); printk("<--- In Kernel MEMDEV_IOCSETDATA ioarg = %d --->\n\n",ioarg); break; default: return -EINVAL; } return ret;}
上一篇:OSI(open system interconnection)模型
下一篇:linux下查找结构体定义
登录 注册