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