72#if (CFG_TUD_ENABLED && CFG_TUD_USBTMC)
87#define USBTMCD_BUFFER_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)
90#ifndef CFG_TUD_USBTMC_INT_EP_SIZE
91#define CFG_TUD_USBTMC_INT_EP_SIZE 2
116#if (CFG_TUD_USBTMC_ENABLE_488)
136 CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_in_buf[USBTMCD_BUFFER_SIZE];
138 CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_out_buf[USBTMCD_BUFFER_SIZE];
140 CFG_TUSB_MEM_ALIGN uint8_t ep_int_in_buf[CFG_TUD_USBTMC_INT_EP_SIZE];
170#if OSAL_MUTEX_REQUIRED
176#define criticalEnter() do { (void) osal_mutex_lock(usbtmcLock,OSAL_TIMEOUT_WAIT_FOREVER); } while (0)
177#define criticalLeave() do { (void) osal_mutex_unlock(usbtmcLock); } while (0)
184 if (oldState == expectedState)
204 const void *
data,
size_t len,
233 const size_t headerLen =
sizeof(*hdr);
234 const size_t dataLen = ((headerLen + hdr->
TransferSize) <= txBufLen) ?
235 len : (txBufLen - headerLen);
236 const size_t packetLen = headerLen + dataLen;
245 TU_VERIFY(stateChanged);
267# if CFG_TUD_USBTMC_ENABLE_488
284 #if OSAL_MUTEX_REQUIRED
295 uint8_t
const * p_desc;
296 uint8_t found_endpoints = 0;
310 p_desc = (uint8_t
const *) itf_desc;
315 while (found_endpoints < itf_desc->bNumEndpoints && drv_len <= max_len)
364#if (CFG_TUD_USBTMC_ENABLE_488)
469 TU_VERIFY(stateChanged);
522#if (CFG_TUD_USBTMC_ENABLE_488)
626#if (CFG_TUD_USBTMC_ENABLE_488)
860#if (CFG_TUD_USBTMC_ENABLE_488)
872 TU_VERIFY(bTag >= 0x02 && bTag <= 127);
875 rsp.
bTag = (uint8_t)bTag;
890 .bTag = bTag & 0x7Fu,
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_delete(osal_mutex_t mutex_hdl)
SemaphoreHandle_t osal_mutex_t
static TU_ATTR_ALWAYS_INLINE osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef)
static void * memcpy(void *dst, const void *src, size_t n)
uint8_t UsingTermChar
Support TermChar && Request.TermCharEnabled && last char in transfer is TermChar.
unsigned int supportsIndicatorPulse
unsigned int BulkInFifoBytes
Has queued data or a short packet that is queued.
unsigned int TermCharEnabled
"The Bulk-IN transfer must terminate on the specified TermChar."; CAPABILITIES must list TermChar
unsigned int canEndBulkInOnTermChar
unsigned int EOM
EOM set on last byte.
AUDIO Channel Cluster Descriptor (4.1)
uint8_t USBTMC_status
usbtmc_status_enum
uint8_t MsgID
Message type ID (usbtmc_msgid_enum)
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmDevCapabilities
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmDevCapabilities488
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmIntfcCapabilities488
uint32_t TransferSize
Transfer size; LSB first.
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmIntfcCapabilities
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmClear
uint8_t iInterface
Index of string descriptor describing this interface.
uint8_t bInterfaceClass
Class code (assigned by the USB-IF).
usbtmc_msg_header_t header
Header.
uint8_t bTagInverse
Complement of the tag.
uint8_t bTag
Transfer ID 1<=bTag<=255.
struct TU_ATTR_PACKED::TU_ATTR_PACKED bmTransferAttributes
uint8_t bInterfaceSubClass
Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bInterfaceCla...
uint8_t bRequest
Request type audio_cs_req_t.
uint8_t bNumEndpoints
Number of endpoints used by this interface (excluding endpoint zero). If this value is zero,...
uint8_t bInterfaceNumber
Number of this interface. Zero-based value identifying the index in the array of concurrent interface...
uint32_t ep_bulk_in_wMaxPacketSize
CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_in_buf[USBTMCD_BUFFER_SIZE]
uint32_t ep_bulk_out_wMaxPacketSize
CFG_TUSB_MEM_ALIGN uint8_t ep_int_in_buf[CFG_TUD_USBTMC_INT_EP_SIZE]
usbtmc_capabilities_specific_t const * capabilities
uint32_t transfer_size_remaining
uint8_t const * devInBuffer
uint32_t transfer_size_sent
CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_out_buf[USBTMCD_BUFFER_SIZE]
volatile usbtmcd_state_enum state
static TU_ATTR_ALWAYS_INLINE uint32_t tu_min32(uint32_t x, uint32_t y)
static TU_ATTR_ALWAYS_INLINE int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_len(void const *desc)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t const * tu_desc_next(void const *desc)
@ TUSB_REQ_FEATURE_EDPT_HALT
void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
void usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep)
bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr)
bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const *request, void *buffer, uint16_t len)
CFG_TUH_MEM_ALIGN tusb_control_request_t request
@ USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS
@ USB488_STATUS_INTERRUPT_IN_BUSY
@ USBTMC_MSGID_VENDOR_SPECIFIC_MSG_OUT
@ USBTMC_MSGID_USB488_TRIGGER
@ USBTMC_MSGID_DEV_DEP_MSG_OUT
@ USBTMC_MSGID_DEV_DEP_MSG_IN
@ USBTMC_MSGID_VENDOR_SPECIFIC_IN
@ USBTMC_bREQUEST_INDICATOR_PULSE
@ USB488_bREQUEST_GO_TO_LOCAL
@ USBTMC_bREQUEST_GET_CAPABILITIES
@ USBTMC_bREQUEST_CHECK_CLEAR_STATUS
@ USB488_bREQUEST_REN_CONTROL
@ USBTMC_bREQUEST_INITIATE_ABORT_BULK_OUT
@ USB488_bREQUEST_LOCAL_LOCKOUT
@ USBTMC_bREQUEST_INITIATE_CLEAR
@ USBTMC_bREQUEST_CHECK_ABORT_BULK_OUT_STATUS
@ USBTMC_bREQUEST_INITIATE_ABORT_BULK_IN
@ USB488_bREQUEST_READ_STATUS_BYTE
@ USBTMC_bREQUEST_CHECK_ABORT_BULK_IN_STATUS
static bool handle_devMsgIn(void *data, size_t len)
static OSAL_MUTEX_DEF(usbtmcLockBuffer)
static bool handle_devMsgOut(uint8_t rhport, void *data, size_t len, size_t packetLen)
@ STATE_ABORTING_BULK_OUT
@ STATE_ABORTING_BULK_IN_SHORTED
@ STATE_ABORTING_BULK_IN_ABORTED
bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
tu_static uint8_t termCharRequested
TU_VERIFY_STATIC(USBTMCD_BUFFER_SIZE >=32u,"USBTMC dev buffer size too small")
bool atomicChangeState(usbtmcd_state_enum expectedState, usbtmcd_state_enum newState)
tu_static char logMsg[150]
bool tud_usbtmc_transmit_dev_msg_data(const void *data, size_t len, bool endOfMessage, bool usingTermChar)
static bool handle_devMsgOutStart(uint8_t rhport, void *data, size_t len)
void usbtmcd_init_cb(void)
uint16_t usbtmcd_open_cb(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool usbtmcd_deinit(void)
void usbtmcd_reset_cb(uint8_t rhport)
tu_static uint8_t termChar
bool usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request)
bool tud_usbtmc_transmit_notification_data(const void *data, size_t len)
bool tud_usbtmc_start_bus_read(void)
usbtmc_response_capabilities_488_t usbtmc_capabilities_specific_t
CFG_TUD_MEM_SECTION tu_static usbtmc_interface_state_t usbtmc_state
bool tud_usbtmc_initiate_abort_bulk_in_cb(uint8_t *tmcResult)
TU_ATTR_WEAK bool tud_usbtmc_indicator_pulse_cb(tusb_control_request_t const *msg, uint8_t *tmcResult)
TU_ATTR_WEAK bool tud_usbtmc_notification_complete_cb(void)
void tud_usbtmc_open_cb(uint8_t interface_id)
bool tud_usbtmc_msgBulkOut_start_cb(usbtmc_msg_request_dev_dep_out const *msgHeader)
bool tud_usbtmc_msg_data_cb(void *data, size_t len, bool transfer_complete)
bool tud_usbtmc_msgBulkIn_complete_cb(void)
TU_ATTR_WEAK bool tud_usbtmc_msg_trigger_cb(usbtmc_msg_generic_t *msg)
bool tud_usbtmc_initiate_abort_bulk_out_cb(uint8_t *tmcResult)
bool tud_usbtmc_check_abort_bulk_out_cb(usbtmc_check_abort_bulk_rsp_t *rsp)
bool tud_usbtmc_check_abort_bulk_in_cb(usbtmc_check_abort_bulk_rsp_t *rsp)
void tud_usbtmc_bulkIn_clearFeature_cb(void)
bool tud_usbtmc_check_clear_cb(usbtmc_get_clear_status_rsp_t *rsp)
bool tud_usbtmc_initiate_clear_cb(uint8_t *tmcResult)
void tud_usbtmc_bulkOut_clearFeature_cb(void)
uint8_t tud_usbtmc_get_stb_cb(uint8_t *tmcResult)
usbtmc_response_capabilities_488_t const * tud_usbtmc_get_capabilities_cb(void)
bool tud_usbtmc_msgBulkIn_request_cb(usbtmc_msg_request_dev_dep_in const *request)