Skip to content

Commit ee234a8

Browse files
committed
hack: force/overwrite endpoint mps to 64 for device that incorrectly report 512 bytes for bulk in fullspeed mode.
1 parent 39e6375 commit ee234a8

File tree

5 files changed

+18
-9
lines changed

5 files changed

+18
-9
lines changed

src/class/midi/midi_host.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,10 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
267267
break;
268268

269269
case TUSB_DESC_ENDPOINT: {
270-
tusb_desc_endpoint_t const *p_ep = (tusb_desc_endpoint_t const *) p_desc;
270+
const tusb_desc_endpoint_t *p_ep = (const tusb_desc_endpoint_t *) p_desc;
271271
p_desc = tu_desc_next(p_desc); // next to CS endpoint
272272
TU_VERIFY(p_desc < p_end && tu_desc_next(p_desc) <= p_end);
273-
midi_desc_cs_endpoint_t const *p_csep = (midi_desc_cs_endpoint_t const *) p_desc;
273+
const midi_desc_cs_endpoint_t *p_csep = (const midi_desc_cs_endpoint_t *) p_desc;
274274

275275
TU_LOG_DRV(" Endpoint and CS_Endpoint descriptor %02x\r\n", p_ep->bEndpointAddress);
276276
if (tu_edpt_dir(p_ep->bEndpointAddress) == TUSB_DIR_OUT) {

src/common/tusb_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ typedef struct {
6767
//--------------------------------------------------------------------+
6868

6969
// Check if endpoint descriptor is valid per USB specs
70-
bool tu_edpt_validate(tusb_desc_endpoint_t const * desc_ep, tusb_speed_t speed);
70+
bool tu_edpt_validate(tusb_desc_endpoint_t const * desc_ep, tusb_speed_t speed, bool is_host);
7171

7272
// Bind all endpoint of a interface descriptor to class driver
7373
void tu_edpt_bind_driver(uint8_t ep2drv[][2], tusb_desc_interface_t const* p_desc, uint16_t desc_len, uint8_t driver_id);

src/device/usbd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,7 +1296,7 @@ bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_ep) {
12961296
rhport = _usbd_rhport;
12971297

12981298
TU_ASSERT(tu_edpt_number(desc_ep->bEndpointAddress) < CFG_TUD_ENDPPOINT_MAX);
1299-
TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) _usbd_dev.speed));
1299+
TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) _usbd_dev.speed, false));
13001300

13011301
return dcd_edpt_open(rhport, desc_ep);
13021302
}
@@ -1497,7 +1497,7 @@ bool usbd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const* desc_ep)
14971497
uint8_t const dir = tu_edpt_dir(desc_ep->bEndpointAddress);
14981498

14991499
TU_ASSERT(epnum < CFG_TUD_ENDPPOINT_MAX);
1500-
TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) _usbd_dev.speed));
1500+
TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) _usbd_dev.speed, false));
15011501

15021502
_usbd_dev.ep_status[epnum][dir].stalled = 0;
15031503
_usbd_dev.ep_status[epnum][dir].busy = 0;

src/host/usbh.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ static bool usbh_edpt_control_open(uint8_t dev_addr, uint8_t max_packet_size) {
986986
}
987987

988988
bool tuh_edpt_open(uint8_t dev_addr, tusb_desc_endpoint_t const* desc_ep) {
989-
TU_ASSERT(tu_edpt_validate(desc_ep, tuh_speed_get(dev_addr)));
989+
TU_ASSERT(tu_edpt_validate(desc_ep, tuh_speed_get(dev_addr), true));
990990
return hcd_edpt_open(usbh_get_rhport(dev_addr), dev_addr, desc_ep);
991991
}
992992

src/tusb.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ bool tu_edpt_release(tu_edpt_state_t* ep_state, osal_mutex_t mutex) {
205205
return ret;
206206
}
207207

208-
bool tu_edpt_validate(tusb_desc_endpoint_t const* desc_ep, tusb_speed_t speed) {
208+
bool tu_edpt_validate(tusb_desc_endpoint_t const* desc_ep, tusb_speed_t speed, bool is_host) {
209209
uint16_t const max_packet_size = tu_edpt_packet_size(desc_ep);
210210
TU_LOG2(" Open EP %02X with Size = %u\r\n", desc_ep->bEndpointAddress, max_packet_size);
211211

@@ -221,8 +221,17 @@ bool tu_edpt_validate(tusb_desc_endpoint_t const* desc_ep, tusb_speed_t speed) {
221221
// Bulk highspeed must be EXACTLY 512
222222
TU_ASSERT(max_packet_size == 512);
223223
} else {
224-
// TODO Bulk fullspeed can only be 8, 16, 32, 64
225-
TU_ASSERT(max_packet_size <= 64);
224+
// Bulk fullspeed can only be 8, 16, 32, 64
225+
if (is_host && max_packet_size == 512) {
226+
// HACK: while in host mode, some device incorrectly always report 512 regardless of link speed
227+
// overwrite descriptor to force 64
228+
TU_LOG1(" WARN: EP max packet size is 512 in fullspeed, force to 64\r\n");
229+
tusb_desc_endpoint_t* hacked_ep = (tusb_desc_endpoint_t*) (uintptr_t) desc_ep;
230+
hacked_ep->wMaxPacketSize = tu_htole16(64);
231+
} else {
232+
TU_ASSERT(max_packet_size == 8 || max_packet_size == 16 ||
233+
max_packet_size == 32 || max_packet_size == 64);
234+
}
226235
}
227236
break;
228237

0 commit comments

Comments
 (0)