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;
|
uint8_t ep_int_in;
|
||||||
uint32_t ep_bulk_in_wMaxPacketSize;
|
uint32_t ep_bulk_in_wMaxPacketSize;
|
||||||
uint32_t ep_bulk_out_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_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)
|
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_capabilities_specific_t const * capabilities;
|
||||||
} usbtmc_interface_state_t;
|
} usbtmc_interface_state_t;
|
||||||
|
|
||||||
CFG_TUD_MEM_SECTION tu_static usbtmc_interface_state_t usbtmc_state =
|
typedef struct {
|
||||||
{
|
// IN buffer is only used for first packet, not the remainder in order to deal with prepending header
|
||||||
.itf_id = 0xFF,
|
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
|
// 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");
|
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 endOfMessage,
|
||||||
bool usingTermChar)
|
bool usingTermChar)
|
||||||
{
|
{
|
||||||
const unsigned int txBufLen = sizeof(usbtmc_state.ep_bulk_in_buf);
|
const unsigned int txBufLen = USBTMCD_BUFFER_SIZE;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
TU_ASSERT(len > 0u);
|
TU_ASSERT(len > 0u);
|
||||||
@@ -220,7 +224,7 @@ bool tud_usbtmc_transmit_dev_msg_data(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
TU_VERIFY(usbtmc_state.state == STATE_TX_REQUESTED);
|
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);
|
tu_varclr(hdr);
|
||||||
hdr->header.MsgID = USBTMC_MSGID_DEV_DEP_MSG_IN;
|
hdr->header.MsgID = USBTMC_MSGID_DEV_DEP_MSG_IN;
|
||||||
hdr->header.bTag = usbtmc_state.lastBulkInTag;
|
hdr->header.bTag = usbtmc_state.lastBulkInTag;
|
||||||
@@ -235,7 +239,7 @@ bool tud_usbtmc_transmit_dev_msg_data(
|
|||||||
len : (txBufLen - headerLen);
|
len : (txBufLen - headerLen);
|
||||||
const size_t packetLen = headerLen + dataLen;
|
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_remaining = len - dataLen;
|
||||||
usbtmc_state.transfer_size_sent = dataLen;
|
usbtmc_state.transfer_size_sent = dataLen;
|
||||||
usbtmc_state.devInBuffer = (uint8_t const*) data + (dataLen);
|
usbtmc_state.devInBuffer = (uint8_t const*) data + (dataLen);
|
||||||
@@ -243,7 +247,7 @@ bool tud_usbtmc_transmit_dev_msg_data(
|
|||||||
bool stateChanged =
|
bool stateChanged =
|
||||||
atomicChangeState(STATE_TX_REQUESTED, (packetLen >= txBufLen) ? STATE_TX_INITIATED : STATE_TX_SHORTED);
|
atomicChangeState(STATE_TX_REQUESTED, (packetLen >= txBufLen) ? STATE_TX_INITIATED : STATE_TX_SHORTED);
|
||||||
TU_VERIFY(stateChanged);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,8 +259,8 @@ bool tud_usbtmc_transmit_notification_data(const void * data, size_t len)
|
|||||||
#endif
|
#endif
|
||||||
TU_VERIFY(usbd_edpt_busy(usbtmc_state.rhport, usbtmc_state.ep_int_in));
|
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(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_state.ep_int_in_buf, (uint16_t)len));
|
TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_int_in, usbtmc_epbuf.epnotif, (uint16_t)len));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,7 +400,7 @@ bool tud_usbtmc_start_bus_read(void)
|
|||||||
default:
|
default:
|
||||||
return false;
|
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;
|
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:
|
case STATE_IDLE:
|
||||||
{
|
{
|
||||||
TU_VERIFY(xferred_bytes >= sizeof(usbtmc_msg_generic_t));
|
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);
|
uint8_t invInvTag = (uint8_t)~(msg->header.bTagInverse);
|
||||||
TU_VERIFY(msg->header.bTag == invInvTag);
|
TU_VERIFY(msg->header.bTag == invInvTag);
|
||||||
TU_VERIFY(msg->header.bTag != 0x00);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
case STATE_RCV:
|
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);
|
usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);
|
||||||
return false;
|
return false;
|
||||||
@@ -565,24 +569,23 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_TX_INITIATED:
|
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
|
// Copy buffer to ensure alignment correctness
|
||||||
memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, 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,
|
TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, USBTMCD_BUFFER_SIZE));
|
||||||
usbtmc_state.ep_bulk_in_buf, sizeof(usbtmc_state.ep_bulk_in_buf)));
|
usbtmc_state.devInBuffer += USBTMCD_BUFFER_SIZE;
|
||||||
usbtmc_state.devInBuffer += sizeof(usbtmc_state.ep_bulk_in_buf);
|
usbtmc_state.transfer_size_remaining -= USBTMCD_BUFFER_SIZE;
|
||||||
usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.ep_bulk_in_buf);
|
usbtmc_state.transfer_size_sent += USBTMCD_BUFFER_SIZE;
|
||||||
usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.ep_bulk_in_buf);
|
|
||||||
}
|
}
|
||||||
else // last packet
|
else // last packet
|
||||||
{
|
{
|
||||||
size_t packetLen = usbtmc_state.transfer_size_remaining;
|
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_sent += sizeof(usbtmc_state.transfer_size_remaining);
|
||||||
usbtmc_state.transfer_size_remaining = 0;
|
usbtmc_state.transfer_size_remaining = 0;
|
||||||
usbtmc_state.devInBuffer = NULL;
|
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 ))
|
if(((packetLen % usbtmc_state.ep_bulk_in_wMaxPacketSize) != 0) || (packetLen == 0 ))
|
||||||
{
|
{
|
||||||
usbtmc_state.state = STATE_TX_SHORTED;
|
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:
|
case STATE_ABORTING_BULK_IN:
|
||||||
// need to send short packet (ZLP?)
|
// 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;
|
usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED;
|
||||||
return true;
|
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)
|
if(usbtmc_state.transfer_size_sent == 0)
|
||||||
{
|
{
|
||||||
// Send short packet, nothing is in the buffer yet
|
// 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;
|
usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED;
|
||||||
}
|
}
|
||||||
TU_VERIFY(tud_usbtmc_initiate_abort_bulk_in_cb(&(rsp.USBTMC_status)));
|
TU_VERIFY(tud_usbtmc_initiate_abort_bulk_in_cb(&(rsp.USBTMC_status)));
|
||||||
|
64
src/class/vendor/vendor_device.c
vendored
64
src/class/vendor/vendor_device.c
vendored
@@ -40,16 +40,12 @@ typedef struct {
|
|||||||
uint8_t itf_num;
|
uint8_t itf_num;
|
||||||
|
|
||||||
/*------------- From this point, data is not cleared by bus reset -------------*/
|
/*------------- From this point, data is not cleared by bus reset -------------*/
|
||||||
// Endpoint Transfer buffer
|
|
||||||
CFG_TUD_MEM_ALIGN uint8_t epout_buf[CFG_TUD_VENDOR_EPSIZE];
|
|
||||||
CFG_TUD_MEM_ALIGN uint8_t epin_buf[CFG_TUD_VENDOR_EPSIZE];
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
tu_edpt_stream_t stream;
|
tu_edpt_stream_t stream;
|
||||||
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
||||||
uint8_t ff_buf[CFG_TUD_VENDOR_TX_BUFSIZE];
|
uint8_t ff_buf[CFG_TUD_VENDOR_TX_BUFSIZE];
|
||||||
#endif
|
#endif
|
||||||
}tx;
|
} tx;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
tu_edpt_stream_t stream;
|
tu_edpt_stream_t stream;
|
||||||
@@ -60,10 +56,17 @@ typedef struct {
|
|||||||
|
|
||||||
} vendord_interface_t;
|
} vendord_interface_t;
|
||||||
|
|
||||||
CFG_TUD_MEM_SECTION static vendord_interface_t _vendord_itf[CFG_TUD_VENDOR];
|
|
||||||
|
|
||||||
#define ITF_MEM_RESET_SIZE (offsetof(vendord_interface_t, itf_num) + sizeof(((vendord_interface_t *)0)->itf_num))
|
#define ITF_MEM_RESET_SIZE (offsetof(vendord_interface_t, itf_num) + sizeof(((vendord_interface_t *)0)->itf_num))
|
||||||
|
|
||||||
|
static vendord_interface_t _vendord_itf[CFG_TUD_VENDOR];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
TUD_EPBUF_DEF(epout, CFG_TUD_VENDOR_EPSIZE);
|
||||||
|
TUD_EPBUF_DEF(epin, CFG_TUD_VENDOR_EPSIZE);
|
||||||
|
} vendord_epbuf_t;
|
||||||
|
|
||||||
|
CFG_TUD_MEM_SECTION static vendord_epbuf_t _vendord_epbuf[CFG_TUD_VENDOR];
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// Application API
|
// Application API
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
@@ -94,7 +97,7 @@ bool tud_vendor_n_peek(uint8_t itf, uint8_t* u8) {
|
|||||||
uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize) {
|
uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize) {
|
||||||
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
||||||
uint8_t const rhport = 0;
|
const uint8_t rhport = 0;
|
||||||
|
|
||||||
return tu_edpt_stream_read(rhport, &p_itf->rx.stream, buffer, bufsize);
|
return tu_edpt_stream_read(rhport, &p_itf->rx.stream, buffer, bufsize);
|
||||||
}
|
}
|
||||||
@@ -102,7 +105,7 @@ uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize) {
|
|||||||
void tud_vendor_n_read_flush (uint8_t itf) {
|
void tud_vendor_n_read_flush (uint8_t itf) {
|
||||||
TU_VERIFY(itf < CFG_TUD_VENDOR, );
|
TU_VERIFY(itf < CFG_TUD_VENDOR, );
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
||||||
uint8_t const rhport = 0;
|
const uint8_t rhport = 0;
|
||||||
|
|
||||||
tu_edpt_stream_clear(&p_itf->rx.stream);
|
tu_edpt_stream_clear(&p_itf->rx.stream);
|
||||||
tu_edpt_stream_read_xfer(rhport, &p_itf->rx.stream);
|
tu_edpt_stream_read_xfer(rhport, &p_itf->rx.stream);
|
||||||
@@ -111,10 +114,10 @@ void tud_vendor_n_read_flush (uint8_t itf) {
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Write API
|
// Write API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
uint32_t tud_vendor_n_write (uint8_t itf, void const* buffer, uint32_t bufsize) {
|
uint32_t tud_vendor_n_write (uint8_t itf, const void* buffer, uint32_t bufsize) {
|
||||||
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
||||||
uint8_t const rhport = 0;
|
const uint8_t rhport = 0;
|
||||||
|
|
||||||
return tu_edpt_stream_write(rhport, &p_itf->tx.stream, buffer, (uint16_t) bufsize);
|
return tu_edpt_stream_write(rhport, &p_itf->tx.stream, buffer, (uint16_t) bufsize);
|
||||||
}
|
}
|
||||||
@@ -122,7 +125,7 @@ uint32_t tud_vendor_n_write (uint8_t itf, void const* buffer, uint32_t bufsize)
|
|||||||
uint32_t tud_vendor_n_write_flush (uint8_t itf) {
|
uint32_t tud_vendor_n_write_flush (uint8_t itf) {
|
||||||
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
||||||
uint8_t const rhport = 0;
|
const uint8_t rhport = 0;
|
||||||
|
|
||||||
return tu_edpt_stream_write_xfer(rhport, &p_itf->tx.stream);
|
return tu_edpt_stream_write_xfer(rhport, &p_itf->tx.stream);
|
||||||
}
|
}
|
||||||
@@ -130,7 +133,7 @@ uint32_t tud_vendor_n_write_flush (uint8_t itf) {
|
|||||||
uint32_t tud_vendor_n_write_available (uint8_t itf) {
|
uint32_t tud_vendor_n_write_available (uint8_t itf) {
|
||||||
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
TU_VERIFY(itf < CFG_TUD_VENDOR, 0);
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
vendord_interface_t* p_itf = &_vendord_itf[itf];
|
||||||
uint8_t const rhport = 0;
|
const uint8_t rhport = 0;
|
||||||
|
|
||||||
return tu_edpt_stream_write_available(rhport, &p_itf->tx.stream);
|
return tu_edpt_stream_write_available(rhport, &p_itf->tx.stream);
|
||||||
}
|
}
|
||||||
@@ -143,6 +146,7 @@ void vendord_init(void) {
|
|||||||
|
|
||||||
for(uint8_t i=0; i<CFG_TUD_VENDOR; i++) {
|
for(uint8_t i=0; i<CFG_TUD_VENDOR; i++) {
|
||||||
vendord_interface_t* p_itf = &_vendord_itf[i];
|
vendord_interface_t* p_itf = &_vendord_itf[i];
|
||||||
|
vendord_epbuf_t* p_epbuf = &_vendord_epbuf[i];
|
||||||
|
|
||||||
uint8_t* rx_ff_buf =
|
uint8_t* rx_ff_buf =
|
||||||
#if CFG_TUD_VENDOR_RX_BUFSIZE > 0
|
#if CFG_TUD_VENDOR_RX_BUFSIZE > 0
|
||||||
@@ -153,7 +157,7 @@ void vendord_init(void) {
|
|||||||
|
|
||||||
tu_edpt_stream_init(&p_itf->rx.stream, false, false, false,
|
tu_edpt_stream_init(&p_itf->rx.stream, false, false, false,
|
||||||
rx_ff_buf, CFG_TUD_VENDOR_RX_BUFSIZE,
|
rx_ff_buf, CFG_TUD_VENDOR_RX_BUFSIZE,
|
||||||
p_itf->epout_buf, CFG_TUD_VENDOR_EPSIZE);
|
p_epbuf->epout, CFG_TUD_VENDOR_EPSIZE);
|
||||||
|
|
||||||
uint8_t* tx_ff_buf =
|
uint8_t* tx_ff_buf =
|
||||||
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
||||||
@@ -164,7 +168,7 @@ void vendord_init(void) {
|
|||||||
|
|
||||||
tu_edpt_stream_init(&p_itf->tx.stream, false, true, false,
|
tu_edpt_stream_init(&p_itf->tx.stream, false, true, false,
|
||||||
tx_ff_buf, CFG_TUD_VENDOR_TX_BUFSIZE,
|
tx_ff_buf, CFG_TUD_VENDOR_TX_BUFSIZE,
|
||||||
p_itf->epin_buf, CFG_TUD_VENDOR_EPSIZE);
|
p_epbuf->epin, CFG_TUD_VENDOR_EPSIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +194,7 @@ void vendord_reset(uint8_t rhport) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len) {
|
uint16_t vendord_open(uint8_t rhport, const tusb_desc_interface_t* desc_itf, uint16_t max_len) {
|
||||||
TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == desc_itf->bInterfaceClass, 0);
|
TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == desc_itf->bInterfaceClass, 0);
|
||||||
const uint8_t* p_desc = tu_desc_next(desc_itf);
|
const uint8_t* p_desc = tu_desc_next(desc_itf);
|
||||||
const uint8_t* desc_end = p_desc + max_len;
|
const uint8_t* desc_end = p_desc + max_len;
|
||||||
@@ -237,25 +241,29 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, ui
|
|||||||
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {
|
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {
|
||||||
(void) result;
|
(void) result;
|
||||||
|
|
||||||
uint8_t itf = 0;
|
uint8_t itf;
|
||||||
vendord_interface_t* p_itf = _vendord_itf;
|
vendord_interface_t* p_vendor;
|
||||||
|
|
||||||
for ( ; ; itf++, p_itf++) {
|
for (itf = 0; itf < CFG_TUD_VENDOR; itf++) {
|
||||||
if (itf >= CFG_TUD_VENDOR) return false;
|
p_vendor = &_vendord_itf[itf];
|
||||||
if ((ep_addr == p_itf->rx.stream.ep_addr) || (ep_addr == p_itf->tx.stream.ep_addr)) break;
|
if ((ep_addr == p_vendor->rx.stream.ep_addr) || (ep_addr == p_vendor->tx.stream.ep_addr)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
TU_VERIFY(itf < CFG_TUD_VENDOR);
|
||||||
|
vendord_epbuf_t* p_epbuf = &_vendord_epbuf[itf];
|
||||||
|
|
||||||
if ( ep_addr == p_itf->rx.stream.ep_addr ) {
|
if ( ep_addr == p_vendor->rx.stream.ep_addr ) {
|
||||||
// Received new data: put into stream's fifo
|
// Received new data: put into stream's fifo
|
||||||
tu_edpt_stream_read_xfer_complete(&p_itf->rx.stream, xferred_bytes);
|
tu_edpt_stream_read_xfer_complete(&p_vendor->rx.stream, xferred_bytes);
|
||||||
|
|
||||||
// Invoked callback if any
|
// Invoked callback if any
|
||||||
if (tud_vendor_rx_cb) {
|
if (tud_vendor_rx_cb) {
|
||||||
tud_vendor_rx_cb(itf, p_itf->epout_buf, (uint16_t) xferred_bytes);
|
tud_vendor_rx_cb(itf, p_epbuf->epout, (uint16_t) xferred_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
tu_edpt_stream_read_xfer(rhport, &p_itf->rx.stream);
|
tu_edpt_stream_read_xfer(rhport, &p_vendor->rx.stream);
|
||||||
} else if ( ep_addr == p_itf->tx.stream.ep_addr ) {
|
} else if ( ep_addr == p_vendor->tx.stream.ep_addr ) {
|
||||||
// Send complete
|
// Send complete
|
||||||
if (tud_vendor_tx_cb) {
|
if (tud_vendor_tx_cb) {
|
||||||
tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes);
|
tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes);
|
||||||
@@ -263,9 +271,9 @@ bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
|
|||||||
|
|
||||||
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
|
||||||
// try to send more if possible
|
// try to send more if possible
|
||||||
if ( 0 == tu_edpt_stream_write_xfer(rhport, &p_itf->tx.stream) ) {
|
if ( 0 == tu_edpt_stream_write_xfer(rhport, &p_vendor->tx.stream) ) {
|
||||||
// If there is no data left, a ZLP should be sent if xferred_bytes is multiple of EP Packet size and not zero
|
// If there is no data left, a ZLP should be sent if xferred_bytes is multiple of EP Packet size and not zero
|
||||||
tu_edpt_stream_write_zlp_if_needed(rhport, &p_itf->tx.stream, xferred_bytes);
|
tu_edpt_stream_write_zlp_if_needed(rhport, &p_vendor->tx.stream, xferred_bytes);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user