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