@@ -131,14 +131,6 @@ typedef struct
131131 uint8_t ep_int_in ;
132132 uint32_t ep_bulk_in_wMaxPacketSize ;
133133 uint32_t ep_bulk_out_wMaxPacketSize ;
134- // IN buffer is only used for first packet, not the remainder
135- // in order to deal with prepending header
136- CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_in_buf [USBTMCD_BUFFER_SIZE ];
137- // OUT buffer receives one packet at a time
138- CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_out_buf [USBTMCD_BUFFER_SIZE ];
139- // Buffer int msg to ensure alignment and placement correctness
140- CFG_TUSB_MEM_ALIGN uint8_t ep_int_in_buf [CFG_TUD_USBTMC_INT_EP_SIZE ];
141-
142134 uint32_t transfer_size_remaining ; // also used for requested length for bulk IN.
143135 uint32_t transfer_size_sent ; // To keep track of data bytes that have been queued in FIFO (not header bytes)
144136
@@ -150,11 +142,23 @@ typedef struct
150142 usbtmc_capabilities_specific_t const * capabilities ;
151143} usbtmc_interface_state_t ;
152144
153- CFG_TUD_MEM_SECTION tu_static usbtmc_interface_state_t usbtmc_state =
154- {
155- .itf_id = 0xFF ,
145+ typedef struct {
146+ // IN buffer is only used for first packet, not the remainder in order to deal with prepending header
147+ TUD_EPBUF_DEF (epin , USBTMCD_BUFFER_SIZE );
148+
149+ // OUT buffer receives one packet at a time
150+ TUD_EPBUF_DEF (epout , USBTMCD_BUFFER_SIZE );
151+
152+ // Buffer int msg
153+ TUD_EPBUF_DEF (epnotif , CFG_TUD_USBTMC_INT_EP_SIZE );
154+ } usbtmc_epbuf_t ;
155+
156+ static usbtmc_interface_state_t usbtmc_state = {
157+ .itf_id = 0xFF ,
156158};
157159
160+ CFG_TUD_MEM_SECTION static usbtmc_epbuf_t usbtmc_epbuf ;
161+
158162// We need all headers to fit in a single packet in this implementation, 32 bytes will fit all standard USBTMC headers
159163TU_VERIFY_STATIC (USBTMCD_BUFFER_SIZE >= 32u ,"USBTMC dev buffer size too small" );
160164
@@ -205,7 +209,7 @@ bool tud_usbtmc_transmit_dev_msg_data(
205209 bool endOfMessage ,
206210 bool usingTermChar )
207211{
208- const unsigned int txBufLen = sizeof ( usbtmc_state . ep_bulk_in_buf ) ;
212+ const unsigned int txBufLen = USBTMCD_BUFFER_SIZE ;
209213
210214#ifndef NDEBUG
211215 TU_ASSERT (len > 0u );
@@ -220,7 +224,7 @@ bool tud_usbtmc_transmit_dev_msg_data(
220224#endif
221225
222226 TU_VERIFY (usbtmc_state .state == STATE_TX_REQUESTED );
223- usbtmc_msg_dev_dep_msg_in_header_t * hdr = (usbtmc_msg_dev_dep_msg_in_header_t * )usbtmc_state . ep_bulk_in_buf ;
227+ usbtmc_msg_dev_dep_msg_in_header_t * hdr = (usbtmc_msg_dev_dep_msg_in_header_t * )usbtmc_epbuf . epin ;
224228 tu_varclr (hdr );
225229 hdr -> header .MsgID = USBTMC_MSGID_DEV_DEP_MSG_IN ;
226230 hdr -> header .bTag = usbtmc_state .lastBulkInTag ;
@@ -235,15 +239,15 @@ bool tud_usbtmc_transmit_dev_msg_data(
235239 len : (txBufLen - headerLen );
236240 const size_t packetLen = headerLen + dataLen ;
237241
238- memcpy ((uint8_t * )(usbtmc_state . ep_bulk_in_buf ) + headerLen , data , dataLen );
242+ memcpy ((uint8_t * )(usbtmc_epbuf . epin ) + headerLen , data , dataLen );
239243 usbtmc_state .transfer_size_remaining = len - dataLen ;
240244 usbtmc_state .transfer_size_sent = dataLen ;
241245 usbtmc_state .devInBuffer = (uint8_t const * ) data + (dataLen );
242246
243247 bool stateChanged =
244248 atomicChangeState (STATE_TX_REQUESTED , (packetLen >= txBufLen ) ? STATE_TX_INITIATED : STATE_TX_SHORTED );
245249 TU_VERIFY (stateChanged );
246- TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_bulk_in , usbtmc_state . ep_bulk_in_buf , (uint16_t )packetLen ));
250+ TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_bulk_in , usbtmc_epbuf . epin , (uint16_t )packetLen ));
247251 return true;
248252}
249253
@@ -255,8 +259,8 @@ bool tud_usbtmc_transmit_notification_data(const void * data, size_t len)
255259#endif
256260 TU_VERIFY (usbd_edpt_busy (usbtmc_state .rhport , usbtmc_state .ep_int_in ));
257261
258- TU_VERIFY (tu_memcpy_s (usbtmc_state . ep_int_in_buf , sizeof ( usbtmc_state . ep_int_in_buf ) , data , len ) == 0 );
259- TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_int_in , usbtmc_state . ep_int_in_buf , (uint16_t )len ));
262+ TU_VERIFY (tu_memcpy_s (usbtmc_epbuf . epnotif , CFG_TUD_USBTMC_INT_EP_SIZE , data , len ) == 0 );
263+ TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_int_in , usbtmc_epbuf . epnotif , (uint16_t )len ));
260264 return true;
261265}
262266
@@ -396,7 +400,7 @@ bool tud_usbtmc_start_bus_read(void)
396400 default :
397401 return false;
398402 }
399- TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_bulk_out , usbtmc_state . ep_bulk_out_buf , (uint16_t )usbtmc_state .ep_bulk_out_wMaxPacketSize ));
403+ TU_VERIFY (usbd_edpt_xfer (usbtmc_state .rhport , usbtmc_state .ep_bulk_out , usbtmc_epbuf . epout , (uint16_t )usbtmc_state .ep_bulk_out_wMaxPacketSize ));
400404 return true;
401405}
402406
@@ -501,7 +505,7 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
501505 case STATE_IDLE :
502506 {
503507 TU_VERIFY (xferred_bytes >= sizeof (usbtmc_msg_generic_t ));
504- msg = (usbtmc_msg_generic_t * )(usbtmc_state . ep_bulk_out_buf );
508+ msg = (usbtmc_msg_generic_t * )(usbtmc_epbuf . epout );
505509 uint8_t invInvTag = (uint8_t )~(msg -> header .bTagInverse );
506510 TU_VERIFY (msg -> header .bTag == invInvTag );
507511 TU_VERIFY (msg -> header .bTag != 0x00 );
@@ -536,7 +540,7 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
536540 return true;
537541 }
538542 case STATE_RCV :
539- if (!handle_devMsgOut (rhport , usbtmc_state . ep_bulk_out_buf , xferred_bytes , xferred_bytes ))
543+ if (!handle_devMsgOut (rhport , usbtmc_epbuf . epout , xferred_bytes , xferred_bytes ))
540544 {
541545 usbd_edpt_stall (rhport , usbtmc_state .ep_bulk_out );
542546 return false;
@@ -565,24 +569,23 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
565569 break ;
566570
567571 case STATE_TX_INITIATED :
568- if (usbtmc_state .transfer_size_remaining >= sizeof ( usbtmc_state . ep_bulk_in_buf ) )
572+ if (usbtmc_state .transfer_size_remaining >= USBTMCD_BUFFER_SIZE )
569573 {
570574 // Copy buffer to ensure alignment correctness
571- memcpy (usbtmc_state .ep_bulk_in_buf , usbtmc_state .devInBuffer , sizeof (usbtmc_state .ep_bulk_in_buf ));
572- TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in ,
573- usbtmc_state .ep_bulk_in_buf , sizeof (usbtmc_state .ep_bulk_in_buf )));
574- usbtmc_state .devInBuffer += sizeof (usbtmc_state .ep_bulk_in_buf );
575- usbtmc_state .transfer_size_remaining -= sizeof (usbtmc_state .ep_bulk_in_buf );
576- usbtmc_state .transfer_size_sent += sizeof (usbtmc_state .ep_bulk_in_buf );
575+ memcpy (usbtmc_epbuf .epin , usbtmc_state .devInBuffer , USBTMCD_BUFFER_SIZE );
576+ TU_VERIFY (usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_epbuf .epin , USBTMCD_BUFFER_SIZE ));
577+ usbtmc_state .devInBuffer += USBTMCD_BUFFER_SIZE ;
578+ usbtmc_state .transfer_size_remaining -= USBTMCD_BUFFER_SIZE ;
579+ usbtmc_state .transfer_size_sent += USBTMCD_BUFFER_SIZE ;
577580 }
578581 else // last packet
579582 {
580583 size_t packetLen = usbtmc_state .transfer_size_remaining ;
581- memcpy (usbtmc_state . ep_bulk_in_buf , usbtmc_state .devInBuffer , usbtmc_state .transfer_size_remaining );
584+ memcpy (usbtmc_epbuf . epin , usbtmc_state .devInBuffer , usbtmc_state .transfer_size_remaining );
582585 usbtmc_state .transfer_size_sent += sizeof (usbtmc_state .transfer_size_remaining );
583586 usbtmc_state .transfer_size_remaining = 0 ;
584587 usbtmc_state .devInBuffer = NULL ;
585- TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_state . ep_bulk_in_buf , (uint16_t )packetLen ) );
588+ TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_epbuf . epin , (uint16_t )packetLen ) );
586589 if (((packetLen % usbtmc_state .ep_bulk_in_wMaxPacketSize ) != 0 ) || (packetLen == 0 ))
587590 {
588591 usbtmc_state .state = STATE_TX_SHORTED ;
@@ -592,7 +595,7 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
592595
593596 case STATE_ABORTING_BULK_IN :
594597 // need to send short packet (ZLP?)
595- TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_state . ep_bulk_in_buf ,(uint16_t )0u ));
598+ TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_epbuf . epin ,(uint16_t )0u ));
596599 usbtmc_state .state = STATE_ABORTING_BULK_IN_SHORTED ;
597600 return true;
598601
@@ -744,7 +747,7 @@ bool usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request
744747 if (usbtmc_state .transfer_size_sent == 0 )
745748 {
746749 // Send short packet, nothing is in the buffer yet
747- TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_state . ep_bulk_in_buf ,(uint16_t )0u ));
750+ TU_VERIFY ( usbd_edpt_xfer (rhport , usbtmc_state .ep_bulk_in , usbtmc_epbuf . epin ,(uint16_t )0u ));
748751 usbtmc_state .state = STATE_ABORTING_BULK_IN_SHORTED ;
749752 }
750753 TU_VERIFY (tud_usbtmc_initiate_abort_bulk_in_cb (& (rsp .USBTMC_status )));
0 commit comments