51#if (CFG_TUD_ENABLED && CFG_TUD_NCM)
64#ifndef CFG_TUD_NCM_LOG_LEVEL
65 #define CFG_TUD_NCM_LOG_LEVEL CFG_TUD_LOG_LEVEL
68#define TU_LOG_DRV(...) TU_LOG(CFG_TUD_NCM_LOG_LEVEL, __VA_ARGS__)
71#define TUD_NCM_ALIGNMENT 4
73#define XMIT_ALIGN_OFFSET(x) ((TUD_NCM_ALIGNMENT - ((x) & (TUD_NCM_ALIGNMENT - 1))) & (TUD_NCM_ALIGNMENT - 1))
79#define XMIT_NTB_N CFG_TUD_NCM_IN_NTB_N
80#define RECV_NTB_N CFG_TUD_NCM_OUT_NTB_N
113 } notification_xmit_state;
131 .bmNtbFormatsSupported = 0x01,
132 .dwNtbInMaxSize = CFG_TUD_NCM_IN_NTB_MAX_SIZE,
134 .wNdbInPayloadRemainder = 0,
135 .wNdbInAlignment = TUD_NCM_ALIGNMENT,
137 .dwNtbOutMaxSize = CFG_TUD_NCM_OUT_NTB_MAX_SIZE,
139 .wNdbOutPayloadRemainder = 0,
140 .wNdbOutAlignment = TUD_NCM_ALIGNMENT,
141 .wNtbOutMaxDatagrams = CFG_TUD_NCM_OUT_MAX_DATAGRAMS_PER_NTB,
180 .downlink = TUD_OPT_HIGH_SPEED ? 480000000 : 12000000,
181 .uplink = TUD_OPT_HIGH_SPEED ? 480000000 : 12000000,
196 TU_LOG_DRV(
" NOTIFICATION_SPEED\n");
202 TU_LOG_DRV(
" NOTIFICATION_CONNECTED\n");
208 TU_LOG_DRV(
" NOTIFICATION_FINISHED\n");
223 if (free_ntb == NULL) {
227 for (
int i = 0; i < XMIT_NTB_N; ++i) {
233 TU_LOG_DRV(
"(EE) xmit_put_ntb_into_free_list - no entry in free list\n");
240 TU_LOG_DRV(
"xmit_get_free_ntb()\n");
242 for (
int i = 0; i < XMIT_NTB_N; ++i) {
256 TU_LOG_DRV(
"xmit_put_ntb_into_ready_list(%p) %d\n", ready_ntb, ready_ntb->
nth.
wBlockLength);
258 for (
int i = 0; i < XMIT_NTB_N; ++i) {
264 TU_LOG_DRV(
"(EE) xmit_put_ntb_into_ready_list: ready list full\n");
278 TU_LOG_DRV(
"recv_get_next_ready_ntb: %p\n", r);
294 TU_LOG_DRV(
"xmit_insert_required_zlp(%d,%ld)\n", rhport, xferred_bytes);
296 if (xferred_bytes == 0 || xferred_bytes % CFG_TUD_NET_ENDPOINT_SIZE != 0) {
303 TU_LOG_DRV(
"xmit_insert_required_zlp! (%u)\n", (
unsigned) xferred_bytes);
315 TU_LOG_DRV(
"xmit_start_if_possible()\n");
318 TU_LOG_DRV(
" !xmit_start_if_possible 1\n");
322 TU_LOG_DRV(
"(EE) !xmit_start_if_possible 2\n");
326 TU_LOG_DRV(
" !xmit_start_if_possible 3\n");
340 #if CFG_TUD_NCM_LOG_LEVEL >= 3
386 TU_LOG_DRV(
" xmit_setup_next_glue_ntb - nothing free\n");
420 TU_LOG_DRV(
"recv_get_free_ntb()\n");
422 for (
int i = 0; i < RECV_NTB_N; ++i) {
443 TU_LOG_DRV(
"recv_get_next_ready_ntb: %p\n", r);
451 TU_LOG_DRV(
"recv_put_ntb_into_free_list(%p)\n", free_ntb);
453 for (
int i = 0; i < RECV_NTB_N; ++i) {
459 TU_LOG_DRV(
"(EE) recv_put_ntb_into_free_list - no entry in free list\n");
467 TU_LOG_DRV(
"recv_put_ntb_into_ready_list(%p) %d\n", ready_ntb, ready_ntb->
nth.
wBlockLength);
469 for (
int i = 0; i < RECV_NTB_N; ++i) {
475 TU_LOG_DRV(
"(EE) recv_put_ntb_into_ready_list: ready list full\n");
482 TU_LOG_DRV(
"recv_try_to_start_new_reception(%d)\n", rhport);
500 TU_LOG_DRV(
" start reception\n");
518 TU_LOG_DRV(
"recv_validate_datagram(%p, %d)\n", ntb, (
int) len);
522 TU_LOG_DRV(
"(EE) ill nth16 length: %d\n", nth16->
wHeaderLength);
526 TU_LOG_DRV(
"(EE) ill signature: 0x%08x\n", (
unsigned) nth16->
dwSignature);
530 TU_LOG_DRV(
"(EE) ill min len: %lu\n", len);
534 TU_LOG_DRV(
"(EE) ill block length: %d > %lu\n", nth16->
wBlockLength, len);
537 if (nth16->
wBlockLength > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {
538 TU_LOG_DRV(
"(EE) ill block length2: %d > %d\n", nth16->
wBlockLength, CFG_TUD_NCM_OUT_NTB_MAX_SIZE);
542 TU_LOG_DRV(
"(EE) ill position of first ndp: %d (%lu)\n", nth16->
wNdpIndex, len);
550 TU_LOG_DRV(
"(EE) ill ndp16 length: %d\n", ndp16->
wLength);
554 TU_LOG_DRV(
"(EE) ill signature: 0x%08x\n", (
unsigned) ndp16->
dwSignature);
558 TU_LOG_DRV(
"(EE) cannot handle wNextNdpIndex!=0 (%d)\n", ndp16->
wNextNdpIndex);
569 if (ndp16_datagram[max_ndx - 1].wDatagramIndex != 0 || ndp16_datagram[max_ndx - 1].wDatagramLength != 0) {
570 TU_LOG_DRV(
" max_ndx != 0\n");
573 while (ndp16_datagram[ndx].wDatagramIndex != 0 && ndp16_datagram[ndx].wDatagramLength != 0) {
574 TU_LOG_DRV(
" << %d %d\n", ndp16_datagram[ndx].wDatagramIndex, ndp16_datagram[ndx].wDatagramLength);
575 if (ndp16_datagram[ndx].wDatagramIndex > len) {
576 TU_LOG_DRV(
"(EE) ill start of datagram[%d]: %d (%lu)\n", ndx, ndp16_datagram[ndx].wDatagramIndex, len);
579 if (ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength > len) {
580 TU_LOG_DRV(
"(EE) ill end of datagram[%d]: %d (%lu)\n", ndx, ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength, len);
586 #if CFG_TUD_NCM_LOG_LEVEL >= 3
587 TU_LOG_BUF(3, ntb->
data[i], len);
599 TU_LOG_DRV(
"recv_transfer_datagram_to_glue_logic()\n");
611 TU_LOG_DRV(
"(EE) SOMETHING WENT WRONG 1\n");
613 TU_LOG_DRV(
"(EE) SOMETHING WENT WRONG 2\n");
625 if (datagramIndex != 0 && datagramLength != 0) {
649 TU_LOG_DRV(
"tud_network_can_xmit(%d)\n", size);
658 TU_LOG_DRV(
"(II) tud_network_can_xmit: request blocked\n");
667 TU_LOG_DRV(
"tud_network_xmit(%p, %d)\n", ref, arg);
670 TU_LOG_DRV(
"(EE) tud_network_xmit: no buffer\n");
687 TU_LOG_DRV(
"(EE) tud_network_xmit: buffer overflow\n");
700 TU_LOG_DRV(
"tud_network_recv_renew()\n");
705 TU_LOG_DRV(
"Re-entrant into tud_network_recv_renew, will process later\n");
726 TU_LOG_DRV(
"tud_network_recv_renew_r(%d)\n", rhport);
741 TU_LOG_DRV(
"netd_init()\n");
745 for (
int i = 0; i < XMIT_NTB_N; ++i) {
748 for (
int i = 0; i < RECV_NTB_N; ++i) {
834 TU_LOG_DRV(
"(EE) VALIDATION FAILED. WHAT CAN WE DO IN THIS CASE?\n");
@ CDC_NOTIF_CONNECTION_SPEED_CHANGE
This notification allows the device to inform the host-networking driver that a change in either the ...
@ CDC_NOTIF_NETWORK_CONNECTION
This notification allows the device to notify the host about network connection status.
struct TU_ATTR_PACKED ndp16_datagram_t
struct TU_ATTR_PACKED ntb_parameters_t
static recv_ntb_t * recv_get_next_ready_ntb(void)
CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN tu_static const ntb_parameters_t ntb_parameters
CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN tu_static ncm_interface_t ncm_interface
static void recv_try_to_start_new_reception(uint8_t rhport)
static bool xmit_requested_datagram_fits_into_current_ntb(uint16_t datagram_size)
void netd_reset(uint8_t rhport)
static void recv_put_ntb_into_ready_list(recv_ntb_t *ready_ntb)
static bool xmit_insert_required_zlp(uint8_t rhport, uint32_t xferred_bytes)
uint16_t netd_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool netd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
static bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len)
void tud_network_xmit(void *ref, uint16_t arg)
static void xmit_put_ntb_into_ready_list(xmit_ntb_t *ready_ntb)
tu_static struct ncm_notify_t ncm_notify_connected
static xmit_ntb_t * xmit_get_next_ready_ntb(void)
static void recv_transfer_datagram_to_glue_logic(void)
void tud_network_recv_renew(void)
bool netd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request)
void tud_network_recv_renew_r(uint8_t rhport)
static xmit_ntb_t * xmit_get_free_ntb(void)
static recv_ntb_t * recv_get_free_ntb(void)
static bool xmit_setup_next_glue_ntb(void)
static void xmit_start_if_possible(uint8_t rhport)
static void xmit_put_ntb_into_free_list(xmit_ntb_t *free_ntb)
static void recv_put_ntb_into_free_list(recv_ntb_t *free_ntb)
tu_static struct ncm_notify_t ncm_notify_speed_change
static void notification_xmit(uint8_t rhport, bool force_next)
bool tud_network_can_xmit(uint16_t size)
bool tud_network_recv_cb(const uint8_t *src, uint16_t size)
uint16_t tud_network_xmit_cb(uint8_t *dst, void *ref, uint16_t arg)
AUDIO Channel Cluster Descriptor (4.1)
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t data[CFG_TUD_NCM_IN_NTB_MAX_SIZE]
uint8_t bInterfaceClass
Class code (assigned by the USB-IF).
ndp16_datagram_t ndp_datagram[CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB+1]
uint8_t bRequest
Request type audio_cs_req_t.
uint8_t bInterfaceNumber
Number of this interface. Zero-based value identifying the index in the array of concurrent interface...
xmit_ntb_t * xmit_ready_ntb[XMIT_NTB_N]
recv_ntb_t * recv_free_ntb[RECV_NTB_N]
bool tud_network_recv_renew_active
CFG_TUSB_MEM_ALIGN recv_ntb_t recv_ntb[RECV_NTB_N]
uint16_t xmit_glue_ntb_datagram_ndx
bool notification_xmit_is_running
uint16_t recv_glue_ntb_datagram_ndx
recv_ntb_t * recv_tinyusb_ntb
xmit_ntb_t * xmit_free_ntb[XMIT_NTB_N]
recv_ntb_t * recv_ready_ntb[RECV_NTB_N]
xmit_ntb_t * xmit_tinyusb_ntb
bool tud_network_recv_renew_process_again
CFG_TUSB_MEM_ALIGN xmit_ntb_t xmit_ntb[XMIT_NTB_N]
recv_ntb_t * recv_glue_ntb
enum ncm_interface_t::@54 notification_xmit_state
xmit_ntb_t * xmit_glue_ntb
tusb_control_request_t header
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_len(void const *desc)
@ TUSB_REQ_RCPT_INTERFACE
struct TU_ATTR_PACKED tusb_desc_endpoint_t
USB Endpoint Descriptor.
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_type(void const *desc)
struct TU_ATTR_PACKED tusb_desc_interface_t
USB Interface Descriptor.
static TU_ATTR_ALWAYS_INLINE uint8_t const * tu_desc_next(void const *desc)
bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
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 usbd_open_edpt_pair(uint8_t rhport, uint8_t const *p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t *ep_out, uint8_t *ep_in)
bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const *request, void *buffer, uint16_t len)
bool tud_control_status(uint8_t rhport, tusb_control_request_t const *request)
CFG_TUH_MEM_ALIGN tusb_control_request_t request