USB设备驱动程序导读(4)

        在上次了解了所有USBD接口函数以后,我们已经有了很多基础知识了,回顾USB样例的文件夹结构,我们还能记得USB/CLASS/COMMON这个文件夹下是存放所公共部分的源程序,它是微软专门抽象出来的能为大多数USB设备驱动程序服务的一些结构体以及函数的封装,我们这次再来概略的了解一下这里面的源程序。

        这里面包含了三个程序,分别是:
        remlock        usbclient        utils
        下面我们分别来了解一下这三个程序的功能和接口,很显然,USB设备驱动程序肯定是会用到这其中的一部分函数的,因此我们不一定需要读懂这其中的每一行,但至少要对这些函数有个印象,不至于在读驱动程序时不知道函数的来源。

        remlock程序是一个移除设备的锁,利用这个结构体
   typedef struct _REMOVE_LOCK
   {
       BOOL Removed;
       LONG IoCount;
       HANDLE RemoveEvent;
   } REMOVE_LOCK, *PREMOVE_LOCK
来实现在设备移除时进行的同步控制。其中Removed成员是对设备是否已经移除的标识,IoCount成员是对设备进行访问的数量,这也是驱动程序中常用的行为,就像此前我们看到的那个Lock程序一样,RemoveEvent是一个内核事件,熟悉WIN32编程的应该都很清楚,它是内核通知应用程序的一种方式,也是线程这间并发控制的一种手段,如果不熟悉,还是像我在以前文章中提到的那样,一定要找WINDOWS高级编程之类的书把它学明白,否则就很难控制驱动程序了。

        利用它实现的那几个函数就不说了,与临界区的用法是一样的。另外提一句,在此程序中有类似InterlockedIncrement这样的函数,这种函数是WIN32 API函数,专门用来提供多线程对同一变量的同步访问的,可以通过MSDN查到详细用法。

        usbclient程序是对USBD进行包装以供USB设备驱动程序使用的函数接口,通过usbclient.h我们可以发现里面是关于数据传输、属性设置、状态描述和复位的一组函数原形的定义,我们再看usbclient.c文件,这些函数大部分都拥有一个LPCUSB_FUNCS类型的参数,回顾上次我们对USBD的了解可知,正是通过这一参数才能访问USBD提供的服务功能,浏览一下函数的实现发现,确实每个函数都是通过这个参数调用了USBD的函数,然后处理调用后的结果,所以这里只是多了一层封装,使得驱动程序的编写更加清晰易于维护。

        另外,这里我们要留意一下IssueBulkTransfer()、IssueInterruptTransfer()、IssueVendorTransfer() 这三个函数,它们实现了通用的Bulk传输、中断传输和自定义的传输方式,在驱动程序中要用得到。

        utils程序很简单,是对注册表操作的封装,利用_REG_VALUE_DESCR这个结构体和GetSetKeyValues()函数可以方便的访问注册表,在驱动程序的安装中会用得较多。

        又说了这么多东西,虽然没有看多少程序,但我们又离驱动程序近了一层,至少知道了很多函数是要在驱动程序中用到的,如果有兴趣,可以具体阅读每一个函数的实现方法,但我觉得这并不影响对驱动程序的开发。如果是我写驱动,在没有特别的情况下,我会把这些公用的源程序照搬过来,这可是能极大的缩短开发周期的事哦!
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文斌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值