xref: /openbmc/linux/Documentation/networking/can_ucan_protocol.rst (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
19f2d3eaeSJakob Unterwurzacher=================
29f2d3eaeSJakob UnterwurzacherThe UCAN Protocol
39f2d3eaeSJakob Unterwurzacher=================
49f2d3eaeSJakob Unterwurzacher
59f2d3eaeSJakob UnterwurzacherUCAN is the protocol used by the microcontroller-based USB-CAN
69f2d3eaeSJakob Unterwurzacheradapter that is integrated on System-on-Modules from Theobroma Systems
79f2d3eaeSJakob Unterwurzacherand that is also available as a standalone USB stick.
89f2d3eaeSJakob Unterwurzacher
99f2d3eaeSJakob UnterwurzacherThe UCAN protocol has been designed to be hardware-independent.
109f2d3eaeSJakob UnterwurzacherIt is modeled closely after how Linux represents CAN devices
119f2d3eaeSJakob Unterwurzacherinternally. All multi-byte integers are encoded as Little Endian.
129f2d3eaeSJakob Unterwurzacher
139f2d3eaeSJakob UnterwurzacherAll structures mentioned in this document are defined in
149f2d3eaeSJakob Unterwurzacher``drivers/net/can/usb/ucan.c``.
159f2d3eaeSJakob Unterwurzacher
169f2d3eaeSJakob UnterwurzacherUSB Endpoints
179f2d3eaeSJakob Unterwurzacher=============
189f2d3eaeSJakob Unterwurzacher
199f2d3eaeSJakob UnterwurzacherUCAN devices use three USB endpoints:
209f2d3eaeSJakob Unterwurzacher
219f2d3eaeSJakob UnterwurzacherCONTROL endpoint
229f2d3eaeSJakob Unterwurzacher  The driver sends device management commands on this endpoint
239f2d3eaeSJakob Unterwurzacher
249f2d3eaeSJakob UnterwurzacherIN endpoint
259f2d3eaeSJakob Unterwurzacher  The device sends CAN data frames and CAN error frames
269f2d3eaeSJakob Unterwurzacher
279f2d3eaeSJakob UnterwurzacherOUT endpoint
289f2d3eaeSJakob Unterwurzacher  The driver sends CAN data frames on the out endpoint
299f2d3eaeSJakob Unterwurzacher
309f2d3eaeSJakob Unterwurzacher
319f2d3eaeSJakob UnterwurzacherCONTROL Messages
329f2d3eaeSJakob Unterwurzacher================
339f2d3eaeSJakob Unterwurzacher
349f2d3eaeSJakob UnterwurzacherUCAN devices are configured using vendor requests on the control pipe.
359f2d3eaeSJakob Unterwurzacher
369f2d3eaeSJakob UnterwurzacherTo support multiple CAN interfaces in a single USB device all
379f2d3eaeSJakob Unterwurzacherconfiguration commands target the corresponding interface in the USB
389f2d3eaeSJakob Unterwurzacherdescriptor.
399f2d3eaeSJakob Unterwurzacher
409f2d3eaeSJakob UnterwurzacherThe driver uses ``ucan_ctrl_command_in/out`` and
419f2d3eaeSJakob Unterwurzacher``ucan_device_request_in`` to deliver commands to the device.
429f2d3eaeSJakob Unterwurzacher
439f2d3eaeSJakob UnterwurzacherSetup Packet
449f2d3eaeSJakob Unterwurzacher------------
459f2d3eaeSJakob Unterwurzacher
469f2d3eaeSJakob Unterwurzacher=================  =====================================================
479f2d3eaeSJakob Unterwurzacher``bmRequestType``  Direction | Vendor | (Interface or Device)
489f2d3eaeSJakob Unterwurzacher``bRequest``       Command Number
499f2d3eaeSJakob Unterwurzacher``wValue``         Subcommand Number (16 Bit) or 0 if not used
509f2d3eaeSJakob Unterwurzacher``wIndex``         USB Interface Index (0 for device commands)
519f2d3eaeSJakob Unterwurzacher``wLength``        * Host to Device - Number of bytes to transmit
529f2d3eaeSJakob Unterwurzacher                   * Device to Host - Maximum Number of bytes to
53*a266ef69SRandy Dunlap                     receive. If the device send less. Common ZLP
549f2d3eaeSJakob Unterwurzacher                     semantics are used.
559f2d3eaeSJakob Unterwurzacher=================  =====================================================
569f2d3eaeSJakob Unterwurzacher
579f2d3eaeSJakob UnterwurzacherError Handling
589f2d3eaeSJakob Unterwurzacher--------------
599f2d3eaeSJakob Unterwurzacher
609f2d3eaeSJakob UnterwurzacherThe device indicates failed control commands by stalling the
619f2d3eaeSJakob Unterwurzacherpipe.
629f2d3eaeSJakob Unterwurzacher
639f2d3eaeSJakob UnterwurzacherDevice Commands
649f2d3eaeSJakob Unterwurzacher---------------
659f2d3eaeSJakob Unterwurzacher
669f2d3eaeSJakob UnterwurzacherUCAN_DEVICE_GET_FW_STRING
679f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~~~~~~~~
689f2d3eaeSJakob Unterwurzacher
699f2d3eaeSJakob Unterwurzacher*Dev2Host; optional*
709f2d3eaeSJakob Unterwurzacher
719f2d3eaeSJakob UnterwurzacherRequest the device firmware string.
729f2d3eaeSJakob Unterwurzacher
739f2d3eaeSJakob Unterwurzacher
749f2d3eaeSJakob UnterwurzacherInterface Commands
759f2d3eaeSJakob Unterwurzacher------------------
769f2d3eaeSJakob Unterwurzacher
779f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_START
789f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~
799f2d3eaeSJakob Unterwurzacher
809f2d3eaeSJakob Unterwurzacher*Host2Dev; mandatory*
819f2d3eaeSJakob Unterwurzacher
829f2d3eaeSJakob UnterwurzacherBring the CAN interface up.
839f2d3eaeSJakob Unterwurzacher
849f2d3eaeSJakob UnterwurzacherPayload Format
859f2d3eaeSJakob Unterwurzacher  ``ucan_ctl_payload_t.cmd_start``
869f2d3eaeSJakob Unterwurzacher
879f2d3eaeSJakob Unterwurzacher====  ============================
889f2d3eaeSJakob Unterwurzachermode  or mask of ``UCAN_MODE_*``
899f2d3eaeSJakob Unterwurzacher====  ============================
909f2d3eaeSJakob Unterwurzacher
919f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_STOP
929f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~
939f2d3eaeSJakob Unterwurzacher
949f2d3eaeSJakob Unterwurzacher*Host2Dev; mandatory*
959f2d3eaeSJakob Unterwurzacher
969f2d3eaeSJakob UnterwurzacherStop the CAN interface
979f2d3eaeSJakob Unterwurzacher
989f2d3eaeSJakob UnterwurzacherPayload Format
999f2d3eaeSJakob Unterwurzacher  *empty*
1009f2d3eaeSJakob Unterwurzacher
1019f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_RESET
1029f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~
1039f2d3eaeSJakob Unterwurzacher
1049f2d3eaeSJakob Unterwurzacher*Host2Dev; mandatory*
1059f2d3eaeSJakob Unterwurzacher
1069f2d3eaeSJakob UnterwurzacherReset the CAN controller (including error counters)
1079f2d3eaeSJakob Unterwurzacher
1089f2d3eaeSJakob UnterwurzacherPayload Format
1099f2d3eaeSJakob Unterwurzacher  *empty*
1109f2d3eaeSJakob Unterwurzacher
1119f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_GET
1129f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~
1139f2d3eaeSJakob Unterwurzacher
1149f2d3eaeSJakob Unterwurzacher*Host2Dev; mandatory*
1159f2d3eaeSJakob Unterwurzacher
1169f2d3eaeSJakob UnterwurzacherGet Information from the Device
1179f2d3eaeSJakob Unterwurzacher
1189f2d3eaeSJakob UnterwurzacherSubcommands
1199f2d3eaeSJakob Unterwurzacher^^^^^^^^^^^
1209f2d3eaeSJakob Unterwurzacher
1219f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_GET_INFO
1229f2d3eaeSJakob Unterwurzacher  Request the device information structure ``ucan_ctl_payload_t.device_info``.
1239f2d3eaeSJakob Unterwurzacher
1249f2d3eaeSJakob Unterwurzacher  See the ``device_info`` field for details, and
1259f2d3eaeSJakob Unterwurzacher  ``uapi/linux/can/netlink.h`` for an explanation of the
1269f2d3eaeSJakob Unterwurzacher  ``can_bittiming fields``.
1279f2d3eaeSJakob Unterwurzacher
1289f2d3eaeSJakob Unterwurzacher  Payload Format
1299f2d3eaeSJakob Unterwurzacher    ``ucan_ctl_payload_t.device_info``
1309f2d3eaeSJakob Unterwurzacher
1319f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_GET_PROTOCOL_VERSION
1329f2d3eaeSJakob Unterwurzacher
1339f2d3eaeSJakob Unterwurzacher  Request the device protocol version
1349f2d3eaeSJakob Unterwurzacher  ``ucan_ctl_payload_t.protocol_version``. The current protocol version is 3.
1359f2d3eaeSJakob Unterwurzacher
1369f2d3eaeSJakob Unterwurzacher  Payload Format
1379f2d3eaeSJakob Unterwurzacher    ``ucan_ctl_payload_t.protocol_version``
1389f2d3eaeSJakob Unterwurzacher
1399f2d3eaeSJakob Unterwurzacher.. note:: Devices that do not implement this command use the old
1409f2d3eaeSJakob Unterwurzacher          protocol version 1
1419f2d3eaeSJakob Unterwurzacher
1429f2d3eaeSJakob UnterwurzacherUCAN_COMMAND_SET_BITTIMING
1439f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~~~~~~~~~
1449f2d3eaeSJakob Unterwurzacher
1459f2d3eaeSJakob Unterwurzacher*Host2Dev; mandatory*
1469f2d3eaeSJakob Unterwurzacher
1476d0fe3aeSRandy DunlapSetup bittiming by sending the structure
1489f2d3eaeSJakob Unterwurzacher``ucan_ctl_payload_t.cmd_set_bittiming`` (see ``struct bittiming`` for
1499f2d3eaeSJakob Unterwurzacherdetails)
1509f2d3eaeSJakob Unterwurzacher
1519f2d3eaeSJakob UnterwurzacherPayload Format
1529f2d3eaeSJakob Unterwurzacher  ``ucan_ctl_payload_t.cmd_set_bittiming``.
1539f2d3eaeSJakob Unterwurzacher
1549f2d3eaeSJakob UnterwurzacherUCAN_SLEEP/WAKE
1559f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~
1569f2d3eaeSJakob Unterwurzacher
1579f2d3eaeSJakob Unterwurzacher*Host2Dev; optional*
1589f2d3eaeSJakob Unterwurzacher
1599f2d3eaeSJakob UnterwurzacherConfigure sleep and wake modes. Not yet supported by the driver.
1609f2d3eaeSJakob Unterwurzacher
1619f2d3eaeSJakob UnterwurzacherUCAN_FILTER
1629f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~
1639f2d3eaeSJakob Unterwurzacher
1649f2d3eaeSJakob Unterwurzacher*Host2Dev; optional*
1659f2d3eaeSJakob Unterwurzacher
1669f2d3eaeSJakob UnterwurzacherSetup hardware CAN filters. Not yet supported by the driver.
1679f2d3eaeSJakob Unterwurzacher
1689f2d3eaeSJakob UnterwurzacherAllowed interface commands
1699f2d3eaeSJakob Unterwurzacher--------------------------
1709f2d3eaeSJakob Unterwurzacher
1719f2d3eaeSJakob Unterwurzacher==================  ===================  ==================
1729f2d3eaeSJakob UnterwurzacherLegal Device State  Command              New Device State
1739f2d3eaeSJakob Unterwurzacher==================  ===================  ==================
1749f2d3eaeSJakob Unterwurzacherstopped             SET_BITTIMING        stopped
1759f2d3eaeSJakob Unterwurzacherstopped             START                started
1769f2d3eaeSJakob Unterwurzacherstarted             STOP or RESET        stopped
1779f2d3eaeSJakob Unterwurzacherstopped             STOP or RESET        stopped
1789f2d3eaeSJakob Unterwurzacherstarted             RESTART              started
1799f2d3eaeSJakob Unterwurzacherany                 GET                  *no change*
1809f2d3eaeSJakob Unterwurzacher==================  ===================  ==================
1819f2d3eaeSJakob Unterwurzacher
1829f2d3eaeSJakob UnterwurzacherIN Message Format
1839f2d3eaeSJakob Unterwurzacher=================
1849f2d3eaeSJakob Unterwurzacher
1859f2d3eaeSJakob UnterwurzacherA data packet on the USB IN endpoint contains one or more
1869f2d3eaeSJakob Unterwurzacher``ucan_message_in`` values. If multiple messages are batched in a USB
1879f2d3eaeSJakob Unterwurzacherdata packet, the ``len`` field can be used to jump to the next
1889f2d3eaeSJakob Unterwurzacher``ucan_message_in`` value (take care to sanity-check the ``len`` value
1899f2d3eaeSJakob Unterwurzacheragainst the actual data size).
1909f2d3eaeSJakob Unterwurzacher
1919f2d3eaeSJakob Unterwurzacher.. _can_ucan_in_message_len:
1929f2d3eaeSJakob Unterwurzacher
1939f2d3eaeSJakob Unterwurzacher``len`` field
1949f2d3eaeSJakob Unterwurzacher-------------
1959f2d3eaeSJakob Unterwurzacher
1969f2d3eaeSJakob UnterwurzacherEach ``ucan_message_in`` must be aligned to a 4-byte boundary (relative
1979f2d3eaeSJakob Unterwurzacherto the start of the start of the data buffer). That means that there
1989f2d3eaeSJakob Unterwurzachermay be padding bytes between multiple ``ucan_message_in`` values:
1999f2d3eaeSJakob Unterwurzacher
2009f2d3eaeSJakob Unterwurzacher.. code::
2019f2d3eaeSJakob Unterwurzacher
2029f2d3eaeSJakob Unterwurzacher    +----------------------------+ < 0
2039f2d3eaeSJakob Unterwurzacher    |                            |
2049f2d3eaeSJakob Unterwurzacher    |   struct ucan_message_in   |
2059f2d3eaeSJakob Unterwurzacher    |                            |
2069f2d3eaeSJakob Unterwurzacher    +----------------------------+ < len
2079f2d3eaeSJakob Unterwurzacher              [padding]
2089f2d3eaeSJakob Unterwurzacher    +----------------------------+ < round_up(len, 4)
2099f2d3eaeSJakob Unterwurzacher    |                            |
2109f2d3eaeSJakob Unterwurzacher    |   struct ucan_message_in   |
2119f2d3eaeSJakob Unterwurzacher    |                            |
2129f2d3eaeSJakob Unterwurzacher    +----------------------------+
2139f2d3eaeSJakob Unterwurzacher                [...]
2149f2d3eaeSJakob Unterwurzacher
2159f2d3eaeSJakob Unterwurzacher``type`` field
2169f2d3eaeSJakob Unterwurzacher--------------
2179f2d3eaeSJakob Unterwurzacher
2189f2d3eaeSJakob UnterwurzacherThe ``type`` field specifies the type of the message.
2199f2d3eaeSJakob Unterwurzacher
2209f2d3eaeSJakob UnterwurzacherUCAN_IN_RX
2219f2d3eaeSJakob Unterwurzacher~~~~~~~~~~
2229f2d3eaeSJakob Unterwurzacher
2239f2d3eaeSJakob Unterwurzacher``subtype``
2249f2d3eaeSJakob Unterwurzacher  zero
2259f2d3eaeSJakob Unterwurzacher
2269f2d3eaeSJakob UnterwurzacherData received from the CAN bus (ID + payload).
2279f2d3eaeSJakob Unterwurzacher
2289f2d3eaeSJakob UnterwurzacherUCAN_IN_TX_COMPLETE
2299f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~~~~~~~~~
2309f2d3eaeSJakob Unterwurzacher
2319f2d3eaeSJakob Unterwurzacher``subtype``
2329f2d3eaeSJakob Unterwurzacher  zero
2339f2d3eaeSJakob Unterwurzacher
2349f2d3eaeSJakob UnterwurzacherThe CAN device has sent a message to the CAN bus. It answers with a
2356d0fe3aeSRandy Dunlaplist of tuples <echo-ids, flags>.
2369f2d3eaeSJakob Unterwurzacher
2379f2d3eaeSJakob UnterwurzacherThe echo-id identifies the frame from (echos the id from a previous
2389f2d3eaeSJakob UnterwurzacherUCAN_OUT_TX message). The flag indicates the result of the
2399f2d3eaeSJakob Unterwurzachertransmission. Whereas a set Bit 0 indicates success. All other bits
2409f2d3eaeSJakob Unterwurzacherare reserved and set to zero.
2419f2d3eaeSJakob Unterwurzacher
2429f2d3eaeSJakob UnterwurzacherFlow Control
2439f2d3eaeSJakob Unterwurzacher------------
2449f2d3eaeSJakob Unterwurzacher
2459f2d3eaeSJakob UnterwurzacherWhen receiving CAN messages there is no flow control on the USB
2469f2d3eaeSJakob Unterwurzacherbuffer. The driver has to handle inbound message quickly enough to
2479f2d3eaeSJakob Unterwurzacheravoid drops. I case the device buffer overflow the condition is
2489f2d3eaeSJakob Unterwurzacherreported by sending corresponding error frames (see
2499f2d3eaeSJakob Unterwurzacher:ref:`can_ucan_error_handling`)
2509f2d3eaeSJakob Unterwurzacher
2519f2d3eaeSJakob Unterwurzacher
2529f2d3eaeSJakob UnterwurzacherOUT Message Format
2539f2d3eaeSJakob Unterwurzacher==================
2549f2d3eaeSJakob Unterwurzacher
2559f2d3eaeSJakob UnterwurzacherA data packet on the USB OUT endpoint contains one or more ``struct
2569f2d3eaeSJakob Unterwurzacherucan_message_out`` values. If multiple messages are batched into one
2579f2d3eaeSJakob Unterwurzacherdata packet, the device uses the ``len`` field to jump to the next
2589f2d3eaeSJakob Unterwurzacherucan_message_out value. Each ucan_message_out must be aligned to 4
2599f2d3eaeSJakob Unterwurzacherbytes (relative to the start of the data buffer). The mechanism is
2609f2d3eaeSJakob Unterwurzachersame as described in :ref:`can_ucan_in_message_len`.
2619f2d3eaeSJakob Unterwurzacher
2629f2d3eaeSJakob Unterwurzacher.. code::
2639f2d3eaeSJakob Unterwurzacher
2649f2d3eaeSJakob Unterwurzacher    +----------------------------+ < 0
2659f2d3eaeSJakob Unterwurzacher    |                            |
2669f2d3eaeSJakob Unterwurzacher    |   struct ucan_message_out  |
2679f2d3eaeSJakob Unterwurzacher    |                            |
2689f2d3eaeSJakob Unterwurzacher    +----------------------------+ < len
2699f2d3eaeSJakob Unterwurzacher              [padding]
2709f2d3eaeSJakob Unterwurzacher    +----------------------------+ < round_up(len, 4)
2719f2d3eaeSJakob Unterwurzacher    |                            |
2729f2d3eaeSJakob Unterwurzacher    |   struct ucan_message_out  |
2739f2d3eaeSJakob Unterwurzacher    |                            |
2749f2d3eaeSJakob Unterwurzacher    +----------------------------+
2759f2d3eaeSJakob Unterwurzacher                [...]
2769f2d3eaeSJakob Unterwurzacher
2779f2d3eaeSJakob Unterwurzacher``type`` field
2789f2d3eaeSJakob Unterwurzacher--------------
2799f2d3eaeSJakob Unterwurzacher
2809f2d3eaeSJakob UnterwurzacherIn protocol version 3 only ``UCAN_OUT_TX`` is defined, others are used
2819f2d3eaeSJakob Unterwurzacheronly by legacy devices (protocol version 1).
2829f2d3eaeSJakob Unterwurzacher
2839f2d3eaeSJakob UnterwurzacherUCAN_OUT_TX
2849f2d3eaeSJakob Unterwurzacher~~~~~~~~~~~
2859f2d3eaeSJakob Unterwurzacher``subtype``
2869f2d3eaeSJakob Unterwurzacher  echo id to be replied within a CAN_IN_TX_COMPLETE message
2879f2d3eaeSJakob Unterwurzacher
2889f2d3eaeSJakob UnterwurzacherTransmit a CAN frame. (parameters: ``id``, ``data``)
2899f2d3eaeSJakob Unterwurzacher
2909f2d3eaeSJakob UnterwurzacherFlow Control
2919f2d3eaeSJakob Unterwurzacher------------
2929f2d3eaeSJakob Unterwurzacher
2939f2d3eaeSJakob UnterwurzacherWhen the device outbound buffers are full it starts sending *NAKs* on
2949f2d3eaeSJakob Unterwurzacherthe *OUT* pipe until more buffers are available. The driver stops the
2959f2d3eaeSJakob Unterwurzacherqueue when a certain threshold of out packets are incomplete.
2969f2d3eaeSJakob Unterwurzacher
2979f2d3eaeSJakob Unterwurzacher.. _can_ucan_error_handling:
2989f2d3eaeSJakob Unterwurzacher
2999f2d3eaeSJakob UnterwurzacherCAN Error Handling
3009f2d3eaeSJakob Unterwurzacher==================
3019f2d3eaeSJakob Unterwurzacher
3029f2d3eaeSJakob UnterwurzacherIf error reporting is turned on the device encodes errors into CAN
3039f2d3eaeSJakob Unterwurzachererror frames (see ``uapi/linux/can/error.h``) and sends it using the
3049f2d3eaeSJakob UnterwurzacherIN endpoint. The driver updates its error statistics and forwards
3059f2d3eaeSJakob Unterwurzacherit.
3069f2d3eaeSJakob Unterwurzacher
3079f2d3eaeSJakob UnterwurzacherAlthough UCAN devices can suppress error frames completely, in Linux
3089f2d3eaeSJakob Unterwurzacherthe driver is always interested. Hence, the device is always started with
3099f2d3eaeSJakob Unterwurzacherthe ``UCAN_MODE_BERR_REPORT`` set. Filtering those messages for the
3109f2d3eaeSJakob Unterwurzacheruser space is done by the driver.
3119f2d3eaeSJakob Unterwurzacher
3129f2d3eaeSJakob UnterwurzacherBus OFF
3139f2d3eaeSJakob Unterwurzacher-------
3149f2d3eaeSJakob Unterwurzacher
3159f2d3eaeSJakob Unterwurzacher- The device does not recover from bus of automatically.
3169f2d3eaeSJakob Unterwurzacher- Bus OFF is indicated by an error frame (see ``uapi/linux/can/error.h``)
3179f2d3eaeSJakob Unterwurzacher- Bus OFF recovery is started by ``UCAN_COMMAND_RESTART``
3189f2d3eaeSJakob Unterwurzacher- Once Bus OFF recover is completed the device sends an error frame
3199f2d3eaeSJakob Unterwurzacher  indicating that it is on ERROR-ACTIVE state.
3209f2d3eaeSJakob Unterwurzacher- During Bus OFF no frames are sent by the device.
3219f2d3eaeSJakob Unterwurzacher- During Bus OFF transmission requests from the host are completed
3229f2d3eaeSJakob Unterwurzacher  immediately with the success bit left unset.
3239f2d3eaeSJakob Unterwurzacher
3249f2d3eaeSJakob UnterwurzacherExample Conversation
3259f2d3eaeSJakob Unterwurzacher====================
3269f2d3eaeSJakob Unterwurzacher
3279f2d3eaeSJakob Unterwurzacher#) Device is connected to USB
3289f2d3eaeSJakob Unterwurzacher#) Host sends command ``UCAN_COMMAND_RESET``, subcmd 0
3299f2d3eaeSJakob Unterwurzacher#) Host sends command ``UCAN_COMMAND_GET``, subcmd ``UCAN_COMMAND_GET_INFO``
3309f2d3eaeSJakob Unterwurzacher#) Device sends ``UCAN_IN_DEVICE_INFO``
3319f2d3eaeSJakob Unterwurzacher#) Host sends command ``UCAN_OUT_SET_BITTIMING``
3329f2d3eaeSJakob Unterwurzacher#) Host sends command ``UCAN_COMMAND_START``, subcmd 0, mode ``UCAN_MODE_BERR_REPORT``
333