Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309760
  • 博文数量: 72
  • 博客积分: 3111
  • 博客等级: 中校
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 15:45
个人简介

朝着心的方向前进

文章分类

全部博文(72)

文章存档

2014年(5)

2013年(1)

2012年(1)

2011年(1)

2010年(24)

2009年(40)

我的朋友

分类: 嵌入式

2009-07-30 16:15:27

驱动分类
按加载方式和接口类型分
 本机驱动程序(Build-in Driver)
  通常邮GWES加载,驱动接口一般是定制的
 
 流驱动(Stream Driver)
  通常是由Device Manager加载,驱动接口是标准的流式接口
  
 混合型驱动程序
  同时有定制和流驱动两套驱动接口,但是和系统的交互只使用流式驱动接口,比如PC卡槽驱动
  
按驱动层次分类
 层次型驱动程序(Layered Driver)
  MDD(Model Device Driver),与硬件无关,面向上层的应用程序,一般由微软建立统一框架
  PDD(Platform Dependent Driver),针对具体的硬件平台的操作代码,一般由驱动开发商实现
  MDD和PDD之间通过标准的设备驱动服务高提供的接口DDSI连接
  
 独立型驱动程序(Monolithic Driver)
  独立的驱动程序包含了MDD面向上层应用和PDD面向硬件平台两方面的代码
  适用于操作不复杂的驱动
  减少了MDD和PDD传递之间信息的开销,实时性更强
  
  
流驱动的特点
 实现一种标准的接口
 尤其适用于IO的操作,是嵌入式中最常见的驱动
 操作接口和文件系统的操作类似,通过,CreatFile,ReadFile,WriteFile,IOControl函数来操作
 应用程序和流驱动交互时,可以把设备当作文件来操作,呵呵,类似于Linux呀
 
 
流驱动的实现步骤
 选择代表设备的文件各前缀
 实现驱动的各个标准接口函数
 建立.DEF文件
 在注册表中为驱动建立表项
 
  选择代表设备的文件各前缀
   文件前缀名在系统中必须唯一
   文件前缀名必须是三个字母,若有多个同类设备,由后缀一个数字区分,如COM1,COM2,LPT3
   文件前缀名将会在驱动的标准接口的函数体现,比如XXX_Init,XXX_Close等
   
  标准接口函数
   XXX_Init 通知设备管理器为设备分配初始代资源
   XXX_Deinit 通知设备管理器回收设备初始化时分配的资源
   XXX_open 打开设备,应用程序调用CreatFile时,通过文件系统映射为XXX_Open
   XXX_Close 关闭设备,应用程序调用CloseFile时,通过文件系统映射为XXX_Close
   XXX_PowerUp 设备上电时,操作系统调用该函数完成必要的上电操作
   XXX_PowerDown 设备掉电时,操作系统调用该函数完成必要的关机操作
   XXX_Read 从打开的设备文件中读取数据,可能通过ReadFile映射
   XXX_Write 向打开的设备文件写数据,可以通过WriteFile映射
   XXX_Seek 文件定位,根据设备的情况决写是否支持
   XXX_IOControl IO扩展操作,可以根据设备的情况来决定支持何种操作模式
  
  建立.DEF文件
  流驱动一般以DLL的形式存在
  DEF文件定义了DLL需要导出的接口集
  DEF文件的名称与设备驱动的名称相同
  
  DEF示例
   SampleDrv.DEF
   LIBRARY SampleDrv
   EXPORTS
   SDV_Init
   SDV_Deinit
   SDV_Open
   SDV_Close
   SDV_Read
   SDV_Write
   SDV_Seek
   SDV_IOControl
   SDV_PowerUp
   SDV_PowerDown
   SDV_DLLEntry
   
  在注册表中添加驱动项
   在注册表中添加驱动程序的入口点
   注册表位于Root Key下,一般为[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SampleDrv]
   建立必要的子键和键值,“Prefix"和”DLL"是两个重要的而且必须的键,分别描述了设备的前缀
   和驱动程序的动态链接库名
   建立驱动程序的其他子键
   
  注册表示例
   [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SampleDrv]
   “Prefix”=”SDV”
   “Dll”=SampleDrv.dll
   “Order”=dword:2
   “Ioctl”=dword:4
   
  函数原型分析
   DWORD XXX_Init(DWORD dwContext)
    参数dwContext指向一个描述设备接口的字符串
    函数的返回设备的上下文句柄
    
   BOOL XXX_Deinit(DWORD hDeviceContext)
    参数的hDeviceContext上下文句柄
    返回为是否成功卸载
    
   DWORD XXX_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
    hDeviceContext是设备上下文句柄
    AccessCode是打开设备的权限描述符
    ShareMode是设备的文件共享模式
    函数返回设备打开后的上下文句柄
    
   DWORD XXX_Close(DWORD hOpenContext)
    hOpenContexe是要关闭设备的上下文句柄
    非0返回代表函数关闭失败
    
   DWORD XXX_Read(DWORD hOpenContext,LpVOID pBuffer,DWORD count)
    hOpenContext是打开上下文的句柄
    pBuffer指向应用程序用于存放读取数据的缓冲区
    Count是指定从设备中读取多少个字节的数据
    函数返回值是实际读取的数据数量
    
   DWORD XXX_Write(DWORD hOpenContext,LPVOID lpBuffer,DWORD count) 
    类似于XXX_Read,方向相反
    返回是实际写入的数据数量
    
   DWORD XXX_Seek(DWORD hOpenContext,long Amount,WORD type)
    hOpencontext打开设备的上下文句柄
    Amount是指定指针要移动多少字节,正值是向文件尾移动,负值是向文件头移动
    type描述了设备文件起始点位置
    函数返回设备文件的当前指针
    
   BOOL XXX_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufln,DWORD dwLenln,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
    hOpenContext打开设备的上下文句柄
    dwCode指定了IO操作的识别码,这些识别码由设备开发人员决定
    pBufln指向输入缓冲区的地址
    dwLenln指定了输入数据的长度
    pBufOut指定了输出缓冲区的地址
    dwLenOut指定了需要输出的数据长度
    pdwActualOut是DWORD指针,需要知道从设备中实际读取的数据长度
    函数返回操作是否成功
    
   void XXX_PowerDown(DWORD hDeviceContext)
   void XXX_PowerUp(DWORD hDeviceContext)
阅读(1128) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:(由尚德)Linux系统编程学习一

给主人留下些什么吧!~~

chinaunix网友2010-08-05 16:10:36

总结得不错,谢谢!