阅读:4972回复:0
USB HidD_SetFeature 固件问题
大家好:
现在本人在做一个具有额外功能的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只有一个,两个驱动的话能加载和区分出来吗? 希望哪位做过这方面的达人能指点一二!!!不胜感激 |
|