Re: usb_control_msg works in linux but not windows
Rob Willard <[email protected]>
| Newsgroups | gmane.comp.lib.libusb.devel.windows |
|---|---|
| Message-ID | <[email protected]> |
I would concur, and will speak with my firware guy, however this works
fine in linux, telling me the firmware is fine.
A further example is the following, which turns on an LED in linux:
int t2 = usb_control_msg(handle, USB_RECIP_INTERFACE |
USB_ENDPOINT_OUT, 10, on , 0, 0, 0, 10);
where on is an int.
receives the following error in Windows:
libusb0-dll:err [control_msg] sending control message failed, win
error: The parameter is incorrect.
I do have a packet sniffer in line with the device, and while I see the
setup commands fine, there is no packet activity on the requests I have
been speaking to while under Windows...
Here, for reference, is a code snippet that is in the firmware handling
the requests:
static uint8_t
117 USBD_Class_cb_Setup(void *pdev, USB_SETUP_REQ *req) {
118 DebugOut(" SU %d %d %d", req->bmRequest, req->bRequest,
req->wValue);
119
120 if (req->bRequest == 11) {
121 return RequestSamAD(pdev, req);
122 } else if (req->bRequest == 12) {
123 return UsbHandleMic(pdev, req);
124 } else if (req->bRequest == 14) {
125 return UsbHandleMult(pdev, req);
126 }
127
128 if (req->bmRequest & 0x80) {
129 // IN (read string from device)
130 switch (req->bRequest) {
131 case 1:
132 USBD_CtlSendData(pdev, (unsigned
char *) banner, strlen(banner) + 1);
133 break;
134 default:
135 USBD_CtlSendData(pdev, (unsigned
char *) "what?", 6);
136 break;
137 }
138 } else if (req->wLength > 0) {
139 // OUT (write string to device)
140 USBD_CtlPrepareRx(pdev, ep0recbuff, req->wLength);
141 } else {
142 // simple integer command
143 switch (req->bRequest) {
144 case 10:
145 return RequestLight(pdev, req);
146 default:
147 return USBD_FAIL;
148 }
149 }
150 return USBD_OK;
151 }
Again, very much appreciate the responses I have been getting!
Rob
On 14-02-21 02:04 PM, Travis wrote:
> You are still sending a "standard" clear feature request:
>
> 00000034 8.28595066 libusb0-sys:[clear_feature] recipient: 01 index: 0000 feature: 0000 timeout: 10
>
> I again suggest you use a vendor request type and update your firmware
> accordingly. I'd also increase the timeout to 1s for testing.
>
> That said, it looks like the request is making it to your device now but
> it is your device that is not excepting it. Note that you have changed
> what your device firmware need to look for; did you update your firmware??
>
> If I remember correctly, a "A device attached to the system is not
> functioning." error message after a control request generally means your
> device did not recognize the request and set a STALL condition.
>
> Regards,
> Travis
>
> On 2/21/2014 1:33 PM, Rob Willard wrote:
>> Thanks for the responses!
>>
>> I have read up more, and still have the same type of issues. I have
>> revisited my request type:
>>
>> usb_control_msg(handle, USB_RECIP_INTERFACE | USB_ENDPOINT_IN, 1,
>> 0, 0, buff, 64, 10);
>>
>> however still recieve errors in Windows (**this works fine under linux
>> using usb.h). Should return a string, but am getting:
>>
>> libusb0-dll:err [control_msg] sending control message failed, win
>> error: A device attached to the system is not functioning.
>>
>> I did as Xiaofan suggested and loaded the debug version. The output is
>> attached.
>>
>> Any further direction would be most appreciated...
>>
>> Rob
>>
>>
>> On 14-02-19 07:52 PM, Xiaofan Chen wrote:
>>> On Thu, Feb 20, 2014 at 9:39 AM, Travis <[email protected]> wrote:
>>>> Greetings,
>>>>
>>>> You are trying to use a "standard" usb request for what should be a
>>>> vendor request type. IE: the 0x01 in the 2nd param.
>>>>
>>>> For the 2nd param (request type) you need to use something like the
>>>> following to perform an action like that:
>>>> requesttype = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN
>>>> or
>>>> requesttype = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT
>>>>
>>>> if you specify USB_ENDPOINT_IN then you are saying you want the "bytes"
>>>> portion to be returned from the device (DEVICE TO HOST)
>>>> if you specify USB_ENDPOINT_OUT then you are saying you want the
>>>> "bytes"
>>>> portion to be sent to the device (HOST TO DEVICE)
>>>>
>>> Good analysis.
>>>
>>> To the OP, if you are new to USB, you may want to go
>>> through the following short introduction to USB.
>>> http://www.usbmadesimple.co.uk/index.html
>>>
>>> In particular, the following section talks about some of
>>> the terminology used in the above.
>>> http://www.usbmadesimple.co.uk/ums_4.htm
>>>
>>> A bit more in detail
>>> http://msdn.microsoft.com/en-us/library/windows/hardware/ff539261(v=vs.85).aspx
>>>
>>>
>>> If you want to read more,then the USB 2.0 spec is the best.
>>>
>>
>>
>> ------------------------------------------------------------------------------
>> Managing the Performance of Cloud-Based Applications
>> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
>> Read the Whitepaper.
>> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
>>
>>
>> _______________________________________________
>> Libusb-win32-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/libusb-win32-devel
>
> ------------------------------------------------------------------------------
> Managing the Performance of Cloud-Based Applications
> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
> Read the Whitepaper.
> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
> _______________________________________________
> Libusb-win32-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/libusb-win32-devel
------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk