OLE Developer Guide  Latest Git
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
Host <-> Device Communication

Overview

The Host and Device communicate by exchanging messages. Each message represents an operation or command. All communication is initiated by the Host and the Device sends a single message in reply to each command.

Messages sent from the Host to the Device are Requests, messages sent from the Device to the Host are Responses.

Byte Ordering

All multi-byte fields are sent little endian (LSB first) unless otherwise specified.

Message Format

Request

Each request message begins with a common header, zero or more byte of payload data, an end-of-message marker and then zero or more bytes of padding. The total message size must not exceed USB_READ_BUFFER_SIZE.

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      SOM      |     Token     |            Command            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |            Length             |       Payload (if any)        \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 \                        Payload (if any)                       \
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      EOM      |               Padding (optional)              \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
SOMThe start of message identifier: START_OF_MESSAGE_ID
TokenA token for the request. The same token will be returned in the response. Typically the host will increment the token with each request.
CommandThe Command identifier.
LengthThe length of the data included in the request. The valid range is 0 - 579 bytes.
PayloadThe payload data associated with the request. See each command type below for the specific format of the payload data.
EOMThe end of message identifier: END_OF_MESSAGE_ID
PaddingExtra padding. If present this should be filled with 0s. Padding can be added as long as the total message does not exceed USB_READ_BUFFER_SIZE.

Response

Responses use the same header as Requests, with an additional 2 bytes to indicate the return code and status flags.

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      SOM      |     Token     |            Command            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |            Length             |  Return_Code   |     Status   |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 \                        Payload (if any)                       \
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      EOM      |               Padding (optional)              \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
SOMThe start of message identifier: START_OF_MESSAGE_ID
TokenThe token that was provided in the corresponding request.
CommandThe Command identifier.
Return_CodeThe ReturnCode of the response.
StatusThe status bitfield.
LengthThe length of the data included in the command. The valid range is 0 - 579 bytes.
PayloadThe payload data associated with the command. See each command type below for the specific format of the payload data.
EOMThe end of message identifier: END_OF_MESSAGE_ID
PaddingExtra padding. If present this should be filled with 0s. Padding can be added as long as the total message does not exceed USB_READ_BUFFER_SIZE.

Commands

Echo

Echo data back from the device. This serves as a basic test that Host to Device communications are working correctly.

Request Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                     Data (variable size)                      \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Data0 or more bytes of data.

Response Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                     Data (variable size)                      \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Data0 or more bytes of data, to match what was provided in the request.
Returns
RC_OK.

Set Mode

Set the operating mode of the device. The device can operate as either a controller or a responder.

Request Payload

  0
  0 1 2 3 4 5 6 7 8
 +-+-+-+-+-+-+-+-+-+
 |   Mode          |
 +-+-+-+-+-+-+-+-+-+
Parameters
ModeThe new mode to operate in. 0 for controller, 1 for responder.

Response Payload

The response contains no data.

Returns
RC_OK.

Get Hardware Information

Get the hardware information for the device.

Request Payload

The request contains no data.

Response Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Model ID               |             UID             |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                             UID (cont.)                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                            MAC Address                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |       MAC Address (cont.)       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Model_IdThe JaRuleModel of the device.
UIDThe UID of the device, in network byte order.
MACThe MAC address of the device, in network byte order. If the device does not have a MAC this will be 0.
Returns
RC_OK.

Run Self Test

Run the loopback self test. The device must be in self test mode to perform this.

Request Payload

The request contains no data.

Response Payload

The response contains no data.

Returns
RC_OK or RC_TEST_FAILED.

Reset

Resets the device. This can be used to recover from failures.

Request Payload

The request contains no data.

Response Payload

The response contains no data.

Returns
RC_OK.

Get Break Time

Gets the current break time for outgoing DMX512 / RDM messages.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Break_Time           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Break_TimeThe current break time in microseconds.
Returns
RC_OK.

Set Break Time

Sets the break time for outgoing DMX512 / RDM messages.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |           Break_Time          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Break_TimeThe new break time in microseconds. See Transceiver_SetBreakTime() for the range of values allowed.

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get Mark Time

Gets the current mark-after-break time for outgoing DMX512 / RDM messages.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |         Mark_Time             |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Mark_TimeThe current mark time in microseconds.
Returns
RC_OK.

Set Mark Time

Sets the mark time for outgoing DMX512 / RDM messages.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |         Mark_Time             |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Mark_TimeThe new mark time in microseconds. See Transceiver_SetMarkTime() for the range of values allowed.

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get RDM Broadcast Timeout

Get the time the controller will wait for an RDM Response after sending a broadcast command.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |             Timeout           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
TimeoutThe current RDM broadcast timeout, in 10ths of a millisecond.
Returns
RC_OK.

Set RDM Broadcast Timeout

Sets the time to wait for an RDM response after sending a broadcast RDM command. When set to a non-0 value, this allows us to detect responders that incorrectly respond to broadcast commands.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |             Timeout           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
TimeoutThe time to wait for a RDM response after a broadcast command, in 10ths of a millisecond. See Transceiver_SetRDMBroadcastTimeout().

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get RDM Response Timeout

Get the time that the controller will wait for an RDM Response after sending an RDM command.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |             Timeout           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
TimeoutThe current RDM response timeout, in 10ths of a millisecond.
Returns
RC_OK.

Set RDM Response Timeout

Sets the time to wait for a reply after a sending an RDM command.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |             Timeout           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
TimeoutThe time to wait for a RDM response after a broadcast command, in 10ths of a millisecond. See Transceiver_SetRDMResponseTimeout().

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get RDM DUB Response Limit

Get the maximum time a DUB response can take.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Limit            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
LimitThe maximum time a DUB response can take, in 10ths of a microsecond.
Returns
RC_OK.

Set RDM DUB Response Limit

Sets the time to wait for a reply after a sending an RDM command.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Limit            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
LimitThe maximum time a DUB response can take, in 10ths of a millisecond. See Transceiver_SetRDMDUBResponseLimit().

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get RDM Responder Delay

Get the minimum time the responder waits before sending an RDM response.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Delay            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
DelayThe current RDM responder delay, in 10ths of a microsecond.
Returns
RC_OK.

Set RDM Responder Delay

Sets the minimum time the responder waits before sending an RDM response.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Delay            |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
DelayThe minimum time to wait before sending an RDM response, in 10ths of a microsecond. See Transceiver_SetRDMResponderDelay().

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Get RDM Responder Jitter

Get the maximum jitter to use when sending RDM responses.

Request Payload

The request contains no data.

Response Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Jitter           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
JitterThe current RDM responder jitter, in 10ths of a microsecond.
Returns
RC_OK.

Set RDM Responder Jitter

Set the jitter to use when sending RDM responses.

Request Payload

  0                   1
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |              Jitter           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
DelayThe jitter to use when sending an RDM response, in 10ths of a microsecond. See Transceiver_SetRDMResponderJitter().

Response Payload

The response contains no data.

Returns
RC_OK or RC_BAD_PARAM if the value was out of range.

Transmit DMX512

Sends a single DMX512, Null Start Code frame.

Request Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                   DMX_Data (variable size)                    \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
DMX_DataThe DMX512 slot data, excluding the start code. The number of slots may be 0 - 512.

Response Payload

The response contains no data.

Returns

Transmit RDM DUB

Sends a RDM discovery unique branch command and then listens for a response. If any data is received, it is returned in the response payload. If no data is received a RC_RDM_TIMEOUT is returned.

The response payload includes timing data.

Request Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                          DUB_Command                          \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
DUB_CommandThe RDM Discovery Unique Branch command, excluding the start code. The command should be 37 bytes.

Response Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |        Discovery_Start        |        Discovery_End          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \               RDM_DUB_Response (variable size)                \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Discovery_Startthe time from the end of the transmitted DUB frame to the start of the DUB response, in 10ths of a microsecond. Undefined unless RC_OK was returned.
Discovery_Endthe time from the end of the transmitted DUB frame to the end of the DUB response, in 10ths of a microsecond. Undefined unless RC_OK was returned.
RDM_DUB_ResponseThe raw response, if any was received.
Returns

Transmit Broadcast RDM Get / Set

Sends a broadcast RDM Get / Set command. If the Broadcast Listen Delay is not 0, the transceiver will then listen for a response. If a response is received, it will be returned in the response payload.

Request Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                        RDM_Command                            \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
RDM_CommandThe broadcast RDM Get / Set command, excluding the start code.

Response Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Break_Start           |           Break_End          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |           Mark_End             | RDM_Response (variable size) \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                 RDM_Response (variable size)                  \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Break_Startthe time from the end of the transmitted RDM frame to the start of the break, in 10ths of a microsecond. Undefined unless RC_RDM_BCAST_RESPONSE was returned.
Break_Endthe time from the end of the transmitted RDM frame to the end of the break / start of the mark, in 10ths of a microsecond. Undefined unless RC_RDM_BCAST_RESPONSE was returned.
Mark_Endthe time from the end of the transmitted RDM frame to the start of the mark, in 10ths of a microsecond. Undefined unless RC_RDM_BCAST_RESPONSE was returned.
RDM_ResponseThe RDM response, if any was received.
Returns
  • RC_OK if the frame was broadcast correctly and the broadcast listen delay was 0 or the delay was non-0 and no data was received.
  • RC_BUFFER_FULL if the transmit buffer is full.
  • RC_TX_ERROR if a transmit error occurred.
  • RC_RDM_BCAST_RESPONSE if a response was received.

Transmit RDM Get / Set

Send a RDM Get / Set command and listen for a response. If a response is received, it will be returned in the response payload.

Request Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                        RDM_Command                            \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
RDM_CommandThe RDM Get / Set command, excluding the start code.

Response Payload

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Break_Start           |           Break_End          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |           Mark_End             | RDM_Response (variable size) \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 \                 RDM_Response (variable size)                  \
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Parameters
Break_Startthe time from the end of the transmitted RDM frame to the start of the break, in 10ths of a microsecond. Undefined unless RC_OK was returned.
Break_Endthe time from the end of the transmitted RDM frame to the end of the break / start of the mark, in 10ths of a microsecond. Undefined unless RC_OK was returned.
Mark_Endthe time from the end of the transmitted RDM frame to the start of the mark, in 10ths of a microsecond. Undefined unless RC_OK was returned.
RDM_ResponseThe RDM response, if any was received.
Returns

Unrecognised Commands

If the device receives a command ID that is doesn't recognize it will return RC_UNKNOWN.

Transport Considerations

USB

Communication with the Ja Rule device happens over a custom endpoint.

The maximum packet size (wMaxPacketSize) for the USB device is 64 bytes. This is the largest packet size for a full speed, bulk endpoint. The RX buffer must be a multiple of the maxPacketSize. Since the largest payload data size is 513 bytes, we'll set the RX buffer size to 640 (64 * 10).

On the Microchip RX side, the USB_DEVICE_EVENT_ENDPOINT_READ_COMPLETE event will be triggered if either:

  • the host sends less than maxPacketSize data in any transaction
  • the host sends maxPacketSize data, and the total size matches the rx buffer size.

libusb on Linux supports a Zero Length Packet (ZLP) flag, which will automatically send a zero length packet if a transfer ends on a wMaxPacketSize boundary. Other host OS's don't seem to support this, so the host side will need to manually pad the message to trigger the USB_DEVICE_EVENT_ENDPOINT_READ_COMPLETE event.