tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
阅读:5373回复:13

新鲜出炉小玩意儿第二弹

楼主#
更多 发布于:2007-10-30 00:34
恩。。。买了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
附件名称/大小 下载次数 最后更新
source.rar (33KB)  107 2007-10-30 00:34
throb
驱动牛犊
驱动牛犊
  • 注册日期2005-02-23
  • 最后登录2022-03-04
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望86点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-10-30 05:53
膜拜,太强悍了。
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-30 07:45
非常喜欢tiamo的作品。
是真正的大牛。
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-30 08:38
猛牛再现.
WY.lslrt
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2009-10-27
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望15点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-30 08:41
膜拜,痛哭流涕的膜拜。对于大牛的作品我都感动得
---传说中的分割线--------
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-10-30 09:08
顶,,timao大牛献身啦。。。。。
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-10-30 11:47
强悍的tiamo大叔又出现了。。
人不靓仔心灵美,版头不正红花仔!
weolar
驱动牛犊
驱动牛犊
  • 注册日期2007-05-14
  • 最后登录2012-11-30
  • 粉丝1
  • 关注0
  • 积分48分
  • 威望445点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分1分
7楼#
发布于:2009-12-01 09:21
继续膜拜……
sosobiao
驱动牛犊
驱动牛犊
  • 注册日期2010-07-05
  • 最后登录2010-12-21
  • 粉丝1
  • 关注0
  • 积分9分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2010-11-17 17:56
我  我 我 哭了  

大虾  知道不 我为了你 注册了这个网站(登陆的时候发现早注册了。。。)
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-12-05 20:18
回 楼主(tiamo) 的帖子
很崇拜呀,顺便说一句,我要下载附件,怎么说附件不存在了,下载不了。
zhuliang
驱动牛犊
驱动牛犊
  • 注册日期2008-04-16
  • 最后登录2012-10-05
  • 粉丝2
  • 关注1
  • 积分16分
  • 威望181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2011-02-24 13:09
附件又是下载不了。不知道是什么原因。
viQ505
驱动牛犊
驱动牛犊
  • 注册日期2009-02-24
  • 最后登录2011-09-04
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2011-05-24 09:30
支持叼毛
今天你吃了了吗
bzhao
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2023-09-11
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2011-05-25 09:55
追赶大牛开始!
Owen.Guo
驱动中牛
驱动中牛
  • 注册日期2001-03-30
  • 最后登录2012-03-29
  • 粉丝0
  • 关注1
  • 积分402分
  • 威望260点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2011-09-27 00:31
谁还有这个代码发一下,谢谢了,mercy@21cn.com
Owen.Guo 祝你成功!
游客

返回顶部