mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-24 05:42:57 +08:00
Just leave the endpoints open, instead of closing/reopening
This commit is contained in:
parent
a3d6e8fc52
commit
a3fdcbdf16
@ -51,11 +51,6 @@ typedef struct
|
|||||||
uint8_t ep_in;
|
uint8_t ep_in;
|
||||||
uint8_t ep_out;
|
uint8_t ep_out;
|
||||||
|
|
||||||
// Endpoint descriptor use to open/close when receving SetInterface
|
|
||||||
// TODO since configuration descriptor may not be long-lived memory, we should
|
|
||||||
// keep a copy of endpoint attribute instead
|
|
||||||
uint8_t const * ecm_desc_epdata;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
REPORT_SPEED,
|
REPORT_SPEED,
|
||||||
REPORT_CONNECTED,
|
REPORT_CONNECTED,
|
||||||
@ -290,9 +285,7 @@ uint16_t ncmd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint1
|
|||||||
// Pair of endpoints
|
// Pair of endpoints
|
||||||
TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(p_desc), 0);
|
TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(p_desc), 0);
|
||||||
|
|
||||||
// ECM by default is in-active, save the endpoint attribute
|
TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, 2, TUSB_XFER_BULK, &ncm_interface.ep_out, &ncm_interface.ep_in) );
|
||||||
// to open later when receive_ntb setInterface
|
|
||||||
ncm_interface.ecm_desc_epdata = p_desc;
|
|
||||||
|
|
||||||
drv_len += 2*sizeof(tusb_desc_endpoint_t);
|
drv_len += 2*sizeof(tusb_desc_endpoint_t);
|
||||||
|
|
||||||
@ -348,33 +341,22 @@ bool ncmd_control_request(uint8_t rhport, tusb_control_request_t const * request
|
|||||||
// Only valid for Data Interface with Alternate is either 0 or 1
|
// Only valid for Data Interface with Alternate is either 0 or 1
|
||||||
TU_VERIFY(ncm_interface.itf_num + 1 == req_itfnum && req_alt < 2);
|
TU_VERIFY(ncm_interface.itf_num + 1 == req_itfnum && req_alt < 2);
|
||||||
|
|
||||||
ncm_interface.itf_data_alt = req_alt;
|
if (req_alt != ncm_interface.itf_data_alt) {
|
||||||
|
ncm_interface.itf_data_alt = req_alt;
|
||||||
|
|
||||||
if ( ncm_interface.itf_data_alt )
|
if (ncm_interface.itf_data_alt) {
|
||||||
{
|
if (!usbd_edpt_busy(rhport, ncm_interface.ep_out)) {
|
||||||
// TODO since we don't actually close endpoint
|
ncm_receive_renew(); // prepare for incoming datagrams
|
||||||
// hack here to not re-open it
|
}
|
||||||
if (ncm_interface.ep_in == 0 && ncm_interface.ep_out == 0)
|
if (!ncm_interface.report_pending) {
|
||||||
{
|
ncm_report();
|
||||||
TU_ASSERT(ncm_interface.ecm_desc_epdata);
|
}
|
||||||
TU_ASSERT( usbd_open_edpt_pair(rhport, ncm_interface.ecm_desc_epdata, 2, TUSB_XFER_BULK, &ncm_interface.ep_out, &ncm_interface.ep_in) );
|
|
||||||
|
|
||||||
// TODO set flag indicating tx allowed?
|
|
||||||
ncm_receive_renew(); // prepare for incoming datagrams
|
|
||||||
tud_ncm_link_state_cb(true);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// TODO close the endpoint pair
|
tud_ncm_link_state_cb(ncm_interface.itf_data_alt);
|
||||||
// For now pretend that we did, this should have no harm since host won't try to
|
|
||||||
// communicate with the endpoints again
|
|
||||||
// ncm_interface.ep_in = ncm_interface.ep_out = 0
|
|
||||||
// ncm_interface.report_pending = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tud_control_status(rhport, request);
|
tud_control_status(rhport, request);
|
||||||
|
|
||||||
if (!ncm_interface.report_pending) ncm_report();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -445,7 +427,7 @@ bool ncmd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there are datagrams queued up that we tried to send while this NTB was being emitted, send them now
|
// If there are datagrams queued up that we tried to send while this NTB was being emitted, send them now
|
||||||
if (ncm_interface.datagram_count) {
|
if (ncm_interface.datagram_count && ncm_interface.itf_data_alt == 1) {
|
||||||
ncm_start_tx();
|
ncm_start_tx();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -462,6 +444,8 @@ bool ncmd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
|
|||||||
bool tud_ncm_xmit(void *arg, uint16_t size, void (*flatten)(void *, uint8_t *, uint16_t)) {
|
bool tud_ncm_xmit(void *arg, uint16_t size, void (*flatten)(void *, uint8_t *, uint16_t)) {
|
||||||
transmit_ntb_t *ntb = &transmit_ntb[ncm_interface.current_ntb];
|
transmit_ntb_t *ntb = &transmit_ntb[ncm_interface.current_ntb];
|
||||||
|
|
||||||
|
TU_VERIFY(ncm_interface.itf_data_alt == 1);
|
||||||
|
|
||||||
if (ncm_interface.datagram_count >= ncm_interface.max_datagrams_per_ntb) {
|
if (ncm_interface.datagram_count >= ncm_interface.max_datagrams_per_ntb) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user