阅读:5577回复:13
新鲜出炉小玩意儿第二弹
恩。。。买了imac蓝牙键盘。。。自然有个驱动要写。。。
这次这个键盘怎么说呢。。有些改进有些退步。。。 改进的地方就是键盘把几个consumer page的东西独立出来成了新的collection了 退步的地方嘛。。。具体细节我也不清楚究竟是windows的问题还是键盘本身的问题 关于handshake的部分。windows的代码显示有个多余的handshake 但是hid profile上说这个handshake是必须的。。。 这个部分我没做深入的逆向。。所以究竟谁对我也不清楚 这个驱动主要的目的就是让键盘上的fn键使用起来 因为imac的这个无线键盘是个小键盘。键盘上没有home end pagedown等等以及keypad部分 所以我们需要结合fn键来实现这些缺少的键。 当然了。windows自己的驱动是没有办法实现的。。 这个键盘的report desc是这样的。 USAGE_PAGE(Generic Desktop) 05 01 USAGE(Keyboard) 09 06 COLLECTION(Application) a1 01 REPORT_ID(1) 85 01 USAGE_PAGE(Keyboard) 05 07 USAGE_MINIMUM(Keyboard LeftControl) 19 e0 USAGE_MAXIMUN(Keyboard Right GUI) 29 e7 LOGICAL_MINIMUN(0) 15 00 LOGICAL_MAXIMUM(1) 25 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(8) 95 08 INPUT(Data,Var,Abs) 81 02 REPORT_SIZE(8) 75 08 REPORT_COUNT(1) 95 01 INPUT(Const,Ary,Abs) 81 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(5) 95 05 USAGE_PAGE(LEDs) 05 08 USAGE_MINIMUM(Num Lock) 19 01 USAGE_MAXIMUM(Kana) 29 05 OUTPUT(Data,Var,Abs) 91 02 REPORT_SIZE(3) 75 03 REPORT_COUNT(1) 95 01 OUTPUT(Const,Ary,Abs) 91 01 REPORT_SIZE(8) 75 08 REPORT_COUNT(6) 95 06 LOGICAL_MINIMUM(0) 15 00 LOGICAL_MAXIMUM(255) 26 ff 00 USAGE_PAGE(Keyboard) 05 07 USAGE_MINIMUM(no event) 19 00 USAGE_MAXIMUM(255) 2a ff 00 INPUT(Data,Ary,Abs) 81 00 END_COLLECTION c0 USAGE_PAGE(Consumer Devices) 05 0c USAGE(Consumer Control) 09 01 COLLECTION(Application) a1 01 REPORT_ID(71) 85 47 USAGE_PAGE(Generic Desktop) 05 01 USAGE(Keyboard) 09 06 COLLECTION(Logical) a1 02 USAGE_PAGE(Generic Device Controls) 05 06 USAGE(Battery Strength) 09 20 LOGICAL_MINIMUM(0) 15 00 LOGICAL_MAXIMUM(255) 26 ff 00 REPORT_SIZE(8) 75 08 REPORT_COUNT(1) 95 01 INPUT(Data,Var,Abs) 81 02 END_COLLECTION c0 END_COLLECTION c0 USAGE_PAGE(Consumer Devices) 05 0c USAGE(Consumer Control) 09 01 COLLECTION(Application) a1 01 REPORT_ID(17) 85 11 LOGICAL_MINIMUM(0) 15 00 LOGICAL_MAXIMUM(1) 25 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(3) 95 03 INPUT(Const,Ary,Abs) 81 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(1) 95 01 USAGE_PAGE(Consumer Devices) 05 0c USAGE(Eject) 09 b8 INPUT(Data,Var,Abs) 81 02 USAGE_PAGE(Reserved) 06 ff 00 USAGE(Fn) 09 03 INPUT(Data,Var,Abs) 81 02 REPORT_SIZE(1) 75 01 REPORT_COUNT(3) 95 03 INPUT(Const,Ary,Abs) 81 01 USAGE_PAGE(Consumer Devices) 05 0c REPORT_ID(18) 85 12 LOGICAL_MINIMUM(0) 15 00 LOGICAL_MAXIMUM(1) 25 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(1) 95 01 USAGE(Play/Pause) 09 cd INPUT(Data,Var,Abs) 81 02 USAGE(Fast Forward) 09 b3 INPUT(Data,Var,Abs) 81 02 USAGE(Rewind) 09 b4 INPUT(Data,Var,Abs) 81 02 USAGE(Scan Next Track) 09 b5 INPUT(Data,Var,Abs) 81 02 USAGE(Scan Previos Track) 09 b6 INPUT(Data,Var,Abs) 81 02 INPUT(Const,Ary,Abs) 81 01 INPUT(Const,Ary,Abs) 81 01 INPUT(Const,Ary,Abs) 81 01 REPORT_ID(19) 85 13 LOGICAL_MINIMUM(0) 15 00 LOGICAL_MAXIMUM(1) 25 01 REPORT_SIZE(1) 75 01 REPORT_COUNT(1) 95 01 USAGE_PAGE(Reserved) 06 01 ff USAGE() 09 0a INPUT(Data,Var,Abs) 81 02 REPORT_SIZE(1) 75 01 REPORT_COUNT(7) 95 07 INPUT(Const,Ary,Abs) 81 01 END_COLLECTION c0 第一个collection提供的是基本的keyboard部分的 第二个collection看起来是提供电池电量信息的。但是不知道这个功能必须要使用充电电池还是怎么的。我试过读取这个数据的。。但是readfile一直是pending。不知道是怎么回事。我手头又没有充电电池也没办法试。。。 第三个collection提供eject mute等等的支持。不过蓝牙这款键盘并没有单独的键是play/pause这些的。这些键只是在usb有线键盘上有单独的键。在蓝牙键盘上他们是跟f8,f9,f10这些在一起的。 在第三个collection里面有个ff的reserved的page里面的usage为03的那个就是键盘上的fn键了 所以根据这个判断来实现fn的功能 我现在的配置是 fn+f5=insert,fn+f7=scan prev track,fn+f8=play/pause,fn+f9=scan next track,fn+f10=mute fn+f11=volume decrease,fn+f12=volume increase,fn+up=pageup...... fn的功能在我上一个驱动上非常容易就修改好了.. 然后要说的就是那个handshake的问题. 根据hid profile来说.当键盘收到一个set report的时候.键盘应该返回一个handshake set report一般用在设置键盘的led. 当你按下caps lock的时候.键盘首先返回一个信息告诉os你按下了caps lock 然后os收到这个信息.接着发送一个set report告诉键盘把caps lock的led点亮了 键盘收到这个set report然后将caps lock的led点亮接着返回一个handshake数据 hid profile上面是这样描述的. 但是windows的实现上看.最后这个handshake数据是多余的. windows会认为这个数据是个错误.返回一个c000009c的错误.也就是device data error 具体这个问题在老的那个无线键盘上不存在的. 不知道是windows的问题还是键盘的问题. 在xp sp2跟vista下面都存在这个问题... 我现在的做法是直接patch掉c000009c.这个在hidbth.sys的HidBthReadCompletion函数里面. 其实也可以在我们自己的驱动里面过滤掉set indicator这个iocontrol.不过这样以来就看不到键盘上的提示灯了.. 源代码放上来..vs 2008编译.使用wdk 6001 |
|
|
沙发#
发布于:2007-10-30 05:53
膜拜,太强悍了。
|
|
板凳#
发布于:2007-10-30 07:45
非常喜欢tiamo的作品。
是真正的大牛。 |
|
驱动小牛
![]() |
地板#
发布于:2007-10-30 08:38
猛牛再现.
|
地下室#
发布于:2007-10-30 08:41
膜拜,痛哭流涕的膜拜。对于大牛的作品我都感动得
![]() |
|
|
5楼#
发布于:2007-10-30 09:08
顶,,timao大牛献身啦。。。。。
|
|
6楼#
发布于:2007-10-30 11:47
强悍的tiamo大叔又出现了。。
![]() |
|
|
7楼#
发布于:2009-12-01 09:21
继续膜拜……
|
|
8楼#
发布于:2010-11-17 17:56
我 我 我 哭了
大虾 知道不 我为了你 注册了这个网站(登陆的时候发现早注册了。。。) |
|
9楼#
发布于:2010-12-05 20:18
回 楼主(tiamo) 的帖子
很崇拜呀,顺便说一句,我要下载附件,怎么说附件不存在了,下载不了。 |
|
10楼#
发布于:2011-02-24 13:09
附件又是下载不了。不知道是什么原因。
|
|
11楼#
发布于:2011-05-24 09:30
支持叼毛
|
|
|
12楼#
发布于:2011-05-25 09:55
追赶大牛开始!
|
|
13楼#
发布于:2011-09-27 00:31
谁还有这个代码发一下,谢谢了,mercy@21cn.com
|
|
|