How to send vendor specific commands like "SET DATE TIME" to a usb device

1.9k views Asked by At

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?

1

There are 1 answers

4
ralf htp On

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 EP0

  • in 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