I am using libusbdotnet in a C# application to communicate with a usb device. How do I give vendor specific commands like SET DATE TIME
using libusbdotnet?
-
What's the aim of the question? Do you want to change system configuration by inserting a USB device ? – McNets Jan 03 '17 at 08:30
-
Nope. I have to give the command to the usb device from my application. – user1985 Jan 03 '17 at 11:28
1 Answers
In the sense of the USB protocol vendor specific requests are common requests (see http://www.cypress.com/file/202971/download - Create your own USB vendor commands using FX2LP) and you propably would use a control transfer for this if it is sufficient to sent the request to the control endpoint EP0 of the device. You have to have deep knowledge of the internal structure of your device to be make this work, you have to know to which endpoint in the device structure the request has to be issued and what values you have to place in the fields of the request packet: address, bmRequestType, bRequest, (endpoint number),... If the vendor specific request can not be sent to the control endpoint you can not use a control transfer (http://www.beyondlogic.org/usbnutshell/usb4.shtml#Control).
General information on USB request are in http://www.beyondlogic.org/usbnutshell/usb6.shtml informations on vendor specific requests are for example in http://www.cypress.com/file/202971/download - Create your own USB vendor commands using FX2LP
The libusbdotnet method for a control transfer is
public virtual bool ControlTransfer(
ref UsbSetupPacket setupPacket,
Object buffer,
int bufferLength,
out int lengthTransferred
)
you have to build setupPacket
on your own, see http://www.beyondlogic.org/usbnutshell/usb6.shtml
http://libusbdotnet.sourceforge.net/V2/html/65fd96b8-6c8f-f877-22a5-15074d922485.htm
you can use libusb to perform a control transfers like this:
in Sync I/O
int libusb_control_transfer (libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout)
this can not be addressed to a specific endpoint, goes to EP0in Async I/O
libusb_control_setup (libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout)
can not be addressed to specific endpoints, goes to EP0, and has no data section meaning it builds only the setup packets in the control transfer (control transfer consists of setup stage, data stage, status stage) (http://libusb.org/static/api-1.0/structlibusb__control__setup.html)
If you have to send the request to a specific endpoint (not the control endpoint) you can use bulk transfer or interrupt_transfer
In http://libusb.sourceforge.net/api-1.0/group__syncio.html in http://libusb.org/static/api-1.0/group__misc.html are listed the standard USB requests that are available in libusb

- 9,149
- 4
- 22
- 34
-
Thanks for the answer ..Also I would like to understand if there are there any functions in libusbdotnet like below ********************************************************************************* usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout) – user1985 Jan 04 '17 at 05:08
-
in this link http://libusbdotnet.sourceforge.net/V2/html/7d9d422e-9884-43cd-87c8-304e249d0e27.htm is an example. you have to adapt it because it works only for a device that has loopback functionality in Config 1, Interface 0, Endpoints 0x01 and 0x81. – ralf htp Jan 04 '17 at 05:11
-
bulk read (data stream from device to host) is from bulk endpoint IN, bulk write (host to device) is from bulk endpoint OUT – ralf htp Jan 04 '17 at 05:13
-
if you want to accept this answer then don't vote it up because i am trying to get a badge – ralf htp Jan 04 '17 at 05:16