| *************** |
| Vendor-specific |
| *************** |
| |
| The device driver provides bulk, and optionally interrupt or isochronous, |
| transfers for a vendor-defined interface. There is no generic vendor protocol: |
| the device descriptors, request semantics, framing, and host software are part |
| of the product's protocol. |
| |
| Device |
| ====== |
| |
| Enable ``CFG_TUD_VENDOR`` and add ``TUD_VENDOR_DESCRIPTOR`` for the usual pair |
| of bulk endpoints. Buffered mode is the practical default. |
| |
| .. list-table:: |
| :header-rows: 1 |
| :widths: 43 17 40 |
| |
| * - Option |
| - Default |
| - What it controls |
| * - ``CFG_TUD_VENDOR_RX_BUFSIZE`` / |
| ``CFG_TUD_VENDOR_TX_BUFSIZE`` |
| - Device bulk maximum |
| - Software FIFO bytes. Setting either to zero selects direct mode for |
| both directions. |
| * - ``CFG_TUD_VENDOR_RX_EPSIZE`` / |
| ``CFG_TUD_VENDOR_TX_EPSIZE`` |
| - Device bulk maximum |
| - Bulk endpoint transfer buffers and descriptor packet sizes. |
| * - ``CFG_TUD_VENDOR_RX_MANUAL_XFER`` |
| - ``0`` |
| - Requires the application to call ``tud_vendor_n_read_xfer()`` to arm |
| each buffered bulk OUT transfer. |
| * - ``CFG_TUD_VENDOR_RX_NEED_ZLP`` |
| - ``0`` |
| - Allows multi-packet receive termination by a zero-length packet; enable |
| only when the custom host protocol sends that terminator. |
| * - ``CFG_TUD_VENDOR_EP_INT_OUT`` / |
| ``CFG_TUD_VENDOR_EP_INT_IN`` |
| - ``0`` |
| - Enables optional direct interrupt endpoints. Their buffer-size options |
| default to 64 bytes. |
| * - ``CFG_TUD_VENDOR_EP_ISO_OUT`` / |
| ``CFG_TUD_VENDOR_EP_ISO_IN`` |
| - ``0`` |
| - Enables optional direct isochronous endpoints. They require alternate |
| settings; their buffers default to 64 bytes. |
| * - ``CFG_TUD_VENDOR_ALT_SETTINGS`` |
| - ``0`` |
| - Enables alternate-setting tracking. It requires direct mode and is |
| required by the optional isochronous endpoints. |
| |
| Use ``tud_vendor_available()``/``tud_vendor_read()`` for OUT data and |
| ``tud_vendor_write()``/``tud_vendor_write_flush()`` for IN data. In buffered |
| mode, ``tud_vendor_rx_cb()`` is only a notification; read the FIFO rather than |
| using its null buffer argument. |
| |
| For direct transfers, configure zero RX/TX FIFO sizes and follow the ownership |
| rules in ``vendor_device.h``. Optional interrupt, isochronous, and alternate |
| setting support is controlled by ``CFG_TUD_VENDOR_EP_*`` and |
| ``CFG_TUD_VENDOR_ALT_SETTINGS``. Interrupt and isochronous OUT endpoints must |
| be explicitly re-armed after their receive callbacks. |
| |
| .. list-table:: |
| :header-rows: 1 |
| :widths: 43 57 |
| |
| * - API or callback |
| - What it does |
| * - ``tud_vendor_n_mounted()`` |
| - Tests whether an instance has any configured bulk, interrupt, or |
| isochronous endpoint open. |
| * - ``tud_vendor_n_available()`` / ``tud_vendor_n_read()`` |
| - Reports and removes bulk OUT FIFO bytes in buffered mode. |
| * - ``tud_vendor_n_write_available()`` / |
| ``tud_vendor_n_write()`` |
| - Reports room and copies as many bulk IN bytes as fit. In direct mode the |
| copy is limited to one endpoint buffer. |
| * - ``tud_vendor_n_write_flush()`` |
| - Starts a short buffered IN transfer and returns the number of bytes |
| submitted. |
| * - ``tud_vendor_rx_cb()`` / ``tud_vendor_tx_cb()`` |
| - Announces received data or completed output. In direct mode, consume or |
| copy the receive pointer before returning from the callback. |
| * - ``tud_vendor_n_int_read_xfer()`` / |
| ``tud_vendor_n_iso_read_xfer()`` |
| - Arms one optional OUT transfer; re-arm after each receive callback. |
| * - ``tud_vendor_n_int_write()`` / |
| ``tud_vendor_n_iso_write()`` |
| - Copies and queues at most one optional endpoint buffer and returns the |
| accepted byte count. |
| * - ``tud_vendor_n_alt()`` |
| - Returns the host-selected alternate setting when support is enabled. |
| |
| Handle vendor control requests in ``tud_vendor_control_xfer_cb()`` and perform |
| the data/status stage with ``tud_control_xfer()`` or |
| ``tud_control_status()``. Validate ``bmRequestType``, ``bRequest``, |
| ``wIndex``, ``wValue``, and ``wLength`` before accepting a request. |
| |
| The :doc:`../../examples/device/webusb_serial` example combines a vendor bulk |
| interface with WebUSB and Microsoft OS 2.0 descriptors. |
| |
| Host |
| ==== |
| |
| A host cannot interpret an arbitrary vendor interface from its class code. |
| TinyUSB does not currently offer a supported, protocol-neutral |
| ``tuh_vendor_*`` application API. For a simple fixed device, enable |
| ``CFG_TUH_API_EDPT_XFER`` and use the descriptor/endpoint APIs demonstrated by |
| :doc:`../../examples/host/bare_api`. For a reusable protocol, implement a |
| custom host class driver that matches devices by descriptors and VID/PID and |
| owns their enumeration and transfer state. |
| |
| Define framing, version negotiation, maximum message lengths, timeouts, and |
| error recovery before deploying a vendor protocol. Never cast unvalidated |
| wire data directly to an application structure. |