linux高级字符设备驱动

linux高级字符设备驱动

ID:33394186

大小:185.50 KB

页数:25页

时间:2019-02-25

linux高级字符设备驱动_第1页
linux高级字符设备驱动_第2页
linux高级字符设备驱动_第3页
linux高级字符设备驱动_第4页
linux高级字符设备驱动_第5页
资源描述:

《linux高级字符设备驱动》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux高级字符设备驱动设备Ioctl控制1.Ioctl用来做什么?大部分驱动除了需要具备读写设备的能力外,还需要具备对硬件控制的能力。例如,要求设备报告错误信息,改变波特率,这些操作常常通过ioctl方法来实现。1.1用户使用方法在用户空间,使用ioctl系统调用来控制设备,原型如下:        intioctl(intfd,unsignedlongcmd,...)原型中的点表示这是一个可选的参数,存在与否依赖于控制命令(第2个参数)是否涉及到与设备的数据交互。1.2驱动ioctl方法       ioctl驱

2、动方法有和用户空间版本不同的原型:       int(*ioctl)(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg)       cmd参数从用户空间传下来,可选的参数arg以一个unsignedlong的形式传递,不管它是一个整数或一个指针。如果cmd命令不涉及数据传输,则第3个参数arg的值无任何意义。2.Ioctl实现2.1实现Ioctl方法的步骤:     1) 定义命令      2.) 实现命令2.2定义命令       

3、在编写ioctl代码之前,首先需要定义命令。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内是唯一的。ioctl命令编码被划分为几个位段,include/asm/ioctl.h中定义了这些位字段:类型(幻数),序号,传送方向,参数的大小。Documentation/ioctl-number.txt文件中罗列了在内核中已经使用了的幻数。       定义ioctl命令的正确方法是使用4个位段,这个列表中介绍的符号定义在中:1) Type     幻数(类型):表明哪个设备的命令,在

4、参考了ioctlnumber.txt之后选出,8位宽。2)25 Number     序号,表明设备命令中的第几个,8位宽3) Direction    数据传送的方向,可能的值是_IOC_NONE(没有数据传输),_IOC_READ,_IOC_WRITE。数据传送是从应用程序的观点来看待的,_IOC_READ意思是从设备读。4) Size用户数据的大小。(13/14位宽,视处理器而定)内核提供了下列宏来帮助定义命令:1) _IO(type,nr)   没有参数的命令2) _IOR(type,nr,datatype) 

5、  从驱动中读数据3) _IOW(type,nr,datatype)  写数据到驱动4) _IOWR(type,nr,datatype)  双向传送,type和number成员作为参数被传递。定义命令(范例)#defineMEM_IOC_MAGIC‘m’//定义幻数#defineMEM_IOCSET_IOW(MEM_IOC_MAGIC,0,int)#defineMEM_IOCGQSET_IOR(MEM_IOC_MAGIC,1,int)2.3Ioctl函数实现       定义好了命令,下一步就是要实现Ioctl函数了,

6、Ioctl函数的实现包括如下3个技术环节:      1) 返回值       2)参数使用      3)命令操作 2.3.1Ioctl函数实现(返回值)       Ioctl函数的实现通常是根据命令执行的一个switch语句。但是,当命令号不能匹配任何一个设备所支持的命令时,通常返回-EINVAL(“非法参数”)。2.3..2Ioctl函数实现(参数)        如何使用Ioctl中的参数?        如果是一个整数,可以直接使用。如果是指针,我们必须确保这个用户地址是有效的,因此使用前需进行正确的检查。

7、2.3.3Ioctl函数实现(参数检查)       25不需要检测:       1) copy_from_user       2) copy_to_user       3) get_user       4) put_user       需要检测:      1) __get_user      2) __put_user        intaccess_ok(inttype,constvoid*addr,unsignedlongsize)       第一个参数是VERIFY_READ或者VERIFY_W

8、RITE,用来表明是读用户内存还是写用户内存。addr参数是要操作的用户内存地址,size是操作的长度。如果ioctl需要从用户空间读一个整数,那么size参数等于sizeof(int)。access_ok返回一个布尔值:1是成功(存取没问题)和0是失败(存取有问题),如果该函数返回失败,则Ioctl应当返回–EFAULT。3.I

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。