*** MTP *** Role: device only. Media Transfer Protocol (MTP) presents objects and object metadata rather than a host-mounted block device. It is a better fit than MSC when device firmware and the host must access managed files concurrently. Configuration ============= Set ``CFG_TUD_MTP`` to 1 and add ``TUD_MTP_DESCRIPTOR``. Configure the endpoint and control buffers, then advertise only operations, events, properties, and formats that the application actually implements: .. code-block:: c #define CFG_TUD_MTP 1 #define CFG_TUD_MTP_EP_BUFSIZE 512 #define CFG_TUD_MTP_EP_CONTROL_BUFSIZE 16 #define CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS \ MTP_OP_GET_DEVICE_INFO, MTP_OP_OPEN_SESSION, MTP_OP_CLOSE_SESSION .. list-table:: :header-rows: 1 :widths: 45 15 40 * - Option - Default - What it controls * - ``CFG_TUD_MTP_EP_BUFSIZE`` - Required - Shared bulk data buffer and maximum data chunk. Larger values improve throughput but consume static RAM. * - ``CFG_TUD_MTP_EP_CONTROL_BUFSIZE`` - Required - Staging buffer for MTP class control requests and responses. * - ``CFG_TUD_MTP_DEVICEINFO_EXTENSIONS`` - Required - MTP extension string returned by GetDeviceInfo; use an empty string when no extension is implemented. * - ``CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS`` - Required - Operation codes the host is told it may issue. * - ``CFG_TUD_MTP_DEVICEINFO_SUPPORTED_EVENTS`` - Required - Event codes the device may send on the interrupt endpoint. * - ``CFG_TUD_MTP_DEVICEINFO_SUPPORTED_DEVICE_PROPERTIES`` - Required - Device property codes supported by the application. * - ``CFG_TUD_MTP_DEVICEINFO_CAPTURE_FORMATS`` / ``CFG_TUD_MTP_DEVICEINFO_PLAYBACK_FORMATS`` - Required - Object formats the device can create or expose for playback. The other ``CFG_TUD_MTP_DEVICEINFO_*`` lists describe supported events, device properties, capture formats, and playback formats. These lists form the GetDeviceInfo response and are a contract with the host. Application flow ================ .. list-table:: :header-rows: 1 :widths: 42 58 * - API or callback - What it does * - ``tud_mtp_mounted()`` - Tests whether all three MTP endpoints are open. * - ``tud_mtp_command_received_cb()`` - Delivers the operation container and starts the application transaction state machine. A negative return stalls the bulk endpoints. * - ``tud_mtp_data_send()`` / ``tud_mtp_data_receive()`` - Starts or continues the operation's data phase. ``false`` means the transfer could not be queued in the current phase. * - ``tud_mtp_response_send()`` - Queues the final response container with the current transaction ID. * - ``tud_mtp_event_send()`` - Copies and queues one asynchronous event. Retry later when it returns ``false`` because the event endpoint is busy. * - ``tud_mtp_data_xfer_cb()`` - Supplies or consumes the next chunk of a multi-packet data phase. * - ``tud_mtp_data_complete_cb()`` / ``tud_mtp_response_complete_cb()`` - Advances application state after the entire data or response phase. * - ``tud_mtp_request_*_cb()`` - Handles cancel, reset, status, extended-event, and vendor control requests. Return ``false`` or a negative length where documented to stall an unsupported request. ``tud_mtp_command_received_cb()`` receives an operation container. The application performs any data phase with ``tud_mtp_data_send()`` or ``tud_mtp_data_receive()``, then completes the transaction with ``tud_mtp_response_send()``. Use ``tud_mtp_event_send()`` for asynchronous events such as ObjectAdded. The ``tud_mtp_data_xfer_cb()``, ``tud_mtp_data_complete_cb()``, and ``tud_mtp_response_complete_cb()`` callbacks advance multi-stage transfers. Control callbacks handle cancel, reset, status, and vendor requests. Validate container lengths, object handles, property codes, and storage bounds before using them. The :doc:`../../examples/device/mtp` example is the recommended template. It implements a small in-memory object store, core session/object operations, an upload, and an event. Replace its storage functions while preserving the command/data/response state machine. TinyUSB supplies the USB transport and MTP containers; it does not provide a filesystem, object database, stable handle allocation, or access arbitration. Those remain application responsibilities.