驱动笔记 - ioctl
#include <linux/ioctl.h>
定义命令
_IO(type,nr) 没有参数的命令
_IOR(type,nr,datatype) 从驱动中读数据
_IOW(type,nr,datatype) 写数据到驱动
_IOWR(type,nr,datatype) 双向传送,type和number成员作为参数被传递
例:
#define MEM_IOC_MAGIC 'm'
#define MEM_IOCSET _IOW(MEM_IOC_MAGIC,0,int)
#define MEM_IOCGQSET _IOR(MEM_IOC_MAGIC,1,int)
unlock_ioctl一般使用switch,不匹配的命令通常返回-EINVAl
应用层调用ioctl
#include <linux/ioctl.h>
ioctl(int fd,int command, (char*)argstruct)
参数检测(检测是否有效)
int access_ok(int type, const void *addr, unsigned long size)
一般把addr强制转化为(void __user *)
type:VERIFY_READ或者VERIFY_WRITE
size:操作的大小
返回值:1成功 0失败
access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd))
access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
不需要检测(函数中自带有检测)
unsigned long copy_from_user (void * to, const void __user * from, unsigned long n) //此函数自带access_ok
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n) //此函数自带access_ok
get_user
put_user
需要检测
__get_user
__get_user(tmp, (int __user *)arg);
__put_user
例:
long ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
int err = 0,tmp;
int retval = 0; if(_IOC_TYPE(cmd) != MEMDEV_MAGIC)
return -ENOTTY;
if(_IOC_NR(cmd) > MEMDEV_MAXNR)
return -ENOTTY;
if(_IOC_DIR(cmd) & _IOC_READ)
err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
else if(_IOC_DIR(cmd) & _IOC_WRITE)
err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
if(err)
return -EFAULT; switch(cmd)
{
case MEMDEV_TELL:
printk(KERN_ALERT "Your call MEMDEV_TELL.\n");
break;
case MEMDEV_RECEIVE:
if(retval = __get_user(tmp, (int __user *)arg) == 0)
{
printk(KERN_ALERT "memdev receive number is %d\n",tmp);
}
else
printk(KERN_ALERT "No receive.\n");
break;
case MEMDEV_SET:
tmp = 110;
if(retval = __put_user(tmp, (int __user *)arg) == 0)
{
printk(KERN_ALERT "memdev send number is %d\n", tmp); }
else
printk(KERN_ALERT "Sent error\n");
break;
default:
return -ENOTTY;
}
return retval;
}
驱动笔记 - ioctl的更多相关文章
- 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】
转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...
- linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...
- Samsung_tiny4412(驱动笔记05)----Makefile,open,read,write,lseek,poll,ioctl,fasync
/*********************************************************************************** * * Makefile,op ...
- 【驱动笔记11】使用DeviceIoControl通信
文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34018521.html 在我昨日发布 ...
- LINUX驱动笔记 目录
笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...
- 【转】Linux设备驱动之Ioctl控制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275372.html 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能 ...
- Linux设备驱动之Ioctl控制【转】
转自:http://www.cnblogs.com/geneil/archive/2011/12/04/2275372.html 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. ...
- Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap
/**************************************************************************** * * list_head,proc fil ...
- Linux设备驱动之Ioctl控制
大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. 一.在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned long cm ...
随机推荐
- Scrapy Learning笔记(四)- Scrapy双向爬取
摘要:介绍了使用Scrapy进行双向爬取(对付分类信息网站)的方法. 所谓的双向爬取是指以下这种情况,我要对某个生活分类信息的网站进行数据爬取,譬如要爬取租房信息栏目,我在该栏目的索引页看到如下页面, ...
- 任务管理界面添加显示RAM信息
显示RAM信息的核心代码是大蛋的,我只不过是整理下教程而已! 大蛋应该不会介意的吧,首先你需要apktool和SystemUI.apk,framework-res.apk 然后开始加载框架和反编译.. ...
- 1008. Elevator (20)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
- iFreeThinking - 记录生活,分享思考
http://www.ifreethinking.com iFreeThinking.com 是一个非营利性个人博客网站.开于 2014 年,博客主要记录分享一些思考和感悟. 文章列表:http:// ...
- 菜鸟学习Spring——60s配置XML方法实现简单AOP
一.概述. 上一篇博客讲述了用注解的形式实现AOP现在讲述另外一种AOP实现的方式利用XML来实现AOP. 二.代码演示. 准备工作参照上一篇博客<菜鸟学习Spring--60s使用annota ...
- 算法系列9《MD5》
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...
- 关于生成缩略图及水印图片时出现GDI+中发生一般性错误解决方法
System.Drawing.Image OldImage = null; oldImage = System.Drawing.Image.FromFile(ImageUrl); 使用该方法读取图片时 ...
- C#实现大数字的运算
1.添加引用:System.Numerics.dll 2.添加命名空间:using System.Numerics; 3.实例: 3.1判断一个数字是不是质数 static void Main(str ...
- Android--用DownLoadManager下载完成后启动安装
当我们用系统的服务DownLoadManager下载完成后,系统会发送一个广播,我们只需要注册一个广播,然后在广播里面写如一些相应的操作. 1.注册广播 completeReceiver = new ...
- hdu 1237 简单计算器
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...