驱动分类
按加载方式和接口类型分
本机驱动程序(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)
阅读(1158) | 评论(1) | 转发(0) |