注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动学习——USB驱动(八)之USB键盘(6)  

2011-01-28 16:23:38|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

 

今天我们接着上面的,按OO的说法,打铁得趁热,USB中的自定义的HID设备与前面的标准设备区别在于我们使用了不同的集合用途,我们在描述符的开始的集合用途里将原来的用途改为0x00,而在普通的桌面页里(Generic Desktop Page)中,用途ID值0x00代表着未定义的意思。

而这样的话,就意味着系统将不会再把它定义的设备当作一个标准的输入和输出设备来看待,也就是说,我们自定义了一个设备。OK,我们的目的不就达到了,既然是自定义,其中一些东西,你可以自己任意定义,只要符合标准。

我们把原来UsbHidKeyboard里面的东西拷了进来,在其的基础上进行修改,具体的修改方法就不再赘述了,只要按照我们前面不断唐僧的定义,自己照着写就可以了,重要的是要修改SendReport 和UsbEp1Out这两个函数,与你的自定义的方法对应上就可以来回传输数据了,再有的,就是对着D12的协议来做了。

说来归去,又落入了我们的套路,SPEC,PROTOCOL,EXAMPLE,这三板斧,目前用着应该很是顺手。

关键是对自定义设备的访问,这里得需要唐僧一下。

我们知道,在网卡上,为了有一个单独的编号,我们都是使用GUID作为他的唯一的编号,而这个东东,微软也有相应的软件自动实现这个号码的生成。我们读取这个GUID,不能直接去操作注册表,因为每一台机器的GUID产生都不尽相同,所以直接去控制,只对特定的机器有作用,不具有普遍的意义。

但我们有API,有函数,有MFC,我们有微软,我们更有信心,于是一个函数横空出世:

Void __stdcall HidD_GetHidGuid(OUT  LPGUID HidGuid),调用用它可以方便的获取HID设备的接口类。调用SetupDiGetClassDevs这个API可以得到指定类的所有设备的信息集合的函数,不过,这个东东有一个小小的麻烦之处,得调用SetupDiDestroyDeviceInfoList来清理资源,释放各种各样的句柄,不过,我小小的以为,一次两次的爱泄露就泄露吧,反正就一两回,内存和资源的泄露如果不是长时间连续的,没有什么大的坏处,不过,写程序么,得讲究,不能啥都不顾。

其实,这个读得东西,和大家以前想象的都一样,先CreateFile,然后该ReadFile时就Read,该WriteFile时就Write,这个东西不过因为采用了异步(大家要不懂啥叫同步异步,偶也是真没办法咧,大家可以参考一下VCKBASE上的串口的同步和异步讲得不错哟),这就用到了一个变量OVERLAPPED,用它来控制着读写的节奏,增加两线程,一个读一个写,然后主要是如何打开,我们得调用一系列的函数API或者说微软封包的HID东东们,我们要包含头文件,还要引用库hid.lib,引用的方法还用说么,哈哈,#pragma comment(lib,"hid.lib")就不用你在VS里每次都手动设置了。

我们先调用HidD_GetHidGuid获取ID,然后用SetupDiGetClassDevs获取一个Set,然后查找SET里第一个设备,用SetupDiEnumDeviceInterfaces,在增加SET的索引后,用SetupDiGetDeviceInterfaceDetail查找设备的数据缓冲区长度,然后再调用它一次,读入数据。OK,我们按上面设定的自定义的数据协议,查找PID(产品ID),VID(厂商ID),PVN(设备版本号),然后就可以一一处理了。

这里需要说明的一点是,我们上面提到的读写函数,只能读写从中断端点获取得报告数据,如果要从控制端点读取数据,则要使用BOOLEAN __stdcall HidD_GetInputReport 和BOOLEAN __stdcall HidD_SetOutputReport这两个函数,用法大家去查资料,这里就不再讲了,这些个东西,讲细了没啥意义。实在没法子了,在网上找个例程一看就明白了。

  评论这张
 
阅读(879)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017