打印
[圈圈教你玩USB]

请问圈圈鼠标XY绝对值报告描述符如下修改是哪里有问题

[复制链接]
4218|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luoyong21ic|  楼主 | 2010-2-11 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
逻辑最大约127 最小-127可以
code uint8 ReportDescriptor[]=
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
//这是一个局部条目。说明用途为指针集合
0x09, 0x01, //   USAGE (Pointer)
//这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
//物理集合,用途由前面的局部条目定义为指针集合。
0xa1, 0x00, //   COLLECTION (Physical)
//这是一个全局条目,选择用途页为按键(Button Page(0x09))
0x05, 0x09, //     USAGE_PAGE (Button)
//这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
0x19, 0x01, //     USAGE_MINIMUM (Button 1)
//这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
0x29, 0x03, //     USAGE_MAXIMUM (Button 3)
//这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
//最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
0x15, 0x00, //     LOGICAL_MINIMUM (0)
//这是一个全局条目,说明逻辑值最大为1。
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
//这是一个全局条目,说明数据域的数量为三个。
0x95, 0x03, //     REPORT_COUNT (3)
//这是一个全局条目,说明每个数据域的长度为1个bit。
0x75, 0x01, //     REPORT_SIZE (1)
0x81, 0x02, //     INPUT (Data,Var,Abs)
//这是一个全局条目,说明数据域数量为1个
0x95, 0x01, //     REPORT_COUNT (1)
//这是一个全局条目,说明每个数据域的长度为5bit。
0x75, 0x05, //     REPORT_SIZE (5)
0x81, 0x03, //     INPUT (Cnst,Var,Abs)
//这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
//这是一个局部条目,说明用途为X轴
0x09, 0x30, //     USAGE (X)
//这是一个局部条目,说明用途为Y轴
0x09, 0x31, //     USAGE (Y)
//这是一个局部条目,说明用途为滚轮
0x09, 0x38, //     USAGE (Wheel)
//0x15,0x81, //     LOGICAL_MINIMUM (-127)
//0x25,0x7f, //     LOGICAL_MAXIMUM (127)  
0x15,0x00, //     LOGICAL_MINIMUM (0)
0x26,0x00,0x04, //     LOGICAL_MAXIMUM (1024)
//这是一个全局条目,说明数据域的长度为8bit。
// 0x75, 0x08, //     REPORT_SIZE (8)
  0x75, 0x0c, //     REPORT_SIZE (12)
//这是一个全局条目,说明数据域的个数为3个。
0x95, 0x03, //     REPORT_COUNT (3)
// 0x81, 0x06,//  INPUT (Data,Var,Rel)
   0x81, 0x02, //  INPUT (Data,Var,abs)
0xc0,       //   END_COLLECTION
0xc0        // END_COLLECTION
};
///////////////////////////报告描述符完毕////////////////////////////

相关帖子

沙发
computer00| | 2010-2-11 10:25 | 只看该作者
看上去好象没啥问题。你将X,Y,WHEEL的size改成16试试,比较方便操作。

使用特权

评论回复
板凳
luoyong21ic|  楼主 | 2010-2-11 11:41 | 只看该作者
再次请教圈圈
如下改完后鼠标不动了
0x15,0x00, //     LOGICAL_MINIMUM (0)
0x26,0x00,0x04, //  LOGICAL_MAXIMUM (1024)
//这是一个全局条目,说明数据域的长度为8bit。
//0x75, 0x08, //     REPORT_SIZE (8)
0x75, 0x10, //     REPORT_SIZE (16)
//这是一个全局条目,说明数据域的个数为3个。
0x95, 0x03, //     REPORT_COUNT (3)
//这是一个主条目。它说明这三个8bit的数据域是输入用的,
//属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明
//这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示
//Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。
// 0x81, 0x06,//  INPUT (Data,Var,Rel)
   0x81, 0x02, //  INPUT (Data,Var,abs)

if(KeyPress & KEY1) //如果KEY1按住,则光标需要左移,即X轴为负值。
  {
   //Buf[1]=-1;  //这里一次往左移动一个单位。
    Buf[1]=250;  //这里一次往左移动一个单位。
  }
  if(KeyPress & KEY2) //如果KEY2按住,则光标需要右移,即X轴为正值。
  {
  // Buf[1]=1;   //这里一次往右移动一个单位。
    Buf[1]=129;   //这里一次往右移动一个单位。
  }
  if(KeyPress & KEY3) //如果KEY3按住,则光标需要上移,即Y轴为负值。
  {
  // Buf[2]=-1;   //这里一次往上移动一个单位。
   Buf[2]=255;   //这里一次往上移动一个单位。
  }
  if(KeyPress & KEY4)  //如果KEY4按住,则光标需要下移,即Y轴为正值。
  {
  // Buf[2]=1;  //这里一次往下移动一个单位。
   Buf[2]=128;   //这里一次往上移动一个单位。
  }
如果改为如下鼠标能动,但是XY不能超为127(我的最大值是255啊).我给Buf[1],Buf[2]赋值超过127,按键按下后XY轴直接跳到显示器最边上XY=0.
0x15,0x00, //     LOGICAL_MINIMUM (0)
0x26,0xff,0x00, //  LOGICAL_MAXIMUM (255)
//这是一个全局条目,说明数据域的长度为8bit。
//0x75, 0x08, //     REPORT_SIZE (8)
0x75, 0x08, //     REPORT_SIZE (8)

使用特权

评论回复
地板
computer00| | 2010-2-11 18:05 | 只看该作者
数据长度也变了呀...

report size改成16,返回的时候,x,y,whell,各为2个byte了,低字节在前。

button  xl  xh   yl   yh  wl   wh

使用特权

评论回复
5
luoyong21ic|  楼主 | 2010-2-14 12:07 | 只看该作者
请教圈圈我想用两个长整型(0--2048)的变量来控制鼠标XY轴的移动,这样就需要用到绝对值,但是报告描述符
好几天来都没有改好。以下是你书中原代码修改来的,请教一下具体应该如何改才行啊,先谢谢了!
code uint8 ReportDescriptor[]=
{
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)
0x19, 0x01, //     USAGE_MINIMUM (Button 1)
0x29, 0x03, //     USAGE_MAXIMUM (Button 3)
0x15, 0x00, //     LOGICAL_MINIMUM (0)
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
0x95, 0x03, //     REPORT_COUNT (3)
0x75, 0x01, //     REPORT_SIZE (1)
0x81, 0x02, //     INPUT (Data,Var,Abs)
0x95, 0x01, //     REPORT_COUNT (1)
0x75, 0x05, //     REPORT_SIZE (5)
0x81, 0x03, //     INPUT (Cnst,Var,Abs)
0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
0x09, 0x30, //     USAGE (X)
0x09, 0x31, //     USAGE (Y)
0x15, 0x00, //     LOGICAL_MINIMUM (0)
0x26, 0x00,0x08, //     LOGICAL_MAXIMUM (2048)
0x75, 0x10, //     REPORT_SIZE (16)
0x95, 0x02, //     REPORT_COUNT (2)
0x81, 0x02, //     INPUT (Data,Var,ABs)
0xc0,       //   END_COLLECTION
0xc0        // END_COLLECTION
};
void SendReport(void)
{
uint8 Buf[5]={0,0,0,0,0};
KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
{
  if(KeyPress & KEY1)   X轴
     Buf[1]=2048;   
  if(KeyPress & KEY3)   y轴
     Buf[2]=2000;  
  if(KeyPress & KEY7)  //鼠标左键
     Buf[0]|=0x01;  //D0为鼠标左键
  if(KeyPress & KEY8)  //鼠标右键
     Buf[0]|=0x02;  //D1为鼠标右键
  //报告准备好了,通过端点1返回,长度为4字节。
  D12WriteEndpointBuffer(3,5,Buf);
  Ep1InIsBusy=1;  //设置端点忙标志。
}
KeyUp=0;
KeyDown=0;
}

使用特权

评论回复
6
luoyong21ic|  楼主 | 2010-2-14 14:33 | 只看该作者
返回报告更正如下
void SendReport(void)
{
uint8 Buf[5]={0,0,0,0,0};
KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
{
  if(KeyPress & KEY1)
  {
      Buf[1]=0x00;  X轴2048
      Buf[2]=0x08;  
  }
  if(KeyPress & KEY2)
  {
      Buf[1]=0x00;  X轴1024
      Buf[2]=0x04;  
  }
  if(KeyPress & KEY3)
  {
     Buf[3]=0x00;  y轴 2048
     Buf[4]=0x08;   
  }

  if(KeyPress & KEY4)  
  {
      Buf[3]=0x00;  y轴1024
      Buf[4]=0x04;   
  }         
  if(KeyPress & KEY7)  //鼠标左键
     Buf[0]|=0x01;  //D0为鼠标左键
  if(KeyPress & KEY8)  //鼠标右键
     Buf[0]|=0x02;  //D1为鼠标右键
  D12WriteEndpointBuffer(3,5,Buf);
  Ep1InIsBusy=1;  //设置端点忙标志。
}
//记得清除KeyUp和KeyDown
KeyUp=0;
KeyDown=0;
}

使用特权

评论回复
7
luoyong21ic|  楼主 | 2010-2-14 17:22 | 只看该作者
请教圈圈
按你的指点报告描述符更改好了,现在需要更改为
0x15, 0x00, //     LOGICAL_MINIMUM (0)
0x26, 0x30,0x75, //     LOGICAL_MAXIMUM (30000)
后鼠标才能基本充滿屏幕。请问为什么要设置30000多点才能充滿屏幕?它的单位是什么。
这是一个什么样的关系?网上也没有找到什么好资料。
以前我个人认为我将逻辑值设为0--2048这个值是对应屏幕上每个像素点,若将鼠标X轴坐标设为2048,
电脑会自动按现在屏幕分辨率(1024X768)来计算,哪么现在鼠标就应该在屏幕的最右边。
但是现在鼠标X轴根本不是按分辨率来的。我将屏分辨率设为其它值,鼠标都是在同一位置。

使用特权

评论回复
8
computer00| | 2010-2-21 11:53 | 只看该作者
我会将逻辑最大值,物理最大值都设置成0x7FFF。

0代表屏幕最左边,0x7FFF代表屏幕最右边,中间的按线性变换。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

33

帖子

1

粉丝