linux字符设备驱动学习笔记3

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                《常识》
¥应用程序----->系统内核----->设备驱动----->硬件设备
¥设备驱动既是系统内核的下属,又是硬件设备的老大。 
¥在inux系统中用一个文件来代表一个设备。这个文件就叫设备文件。设备驱动的责任是将应用程序对设备文件
的打开、读、写、定位等操作转化为对硬件设备的打开、读、写、定位等操作。而对于任何硬件设备,应用程序
只需利用这些基本操作就可以完全控制它!
¥编写linux设备驱动需要的知识结构:
1、40%的设计模式相关知识。设计模式是系统内核限定的,做别人的下属就得按照别人的规矩办事。
2、30%的内核工作原理相关知识。内核是你领导,领会领导意图才能把事情办好。
3、30%的硬件相关知识。控制好硬件是你的的本质工作,你得把你的小弟管理好.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
***********************************************************华丽的分割线***************************************************************

学习往往从模仿开始,拿到一个驱动程序该怎么去分析呢?
1、分析模块加载函数;
2、分析设备操作方法函数(一般先从open方法开始,release方法结束);
3、分析模块卸载函数;

***********************************************************华丽的分割线***************************************************************
ioctl方法
-------------------------------------------------------------------------------------------------------
什么是ioclt方法?它的作用是什么?
ioclt是类似于read,write等的文件操作方法。大部分驱动出了具备读写设备的能力外,还需要具备对硬件控制的能力。例如要求设备报告错误信息,改变波特率,这些操作常常是通过ioctl方法实现的。
-------------------------------------------------------------------------------------------------------
设备的每个操作方法通常对应着一个系统调用,ioctl方法对应的系统调用的原型是什么?
在用户空间,使用ioctl系统调用来控制设备,原型如下:
     int ioctl(int fd,unsigned long cmd,...)
原型中的点表示这是一个可选的参数,存在与否依赖于控制命令(第二个参数)是否涉及到与设备的数据交互。
-------------------------------------------------------------------------------------------------------
驱动ioctl方法的原型又是怎么样的?
  int (*ioctl)(struct inode ”*inode,struct file *filp,unsigned int cmd,unsigned long arg)
cmd 参数从用户空间传下来,可选的参数arg以unsigned long的形式传递,不管它是一个整数或一个指针。如果cmd命令不涉及数据传输,则第三个参数arg的值无任何意义。
-------------------------------------------------------------------------------------------------------
如何实现ioctl?
1、定义命令:为了防止对错误的设备使用了正确的命令,命令号在系统范围内是唯一的。ioclt命令编码被划分为几个位段,include/asm/ioctl.h中定义了这些字段:类型(幻数),序号,传送方向,参数大小。documentation/ioctl-number.txt文件中罗列了在内核中已经使用了的幻数。
2.实现命令:返回值-ioctl函数的实现通常是根据命令执行的一个switch语句。但是,当命令号不能匹配任何一个设备所支持的命令时,通常返回-EINVAL;参数-如果是一个整数,可以直接使用,如果是指针,我们必须确保这个用户地址是有效的,因此使用前需要进行检查:int access_ok(int type,const void *addr,unsigned long size)【type-VERIFY_READ、RERIFY_WRITE用来表明是读用户内存还是写用户内存;addr-用户内存地址;size-操作的长度】
-------------------------------------------------------------------------------------------------------
ioclt命令的各个字段的含义是什么?
定义ioctl命令的正确方法是使用4个位段,他们定义在<linux/ilctl.h>中:
type:幻数(类型),表明那个设备的命令,在参考了ioctl-number.txt之后选出8位宽。一把选用一个字符。
number:序号,表明设备命令中的第几个,8位宽。
direction:数据的传送方向,可能的值是_IOC_NONE(没有数据传输),_IOC_READ(从设备读),IOC_WRITE(写入设备)
size:用户数据的大小。
内核提供了一系列的红来帮助定义命令:
_IO(type,nr):没有参数的命令
_IOR(type,nr,datatype):从驱动中读数据
_IOW(type,nr,datatype):写数据到驱动
_IOWR(type,nr,datatype):双向传送,type和number成员作为参数传递
***********************************************************华丽的分割线***************************************************************

本人享有博客文章的版权,转载请标明出处:http://blog.csdn.net/qingyu2431

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值