WinCE USB设备驱动程序之USBD-导读(4)

前一节,我们了解了USB驱动在WinCE中的位置结构,及WinCE USB样例驱动程序的文件夹结构,接下来,我们就要了解一下USBD为我们提供了哪些接口来实现设备访问以及驱动程序管理的功能。首先找到USBDI.H,用VC/EVC或者VS都行,打开它,我们一起来了解一下USBD为我们提供了哪些接口?

WinCE USB设备驱动所用到的结构体

我们首先看到的一个大的结构体就是_USB_DRIVER_SETTINGS,注意这个结构体不是USB规范中的USB设备描述,而是为了WinCE设备管理器加载WinCE USB设备驱动程序方便而建立的。该结构体中对供应商描述、设备描述和Interface的描述是用来匹配注册表中对USB设备驱动的注册表键,当设备管理器发现你设备的这些值与注册表中的这些值相符时,就会加载你的驱动。

也就是说它是与你的WinCE USB设备唯一对应的东西,是一种标识。该结构体的供应商部分的描述需要根据你的USB设备的供应商信息来填,设备描述的设备类、子类、协议等可以在USB规范中找到,在USB100.H头文件中也有一部分,在后面的WinCE USB设备驱动样例程序中也定义了一部分。

接下来有三个函数是必须由WinCE USB设备驱动程序实现的。

我们可以在MSDN里或其他WinCE的文档里看到,这几个WinCE USB函数就是:

  • USBDeviceAttach:USB设备加载的时候由WINCE系统调用
  • USBInstallDriver:USB设备第一次加载的时候由系统调用,用来安装WINCE注册表配置以便搜索USB设备
  • USBUnInstallDriver:USB设备移除后清理由上一个函数写入的WINCE注册表配置

这样在我们的USB驱动程序中就一定要按照这三个函数的原型来实现,否则就不能为设备管理器所识别。其实除了这三个,还有一个函数也是必须的,这就是一个函数指针所指向的函数:

  • *LPDEVICE_NOTIFY_ROUTINE

这个指针所指向的函数是用来接收通知消息的,既然微软说任何WinCE USB设备必须实现USB_CLOSE_DEVICE消息的响应,那么这个指针所指向的函数自然也就是必须要实现的了。

接下来我们看下USBD向设备驱动程序提供了哪些服务接口

下面是一组函数的原型,这些函数就是USBD向设备驱动程序提供的服务接口,有些函数是可以任意调用的,用来完成版本信息读取、注册表操作和设备驱动程序注册,这些函数有:
GetUSBDVersion    RegisterClientDriverID    UnRegisterClientDriverID    RegisterClientSettings
UnRegisterClientSettings    OpenClientRegistryKey

还有大量的函数是必须通过指针调用的,通常只允许在驱动程序中调用,为了方例使用,在这里给出一个_USB_FUNCS的结构体,每一个结构体成员对应了一个函数指针,这样在驱动程序中要想使用USBD函数只能通过一个结构体变量来进行了,在这里我们要记住这个结构体的名字,并且微软还对这个结构体变量进行了以下的类型定义:

  • typedef struct _USB_FUNCS USB_FUNCS, * PUSB_FUNCS, * LPUSB_FUNCS;
  • typedef struct _USB_FUNCS const * PCUSB_FUNCS;
  • typedef struct _USB_FUNCS const * LPCUSB_FUNCS;

好了,到此我们发现,大部分的WinCE USB工作都已经被USBD完成了,我们为了实现自己的WinCE USB设备驱动,只需要利用这些指针或函数,来实现四个我们自己的函数,然后在其中匹配上我们自己的WInCE USB设备就可以了。看起来还是挺简单的,一步步做就不难。

此条目发表在 Linux驱动开发 分类目录。将固定链接加入收藏夹。

发表评论