一般的USB鼠标跟PC是怎么通信的

辛昕   2011-2-22 17:01 楼主

这两天在琢磨着怎么把一个废旧USB鼠标改造成无线鼠标。

呵呵,我是想用这个申请坛子里的eZ430-RF2500开发套件。

 

在网上看资料,能找到一个最好的资料是一个百度贴吧里的 用315M无线模块 和 一对译码器编码器 改造的串口鼠标。

看了半天,忽然想起一个很重要的问题,它做的是串口鼠标,所以那对译码器编码器估计就是起这个作用,但是,我的笔记本没串口,而且我比较想做到的是 直接用这个开发套件取代那一根USB电缆。

也就是直接通过USB口通信。

 

昨晚看了MSP430论坛,看了好久,从一些帖子分享套件的资料和图片中,我对这个套件有了一些了解:

那两块CC2500的收发模块可能是一模一样的两块板,一收一发。 所以,我想这个可以取代 他用的315M无线模块。

但是,我对它和PC的通信完全不了解。

 

这个套件的介绍说它的应用之一是做无线鼠标,所以我想,是不是这个套件的那个带USB口的那一块是不是已经有了和PC的通信问题。而我记得它是UART通信,因为,在那个“这个DEMO真不错”的帖子里,LZ说,只要插入了USB口,就可以通过UART和电脑串口通信。

 

下载了一个资料,是针对这个套件的无线鼠标设计 的应用参考,不过,是全英的,看起来比较费劲,而且今天的时间都拿去干别的了,可能要明后几天才能看出点眉毛。

所以先发帖求问。

 

真的很想抓住这个机会,接触一下MSP430!!

[ 本帖最后由 辛昕 于 2011-2-22 17:02 编辑 ]
强者为尊,弱者,死无葬身之地

回复评论 (16)

开发板还有一个试用名额的,详情见
https://bbs.eeworld.com.cn/viewthread.php?tid=243238
点赞  2011-2-22 18:34
俺是来帮顶的
点赞  2011-2-22 23:18

回复 楼主 辛昕 的帖子

楼主你好,下面是USB中 鼠标键盘 的描述符
code char KeyBoardReportDescriptor[63] = {
    //表示用途页为通用桌面设备
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)

    //表示用途为键盘
    0x09, 0x06,                    // USAGE (Keyboard)
   
    //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION
    0xa1, 0x01,                    // COLLECTION (Application)
   
    //表示用途页为按键
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)

    //用途最小值,这里为左ctrl键
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    //用途最大值,这里为右GUI键,即window键
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    //逻辑最小值为0
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    //逻辑最大值为1
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
    0x75, 0x01,                    //   REPORT_SIZE (1)
    //报告的个数为8,即总共有8个bits
    0x95, 0x08,                    //   REPORT_COUNT (8)
    //输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
    //而鼠标移动这样的则报告相对值,表示鼠标移动多少
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
    //分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
    //它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
    //否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
    //需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
    //特殊键,例如ctrl,shift,del键等



    //这样的数据段个数为1
    0x95, 0x01,                    //   REPORT_COUNT (1)
    //每个段长度为8bits
    0x75, 0x08,                    //   REPORT_SIZE (8)
    //输入用,常量,值,绝对值
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
   
    //上面这8个bit是常量,设备必须返回0


    //这样的数据段个数为5
    0x95, 0x05,                    //   REPORT_COUNT (5)
    //每个段大小为1bit
    0x75, 0x01,                    //   REPORT_SIZE (1)
    //用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用
    0x05, 0x08,                    //   USAGE_PAGE (LEDs)
    //用途最小值是Num Lock,即数字键锁定灯
    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
    //用途最大值是Kana,这个是什么灯我也不清楚^_^
    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
    //如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
    //1表示灯亮,0表示灯灭
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    //这样的数据段个数为1
    0x95, 0x01,                    //   REPORT_COUNT (1)
    //每个段大小为3bits
    0x75, 0x03,                    //   REPORT_SIZE (3)
    //输出用,常量,值,绝对
    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)   
    //由于要按字节对齐,而前面控制LED的只用了5个bit,
    //所以后面需要附加3个不用bit,设置为常量。



    //报告个数为6
    0x95, 0x06,                    //   REPORT_COUNT (6)
    //每个段大小为8bits
    0x75, 0x08,                    //   REPORT_SIZE (8)
    //逻辑最小值0
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    //逻辑最大值255
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    //用途页为按键
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    //使用最小值为0
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    //使用最大值为0x65
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    //输入用,变量,数组,绝对值
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    //以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
    //有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
    //无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
    //个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
    //字节分别为相应的键值,以次类推。


    //关集合,跟上面的对应
    0xc0                           // END_COLLECTION
};



     通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,
因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的
第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果
只有左ctrl键按下,则返回01 00 00 00 00 00 00 00(十六进制),如果
只有数字键1 按下,则返回00 00 59 00 00 00 00 00,如果数字
键1 和2 同时按下,则返回00 00 59 5A 00 00 00 00,如果
再按下左shift 键,则返回02 00 59 5A 00 00 00 00,
然后再释放1   键,则返回02 00 5A 00 00 00 00 00,
然后全部按键释放,则返回00 00 00 00 00 00 00 00。
这些数据(即报告)都是通过中断端点返回的。当按下Num Lock键时,PC会发送
输出报告,从报告描述符中我们知道,Num Lock的LED对应着输出报告的最低位,
当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);
当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。




下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。
它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,
0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标
上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节
表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。

code char MouseReportDescriptor[52] = {
    //通用桌面设备
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    //鼠标
    0x09, 0x02,                    // USAGE (Mouse)
    //集合
    0xa1, 0x01,                    // COLLECTION (Application)
    //指针设备
    0x09, 0x01,                    //   USAGE (Pointer)
    //集合
    0xa1, 0x00,                    //   COLLECTION (Physical)
    //按键
    0x05, 0x09,                    //     USAGE_PAGE (Button)
    //使用最小值1
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
    //使用最大值3。1表示左键,2表示右键,3表示中键
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
    //逻辑最小值0
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    //逻辑最大值1
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    //数量为3
    0x95, 0x03,                    //     REPORT_COUNT (3)
    //大小为1bit
    0x75, 0x01,                    //     REPORT_SIZE (1)
    //输入,变量,数值,绝对值
    //以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键
    //bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)

    //填充5个bit,补足一个字节
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x75, 0x05,                    //     REPORT_SIZE (5)
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)

    //用途页为通用桌面
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
    //用途为X
    0x09, 0x30,                    //     USAGE (X)
    //用途为Y
    0x09, 0x31,                    //     USAGE (Y)
    //用途为滚轮
    0x09, 0x38,                    //     USAGE (Wheel)
    //逻辑最小值为-127
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    //逻辑最大值为+127
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    //大小为8个bits
    0x75, 0x08,                    //     REPORT_SIZE (8)
    //数量为3个,即分别代表x,y,滚轮
    0x95, 0x03,                    //     REPORT_COUNT (3)
    //输入,变量,值,相对值
    0x81, 0x06,                    //     INPUT (Data,Var,Rel)

    //关集合
    0xc0,                          //   END_COLLECTION
    0xc0                           // END_COLLECTION
};


通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,
则返回01 00 00 00(十六进制值),如果右键按下,则返回02 00 00 00,如果中键按下,
则返回04 00 00 00,如果三个键同时按下,则返回07 00 00 00。如果鼠标往右移动则
第二字节返回正值,值越大移动速度越快。其它的类推。
处处留心皆学问!
点赞  2011-2-23 08:36

回复 4楼 daicheng 的帖子

这个详解 好 
点赞  2011-2-23 08:47

给你上传一下关于HID 设备的资料

HID 设备.doc (47 KB)
(下载次数: 135, 2011-2-23 09:02 上传)

如果需要例子,可以帮你传一下(说明哪个CPU的)

处处留心皆学问!
点赞  2011-2-23 09:02

额,这个是什么啊,看得一头雾水。
额,这是鼠标和PC的通信用的 标识符?
呵呵,其实,其实,其实我只是想知道怎样PC和鼠标的信号通信,它是通过什么方式,或者说协议?
因为不太懂,所以没说明白。
强者为尊,弱者,死无葬身之地
点赞  2011-2-23 14:46

看来我要多研究你给的HID资料

看了看,也许它能给我扫盲,呵呵。谢谢了。
强者为尊,弱者,死无葬身之地
点赞  2011-2-23 14:48
有点晕晕的。呵呵。USB驱动层的东西。太高深了!
点赞  2011-2-23 22:12

回复 沙发 wstt 的帖子

https://bbs.eeworld.com.cn/viewth ... 60&extra=&frombbs=1

老版,我发申请了。
强者为尊,弱者,死无葬身之地
点赞  2011-2-24 10:36

回复 4楼 daicheng 的帖子

daicheng大哥。
看了你发的那个HID设备的DOC文档,回头看你发的那个 描述符,有点儿看懂了是说啥了。

不过,那个文档里,末尾那个驱程,额,看起来像是用C语言写的,可是不知道为什么看不太懂,是不是有很多子程序没给出子程序的定义啊。
看起来迷迷糊糊的。
另外想问问的是,关于C语言,我懂基本的程序结构,懂函数,指针,不知道还需要啥知识才能看懂这个程序。
额,因为我的C语言懂的很少,也没编过什么大程序,都是些练习题。
强者为尊,弱者,死无葬身之地
点赞  2011-2-24 11:06

回复 楼主 辛昕 的帖子

顶顶心昕哈哈哈,加油,点子总是很多啊,向你学习了哈哈哈

[ 本帖最后由 鑫海宝贝 于 2011-3-3 21:08 编辑 ]
点赞  2011-3-3 21:07

圈圈不是有个讲怎么玩usb的书吗

点赞  2011-3-4 09:06
有点晕晕的。呵呵。USB驱动层的东西。太高深了!
点赞  2011-6-16 12:59
楼主的无线鼠标做得怎么样了?
也想做一个玩。嘻嘻
点赞  2011-6-16 23:29
楼主强人啊,改造无线鼠标
点赞  2011-6-17 11:45

rt

retert
点赞  2011-6-19 00:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复