PORTS Forum
Ports and Interfaces => USB => Topic started by: ulao on January 31, 2018, 08:41:09 am
-
Can anyone shed some light on winusb? I noticed that hidusb driver works well on windows but the winusb does not play well with feature reports. I have no technical data on this but I do know that every win10 computer that has winusb instead of hidusb crashes on control transfers sending feature reports. In this case they are sent via hidapi.dll
-
Feature reports are specific to HID-class devices with bmRequestType indicating a Class request.
WinUSB supports generic, vendor-defined control transfers, which could contain the same data as a HID Feature report.
-
All of my reports are vendor-defined reports but all stall with winUSB. Also the PID interface is stalling (i.e. force feedback out/in reports).
this report for example stalls with winUSB not with hidUSB (PID)
0x05,0x0F, // Usage Page Physical Interface
0x09,0x89, // Usage Block Load Status
0xA1,0x02, // Collection Datalink
0x85,0x02, // Report ID 2
0x09,0x22, // Usage Effect Block Index
0x25,0x28, // Logical Maximum 28h (40d)
0x15,0x01, // Logical Minimum 1
0x35,0x01, // Physical Minimum 1
0x45,0x28, // Physical Maximum 28h (40d)
0x75,0x08, // Report Size 8
0x95,0x01, // Report Count 1
0xB1,0x02, // Feature (Variable)
0x09,0x8B, // Usage Block Load Full
0xA1,0x02, // Collection Datalink
0x09,0x8C, // Usage Block Load Error
0x09,0x8D, // Usage Block Handle
0x09,0x8E, // Usage PID Block Free Report
0x25,0x03, // Logical Maximum 3
0x15,0x01, // Logical Minimum 1
0x35,0x01, // Physical Minimum 1
0x45,0x03, // Physical Maximum 3
0x75,0x08, // Report Size 8
0x95,0x01, // Report Count 1
0xB1,0x00, // Feature
0xC0 , // End Collection
0x09,0xAC, // Usage Undefined
0x15,0x00, // Logical Minimum 0
0x27,0xFF,0xFF,0x00,0x00, // Logical Maximum FFFFh (65535d)
0x35,0x00, // Physical Minimum 0
0x47,0xFF,0xFF,0x00,0x00, // Physical Maximum FFFFh (65535d)
0x75,0x10, // Report Size 10h (16d)
0x95,0x01, // Report Count 1
0xB1,0x00, // Feature
0xC0 , // End Collection
these are my custom reports and they all fail.
0x09,0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
//get pressure
0x85, 0x15, // REPORT_ID (21)
0x95, 0x0D, // REPORT_COUNT (13)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//get info
0x85, 0x11, // REPORT_ID (17)
0x95, 0x04, // REPORT_COUNT (4
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//get info
0x85, 0x17, // REPORT_ID (23)
0x95, 0x30, // REPORT_COUNT (48)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//get DC LCD
0x85, 0x13, // REPORT_ID (19)
0x95, 0xc0, // REPORT_COUNT (192)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//get data
0x85, 0x16, // REPORT_ID (22)
0x95, 0x22, // REPORT_COUNT (34)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//send data
0x85, 0x12, // REPORT_ID (18)
0x95, 0x24, // REPORT_COUNT (36) 32+(rid,command, 0, 0)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
//send DC LCD
0x85, 0x14, // REPORT_ID (20)
0x95, 0xc4, // REPORT_COUNT (196) 192+(rid,command, 0, 0)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
0xc0, // END_COLLECTION
-
WinUSB doesn't support HID reports though you can use WinUSB control transfers to send and request generic data.
-
Then I'm confused on the terms here.
What is a "HID report"
vs
"Control transfer"
Are the above reports not all control transfers? I thought all feature reports were control transfers?
------------------------------------------------------
oh wait.. I think I see where I failed to connect the dots. So winusb is not going to work with my c# HIDapi wrapper. I was thinking that they were agnostic of each other. I would need to find a winusb wrapper so it sends the "winusb Control transfer" instead of the "hid Control transfer". is this right?
I guess my issue is my application is using the hidapi.dll to send data but with a system that has winusb, that is not going to work? I package the hidapi.dll with my application so I would assume that it uses that but maybe the system is using winusb and somehow messing things up?
-
Yes, WinUSB does not understand HID APIs. You will also need to change the device firmware, as WinUSB doesn't use class requests.