zzf19761212
驱动牛犊
驱动牛犊
  • 注册日期2007-08-28
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4974回复:0

USB HidD_SetFeature 固件问题

楼主#
更多 发布于:2008-12-22 19:44
 大家好:
    现在本人在做一个具有额外功能的Mouse;要求PC能发送一定的数据(少量的)给Mouse,控制一些动作, 现在在68013A的demo板上开发, 鼠标的基本功能已经实现, 用按钮可以控制鼠标的方向和点击! 但在做PC发送数据给Mouse的时候,碰到了问题:
   在VC程序中找到USB设备后;用CreateFile函数创建一个Handle,用WriteFile和ReadFile函数无法写和读, 在网上查资料,发现当USB设备定义成Mouse和KeyBoard的时候,微软的标准驱动不允许应用程序去读写下面的设备, 把这两个IRP过滤掉了, 所以无法用WriteFile和ReadFile函数去操作, 但有些论坛上说可以用HidD_SetFeature 发送 Feature Report 给USB设备,本人试了试, HidD_SetFeature 确实可以发送,发送数据下去, Demo 板上的 LED灯可以根据命令改变, 但存在问题:
   1: Firmware可以收到SetReport的命令, 但后面的数据却收不到;
   2: VC 程序发送HidD_SetFeature 时,每次是信号灯超时时间到,(但每次LED灯会改变,说明这个Feature Report 收到了)应该是PC这边没收到握手包! 今天在固件程序中加了EZUSB_STALL_EP0();测试后发现错误变成:设备没有发生作用!不加是信号灯超时时间到
  
   看来问题是出在固件中,对于Feature report报告处理没做好,有哪位在固件中做过Feature report 处理的?
下面是我的部分代码和操作的一些过程:
     ………
固件代码 处理feature report
 if(SETUPDAT[0]==0x21) // Hid 类请求
   {
     if(SETUPDAT[1]==0x09)//set_report
     {
          //WLED_DATA=EP0BUF[0];
          WLED_DATA++;  //改变led灯
          EZUSB_STALL_EP0(); //停止控制端点操作;
     }
   }
…….
VC代码:
……………….
       OutputReport[0]=0;
    OutputReport[1]=0x5A;

    if (WriteHandle != INVALID_HANDLE_VALUE)
    {
      Result = HidD_SetFeature(WriteHandle,OutputReport,2); //发送feature report

       DisplayLastError("HidD_SetFeature: ");
    }
……………

报告描述符:

ReportDscr:
        db 05h, 01h     ;     Usage Page (Generic Desktop),
    db 09h, 02h     ;     Usage (Mouse),
    db 0A1h, 01h    ;     Collection (Application),
    db 09h, 01h     ;           Usage (Pointer),
    db 0A1h, 00h    ;        Collection (Physical),
    db 95h, 03h     ;               Report Count (3),
    db 75h, 01h     ;               Report Size (1),
    db 05h, 09h    ;            Usage Page (Buttons),
    db 19h, 01h    ;            Usage minimum (1)
    db 29h, 03h    ;            Usage maximum (3)
    db 15h, 00h     ;               Logical minimum (0),
    db 25h, 01h     ;               Logical maximum (1),    
    db 81h, 02h     ;               Input (Data, Variable, Absolute), (3 button bits)
    db 95h, 01h     ;               Report Count (1),
    db 75h, 05h     ;               Report Size (5),
    db 81h, 01h     ;               Input (Constant)
    db 75h, 08h    ;        Report Size (8)
    db 95h, 02h    ;               Report Count (2)              
    db 05h, 01h     ;               Usage Page (Generic Desktop),
    db 09h, 30h     ;               Usage (X),
    db 09h, 31h     ;               Usage (Y),
    db 16h, 01h,80h     ;           Logical Minimum (-127),
    db 26h, 0ffh,7Fh     ;          Logical Maximum (+127),    
    db 81h, 06h     ;               Input (Data, Variable, Relative), (2 position bytes - X & Y)  
      ;  db 05h, 0ah;                    //   USAGE_PAGE (Ordinals)
       ; db 09h, 08h;                    //   USAGE (Instance 8)
       ; db 15h, 00h;                    //   LOGICAL_MINIMUM (0)
       ; db 25h, 0ffh;                    //  LOGICAL_MAXIMUM (255)
       ; db 75h, 08h;                    //   REPORT_SIZE (8)
       ; db 95h, 02h;                    //   REPORT_COUNT (1)
       ; db 91h, 02h;                    //   OUTPUT (Data,Var,Abs)
  
       db 09h, 10h; // Usage (Reserved)
       db 75h, 08h; // Report Size (8)
       db 95h, 01h;// Report Count (1)
       db 15h, 00h ;//Logical Minmum (00)
       db 26h, 0ffh,00h; //Logical Maximum (255)
       db 0B1h, 02h; // Feature (Constant)
    
       db 0C0h         ;            End Collection
       db 0C0h         ;        End Collection

      
ReportDscrEnd:


问题:
 1:  当HID设备定义成Mouse和KeyBoard的时候, HidD_SetFeature 到底能不能发送feature report给设备?
 2:  微软在驱动的哪一层屏蔽了读写的请求,若自己开发驱动的话是否可以把这两个请求加进去?
 3: 一些书上说HID设备可以定义多个接口,如在KeyBoard中加入了Mouse功能, 就可以定义KeyBoard和Mouse两个接口, 那我这个东东是否也可以定义成两个接口: Mouse+自定义接口(游戏杆,LED灯什么的), 有个疑惑: 若这样做的话,在PC端是否需要两个驱动,如Mouse+游戏杆的话,在设备管理器中是否能看到Mouse和游戏杆两个设备? 但设备的VID和PID只有一个,两个驱动的话能加载和区分出来吗?
 
希望哪位做过这方面的达人能指点一二!!!不胜感激
游客

返回顶部