TUD_EPBUF_TYPE_DEF usbtmc_device.c and vendor_device.c
This commit is contained in:
		| @@ -131,14 +131,6 @@ typedef struct | ||||
|   uint8_t ep_int_in; | ||||
|   uint32_t ep_bulk_in_wMaxPacketSize; | ||||
|   uint32_t ep_bulk_out_wMaxPacketSize; | ||||
|   // IN buffer is only used for first packet, not the remainder | ||||
|   // in order to deal with prepending header | ||||
|   CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_in_buf[USBTMCD_BUFFER_SIZE]; | ||||
|   // OUT buffer receives one packet at a time | ||||
|   CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_out_buf[USBTMCD_BUFFER_SIZE]; | ||||
|   // Buffer int msg to ensure alignment and placement correctness | ||||
|   CFG_TUSB_MEM_ALIGN uint8_t ep_int_in_buf[CFG_TUD_USBTMC_INT_EP_SIZE]; | ||||
|  | ||||
|   uint32_t transfer_size_remaining; // also used for requested length for bulk IN. | ||||
|   uint32_t transfer_size_sent;      // To keep track of data bytes that have been queued in FIFO (not header bytes) | ||||
|  | ||||
| @@ -150,11 +142,23 @@ typedef struct | ||||
|   usbtmc_capabilities_specific_t const * capabilities; | ||||
| } usbtmc_interface_state_t; | ||||
|  | ||||
| CFG_TUD_MEM_SECTION tu_static usbtmc_interface_state_t usbtmc_state = | ||||
| { | ||||
|     .itf_id = 0xFF, | ||||
| typedef struct { | ||||
|   // IN buffer is only used for first packet, not the remainder in order to deal with prepending header | ||||
|   TUD_EPBUF_DEF(epin, USBTMCD_BUFFER_SIZE); | ||||
|  | ||||
|   // OUT buffer receives one packet at a time | ||||
|   TUD_EPBUF_DEF(epout, USBTMCD_BUFFER_SIZE); | ||||
|  | ||||
|   // Buffer int msg | ||||
|   TUD_EPBUF_DEF(epnotif, CFG_TUD_USBTMC_INT_EP_SIZE); | ||||
| } usbtmc_epbuf_t; | ||||
|  | ||||
| static usbtmc_interface_state_t usbtmc_state = { | ||||
|   .itf_id = 0xFF, | ||||
| }; | ||||
|  | ||||
| CFG_TUD_MEM_SECTION static usbtmc_epbuf_t usbtmc_epbuf; | ||||
|  | ||||
| // We need all headers to fit in a single packet in this implementation, 32 bytes will fit all standard USBTMC headers | ||||
| TU_VERIFY_STATIC(USBTMCD_BUFFER_SIZE >= 32u,"USBTMC dev buffer size too small"); | ||||
|  | ||||
| @@ -205,7 +209,7 @@ bool tud_usbtmc_transmit_dev_msg_data( | ||||
|     bool endOfMessage, | ||||
|     bool usingTermChar) | ||||
| { | ||||
|   const unsigned int txBufLen = sizeof(usbtmc_state.ep_bulk_in_buf); | ||||
|   const unsigned int txBufLen = USBTMCD_BUFFER_SIZE; | ||||
|  | ||||
| #ifndef NDEBUG | ||||
|   TU_ASSERT(len > 0u); | ||||
| @@ -220,7 +224,7 @@ bool tud_usbtmc_transmit_dev_msg_data( | ||||
| #endif | ||||
|  | ||||
|   TU_VERIFY(usbtmc_state.state == STATE_TX_REQUESTED); | ||||
|   usbtmc_msg_dev_dep_msg_in_header_t *hdr = (usbtmc_msg_dev_dep_msg_in_header_t*)usbtmc_state.ep_bulk_in_buf; | ||||
|   usbtmc_msg_dev_dep_msg_in_header_t *hdr = (usbtmc_msg_dev_dep_msg_in_header_t*)usbtmc_epbuf.epin; | ||||
|   tu_varclr(hdr); | ||||
|   hdr->header.MsgID = USBTMC_MSGID_DEV_DEP_MSG_IN; | ||||
|   hdr->header.bTag = usbtmc_state.lastBulkInTag; | ||||
| @@ -235,7 +239,7 @@ bool tud_usbtmc_transmit_dev_msg_data( | ||||
|                             len : (txBufLen - headerLen); | ||||
|   const size_t packetLen = headerLen + dataLen; | ||||
|  | ||||
|   memcpy((uint8_t*)(usbtmc_state.ep_bulk_in_buf) + headerLen, data, dataLen); | ||||
|   memcpy((uint8_t*)(usbtmc_epbuf.epin) + headerLen, data, dataLen); | ||||
|   usbtmc_state.transfer_size_remaining = len - dataLen; | ||||
|   usbtmc_state.transfer_size_sent = dataLen; | ||||
|   usbtmc_state.devInBuffer = (uint8_t const*) data + (dataLen); | ||||
| @@ -243,7 +247,7 @@ bool tud_usbtmc_transmit_dev_msg_data( | ||||
|   bool stateChanged = | ||||
|       atomicChangeState(STATE_TX_REQUESTED, (packetLen >= txBufLen) ? STATE_TX_INITIATED : STATE_TX_SHORTED); | ||||
|   TU_VERIFY(stateChanged); | ||||
|   TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf, (uint16_t)packetLen)); | ||||
|   TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t)packetLen)); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| @@ -255,8 +259,8 @@ bool tud_usbtmc_transmit_notification_data(const void * data, size_t len) | ||||
| #endif | ||||
|   TU_VERIFY(usbd_edpt_busy(usbtmc_state.rhport, usbtmc_state.ep_int_in)); | ||||
|  | ||||
|   TU_VERIFY(tu_memcpy_s(usbtmc_state.ep_int_in_buf, sizeof(usbtmc_state.ep_int_in_buf), data, len) == 0); | ||||
|   TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_int_in, usbtmc_state.ep_int_in_buf, (uint16_t)len)); | ||||
|   TU_VERIFY(tu_memcpy_s(usbtmc_epbuf.epnotif, CFG_TUD_USBTMC_INT_EP_SIZE, data, len) == 0); | ||||
|   TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_int_in, usbtmc_epbuf.epnotif, (uint16_t)len)); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| @@ -396,7 +400,7 @@ bool tud_usbtmc_start_bus_read(void) | ||||
|   default: | ||||
|     return false; | ||||
|   } | ||||
|   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)); | ||||
|   TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_bulk_out, usbtmc_epbuf.epout, (uint16_t)usbtmc_state.ep_bulk_out_wMaxPacketSize)); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| @@ -501,7 +505,7 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint | ||||
|     case STATE_IDLE: | ||||
|       { | ||||
|         TU_VERIFY(xferred_bytes >= sizeof(usbtmc_msg_generic_t)); | ||||
|         msg = (usbtmc_msg_generic_t*)(usbtmc_state.ep_bulk_out_buf); | ||||
|         msg = (usbtmc_msg_generic_t*)(usbtmc_epbuf.epout); | ||||
|         uint8_t invInvTag = (uint8_t)~(msg->header.bTagInverse); | ||||
|         TU_VERIFY(msg->header.bTag == invInvTag); | ||||
|         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 | ||||
|         return true; | ||||
|       } | ||||
|     case STATE_RCV: | ||||
|       if(!handle_devMsgOut(rhport, usbtmc_state.ep_bulk_out_buf, xferred_bytes, xferred_bytes)) | ||||
|       if(!handle_devMsgOut(rhport, usbtmc_epbuf.epout, xferred_bytes, xferred_bytes)) | ||||
|       { | ||||
|         usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out); | ||||
|         return false; | ||||
| @@ -565,24 +569,23 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint | ||||
|       break; | ||||
|  | ||||
|     case STATE_TX_INITIATED: | ||||
|       if(usbtmc_state.transfer_size_remaining >= sizeof(usbtmc_state.ep_bulk_in_buf)) | ||||
|       if(usbtmc_state.transfer_size_remaining >= USBTMCD_BUFFER_SIZE) | ||||
|       { | ||||
|         // Copy buffer to ensure alignment correctness | ||||
|         memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, sizeof(usbtmc_state.ep_bulk_in_buf)); | ||||
|         TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, | ||||
|             usbtmc_state.ep_bulk_in_buf, sizeof(usbtmc_state.ep_bulk_in_buf))); | ||||
|         usbtmc_state.devInBuffer += sizeof(usbtmc_state.ep_bulk_in_buf); | ||||
|         usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.ep_bulk_in_buf); | ||||
|         usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.ep_bulk_in_buf); | ||||
|         memcpy(usbtmc_epbuf.epin, usbtmc_state.devInBuffer, USBTMCD_BUFFER_SIZE); | ||||
|         TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, USBTMCD_BUFFER_SIZE)); | ||||
|         usbtmc_state.devInBuffer += USBTMCD_BUFFER_SIZE; | ||||
|         usbtmc_state.transfer_size_remaining -= USBTMCD_BUFFER_SIZE; | ||||
|         usbtmc_state.transfer_size_sent += USBTMCD_BUFFER_SIZE; | ||||
|       } | ||||
|       else // last packet | ||||
|       { | ||||
|         size_t packetLen = usbtmc_state.transfer_size_remaining; | ||||
|         memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining); | ||||
|         memcpy(usbtmc_epbuf.epin, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining); | ||||
|           usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.transfer_size_remaining); | ||||
|         usbtmc_state.transfer_size_remaining = 0; | ||||
|         usbtmc_state.devInBuffer = NULL; | ||||
|         TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf, (uint16_t)packetLen) ); | ||||
|         TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t)packetLen) ); | ||||
|         if(((packetLen % usbtmc_state.ep_bulk_in_wMaxPacketSize) != 0) || (packetLen == 0 )) | ||||
|         { | ||||
|           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 | ||||
|  | ||||
|     case STATE_ABORTING_BULK_IN: | ||||
|       // need to send short packet  (ZLP?) | ||||
|       TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)0u)); | ||||
|       TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin,(uint16_t)0u)); | ||||
|       usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED; | ||||
|       return true; | ||||
|  | ||||
| @@ -744,7 +747,7 @@ bool usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request | ||||
|       if(usbtmc_state.transfer_size_sent  == 0) | ||||
|       { | ||||
|         // Send short packet, nothing is in the buffer yet | ||||
|         TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)0u)); | ||||
|         TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin,(uint16_t)0u)); | ||||
|         usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED; | ||||
|       } | ||||
|       TU_VERIFY(tud_usbtmc_initiate_abort_bulk_in_cb(&(rsp.USBTMC_status))); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach