162306a36Sopenharmony_ci================= 262306a36Sopenharmony_ciThe UCAN Protocol 362306a36Sopenharmony_ci================= 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciUCAN is the protocol used by the microcontroller-based USB-CAN 662306a36Sopenharmony_ciadapter that is integrated on System-on-Modules from Theobroma Systems 762306a36Sopenharmony_ciand that is also available as a standalone USB stick. 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciThe UCAN protocol has been designed to be hardware-independent. 1062306a36Sopenharmony_ciIt is modeled closely after how Linux represents CAN devices 1162306a36Sopenharmony_ciinternally. All multi-byte integers are encoded as Little Endian. 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciAll structures mentioned in this document are defined in 1462306a36Sopenharmony_ci``drivers/net/can/usb/ucan.c``. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciUSB Endpoints 1762306a36Sopenharmony_ci============= 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciUCAN devices use three USB endpoints: 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciCONTROL endpoint 2262306a36Sopenharmony_ci The driver sends device management commands on this endpoint 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciIN endpoint 2562306a36Sopenharmony_ci The device sends CAN data frames and CAN error frames 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciOUT endpoint 2862306a36Sopenharmony_ci The driver sends CAN data frames on the out endpoint 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ciCONTROL Messages 3262306a36Sopenharmony_ci================ 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciUCAN devices are configured using vendor requests on the control pipe. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciTo support multiple CAN interfaces in a single USB device all 3762306a36Sopenharmony_ciconfiguration commands target the corresponding interface in the USB 3862306a36Sopenharmony_cidescriptor. 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciThe driver uses ``ucan_ctrl_command_in/out`` and 4162306a36Sopenharmony_ci``ucan_device_request_in`` to deliver commands to the device. 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciSetup Packet 4462306a36Sopenharmony_ci------------ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci================= ===================================================== 4762306a36Sopenharmony_ci``bmRequestType`` Direction | Vendor | (Interface or Device) 4862306a36Sopenharmony_ci``bRequest`` Command Number 4962306a36Sopenharmony_ci``wValue`` Subcommand Number (16 Bit) or 0 if not used 5062306a36Sopenharmony_ci``wIndex`` USB Interface Index (0 for device commands) 5162306a36Sopenharmony_ci``wLength`` * Host to Device - Number of bytes to transmit 5262306a36Sopenharmony_ci * Device to Host - Maximum Number of bytes to 5362306a36Sopenharmony_ci receive. If the device send less. Common ZLP 5462306a36Sopenharmony_ci semantics are used. 5562306a36Sopenharmony_ci================= ===================================================== 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciError Handling 5862306a36Sopenharmony_ci-------------- 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciThe device indicates failed control commands by stalling the 6162306a36Sopenharmony_cipipe. 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciDevice Commands 6462306a36Sopenharmony_ci--------------- 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciUCAN_DEVICE_GET_FW_STRING 6762306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci*Dev2Host; optional* 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciRequest the device firmware string. 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ciInterface Commands 7562306a36Sopenharmony_ci------------------ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciUCAN_COMMAND_START 7862306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci*Host2Dev; mandatory* 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciBring the CAN interface up. 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciPayload Format 8562306a36Sopenharmony_ci ``ucan_ctl_payload_t.cmd_start`` 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci==== ============================ 8862306a36Sopenharmony_cimode or mask of ``UCAN_MODE_*`` 8962306a36Sopenharmony_ci==== ============================ 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciUCAN_COMMAND_STOP 9262306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci*Host2Dev; mandatory* 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciStop the CAN interface 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ciPayload Format 9962306a36Sopenharmony_ci *empty* 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciUCAN_COMMAND_RESET 10262306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~ 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci*Host2Dev; mandatory* 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciReset the CAN controller (including error counters) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciPayload Format 10962306a36Sopenharmony_ci *empty* 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ciUCAN_COMMAND_GET 11262306a36Sopenharmony_ci~~~~~~~~~~~~~~~~ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci*Host2Dev; mandatory* 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ciGet Information from the Device 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciSubcommands 11962306a36Sopenharmony_ci^^^^^^^^^^^ 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ciUCAN_COMMAND_GET_INFO 12262306a36Sopenharmony_ci Request the device information structure ``ucan_ctl_payload_t.device_info``. 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci See the ``device_info`` field for details, and 12562306a36Sopenharmony_ci ``uapi/linux/can/netlink.h`` for an explanation of the 12662306a36Sopenharmony_ci ``can_bittiming fields``. 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci Payload Format 12962306a36Sopenharmony_ci ``ucan_ctl_payload_t.device_info`` 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ciUCAN_COMMAND_GET_PROTOCOL_VERSION 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci Request the device protocol version 13462306a36Sopenharmony_ci ``ucan_ctl_payload_t.protocol_version``. The current protocol version is 3. 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci Payload Format 13762306a36Sopenharmony_ci ``ucan_ctl_payload_t.protocol_version`` 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci.. note:: Devices that do not implement this command use the old 14062306a36Sopenharmony_ci protocol version 1 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ciUCAN_COMMAND_SET_BITTIMING 14362306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~ 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci*Host2Dev; mandatory* 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ciSetup bittiming by sending the structure 14862306a36Sopenharmony_ci``ucan_ctl_payload_t.cmd_set_bittiming`` (see ``struct bittiming`` for 14962306a36Sopenharmony_cidetails) 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciPayload Format 15262306a36Sopenharmony_ci ``ucan_ctl_payload_t.cmd_set_bittiming``. 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciUCAN_SLEEP/WAKE 15562306a36Sopenharmony_ci~~~~~~~~~~~~~~~ 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci*Host2Dev; optional* 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciConfigure sleep and wake modes. Not yet supported by the driver. 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ciUCAN_FILTER 16262306a36Sopenharmony_ci~~~~~~~~~~~ 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci*Host2Dev; optional* 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciSetup hardware CAN filters. Not yet supported by the driver. 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ciAllowed interface commands 16962306a36Sopenharmony_ci-------------------------- 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci================== =================== ================== 17262306a36Sopenharmony_ciLegal Device State Command New Device State 17362306a36Sopenharmony_ci================== =================== ================== 17462306a36Sopenharmony_cistopped SET_BITTIMING stopped 17562306a36Sopenharmony_cistopped START started 17662306a36Sopenharmony_cistarted STOP or RESET stopped 17762306a36Sopenharmony_cistopped STOP or RESET stopped 17862306a36Sopenharmony_cistarted RESTART started 17962306a36Sopenharmony_ciany GET *no change* 18062306a36Sopenharmony_ci================== =================== ================== 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciIN Message Format 18362306a36Sopenharmony_ci================= 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ciA data packet on the USB IN endpoint contains one or more 18662306a36Sopenharmony_ci``ucan_message_in`` values. If multiple messages are batched in a USB 18762306a36Sopenharmony_cidata packet, the ``len`` field can be used to jump to the next 18862306a36Sopenharmony_ci``ucan_message_in`` value (take care to sanity-check the ``len`` value 18962306a36Sopenharmony_ciagainst the actual data size). 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci.. _can_ucan_in_message_len: 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci``len`` field 19462306a36Sopenharmony_ci------------- 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ciEach ``ucan_message_in`` must be aligned to a 4-byte boundary (relative 19762306a36Sopenharmony_cito the start of the start of the data buffer). That means that there 19862306a36Sopenharmony_cimay be padding bytes between multiple ``ucan_message_in`` values: 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci.. code:: 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci +----------------------------+ < 0 20362306a36Sopenharmony_ci | | 20462306a36Sopenharmony_ci | struct ucan_message_in | 20562306a36Sopenharmony_ci | | 20662306a36Sopenharmony_ci +----------------------------+ < len 20762306a36Sopenharmony_ci [padding] 20862306a36Sopenharmony_ci +----------------------------+ < round_up(len, 4) 20962306a36Sopenharmony_ci | | 21062306a36Sopenharmony_ci | struct ucan_message_in | 21162306a36Sopenharmony_ci | | 21262306a36Sopenharmony_ci +----------------------------+ 21362306a36Sopenharmony_ci [...] 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci``type`` field 21662306a36Sopenharmony_ci-------------- 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ciThe ``type`` field specifies the type of the message. 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ciUCAN_IN_RX 22162306a36Sopenharmony_ci~~~~~~~~~~ 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci``subtype`` 22462306a36Sopenharmony_ci zero 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ciData received from the CAN bus (ID + payload). 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ciUCAN_IN_TX_COMPLETE 22962306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~ 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci``subtype`` 23262306a36Sopenharmony_ci zero 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ciThe CAN device has sent a message to the CAN bus. It answers with a 23562306a36Sopenharmony_cilist of tuples <echo-ids, flags>. 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ciThe echo-id identifies the frame from (echos the id from a previous 23862306a36Sopenharmony_ciUCAN_OUT_TX message). The flag indicates the result of the 23962306a36Sopenharmony_citransmission. Whereas a set Bit 0 indicates success. All other bits 24062306a36Sopenharmony_ciare reserved and set to zero. 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ciFlow Control 24362306a36Sopenharmony_ci------------ 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ciWhen receiving CAN messages there is no flow control on the USB 24662306a36Sopenharmony_cibuffer. The driver has to handle inbound message quickly enough to 24762306a36Sopenharmony_ciavoid drops. I case the device buffer overflow the condition is 24862306a36Sopenharmony_cireported by sending corresponding error frames (see 24962306a36Sopenharmony_ci:ref:`can_ucan_error_handling`) 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ciOUT Message Format 25362306a36Sopenharmony_ci================== 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ciA data packet on the USB OUT endpoint contains one or more ``struct 25662306a36Sopenharmony_ciucan_message_out`` values. If multiple messages are batched into one 25762306a36Sopenharmony_cidata packet, the device uses the ``len`` field to jump to the next 25862306a36Sopenharmony_ciucan_message_out value. Each ucan_message_out must be aligned to 4 25962306a36Sopenharmony_cibytes (relative to the start of the data buffer). The mechanism is 26062306a36Sopenharmony_cisame as described in :ref:`can_ucan_in_message_len`. 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci.. code:: 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci +----------------------------+ < 0 26562306a36Sopenharmony_ci | | 26662306a36Sopenharmony_ci | struct ucan_message_out | 26762306a36Sopenharmony_ci | | 26862306a36Sopenharmony_ci +----------------------------+ < len 26962306a36Sopenharmony_ci [padding] 27062306a36Sopenharmony_ci +----------------------------+ < round_up(len, 4) 27162306a36Sopenharmony_ci | | 27262306a36Sopenharmony_ci | struct ucan_message_out | 27362306a36Sopenharmony_ci | | 27462306a36Sopenharmony_ci +----------------------------+ 27562306a36Sopenharmony_ci [...] 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci``type`` field 27862306a36Sopenharmony_ci-------------- 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ciIn protocol version 3 only ``UCAN_OUT_TX`` is defined, others are used 28162306a36Sopenharmony_cionly by legacy devices (protocol version 1). 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ciUCAN_OUT_TX 28462306a36Sopenharmony_ci~~~~~~~~~~~ 28562306a36Sopenharmony_ci``subtype`` 28662306a36Sopenharmony_ci echo id to be replied within a CAN_IN_TX_COMPLETE message 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ciTransmit a CAN frame. (parameters: ``id``, ``data``) 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ciFlow Control 29162306a36Sopenharmony_ci------------ 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ciWhen the device outbound buffers are full it starts sending *NAKs* on 29462306a36Sopenharmony_cithe *OUT* pipe until more buffers are available. The driver stops the 29562306a36Sopenharmony_ciqueue when a certain threshold of out packets are incomplete. 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci.. _can_ucan_error_handling: 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciCAN Error Handling 30062306a36Sopenharmony_ci================== 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ciIf error reporting is turned on the device encodes errors into CAN 30362306a36Sopenharmony_cierror frames (see ``uapi/linux/can/error.h``) and sends it using the 30462306a36Sopenharmony_ciIN endpoint. The driver updates its error statistics and forwards 30562306a36Sopenharmony_ciit. 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ciAlthough UCAN devices can suppress error frames completely, in Linux 30862306a36Sopenharmony_cithe driver is always interested. Hence, the device is always started with 30962306a36Sopenharmony_cithe ``UCAN_MODE_BERR_REPORT`` set. Filtering those messages for the 31062306a36Sopenharmony_ciuser space is done by the driver. 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ciBus OFF 31362306a36Sopenharmony_ci------- 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci- The device does not recover from bus of automatically. 31662306a36Sopenharmony_ci- Bus OFF is indicated by an error frame (see ``uapi/linux/can/error.h``) 31762306a36Sopenharmony_ci- Bus OFF recovery is started by ``UCAN_COMMAND_RESTART`` 31862306a36Sopenharmony_ci- Once Bus OFF recover is completed the device sends an error frame 31962306a36Sopenharmony_ci indicating that it is on ERROR-ACTIVE state. 32062306a36Sopenharmony_ci- During Bus OFF no frames are sent by the device. 32162306a36Sopenharmony_ci- During Bus OFF transmission requests from the host are completed 32262306a36Sopenharmony_ci immediately with the success bit left unset. 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ciExample Conversation 32562306a36Sopenharmony_ci==================== 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci#) Device is connected to USB 32862306a36Sopenharmony_ci#) Host sends command ``UCAN_COMMAND_RESET``, subcmd 0 32962306a36Sopenharmony_ci#) Host sends command ``UCAN_COMMAND_GET``, subcmd ``UCAN_COMMAND_GET_INFO`` 33062306a36Sopenharmony_ci#) Device sends ``UCAN_IN_DEVICE_INFO`` 33162306a36Sopenharmony_ci#) Host sends command ``UCAN_OUT_SET_BITTIMING`` 33262306a36Sopenharmony_ci#) Host sends command ``UCAN_COMMAND_START``, subcmd 0, mode ``UCAN_MODE_BERR_REPORT`` 333