43
43
__attribute__((aligned (4 ))) static uint8_t USBFS_RX_Buf [USBFS_RX_BUF_LEN ];
44
44
__attribute__((aligned (4 ))) static uint8_t USBFS_TX_Buf [USBFS_TX_BUF_LEN ];
45
45
46
- #define USB_XFER_TIMEOUT_MILLIS 500
46
+ #define USB_XFER_TIMEOUT_MILLIS 100
47
+ #define USB_INTERRUPT_XFER_TIMEOUT_MILLIS 1
47
48
48
49
#define PANIC (...) do { printf("\r\nPANIC: " __VA_ARGS__); while (true) { } } while (false)
49
50
50
51
#define LOG_CH32_USBFSH (...) TU_LOG3(__VA_ARGS__)
51
52
52
53
// Busywait for delay microseconds/nanoseconds
53
- // static void loopdelay(uint32_t count)
54
- // {
55
- // volatile uint32_t c = count / 3;
56
- // // while (c-- != 0);
57
- // asm volatile(
58
- // "1: \n" // loop label
59
- // " addi %0, %0, -1 \n" // c--
60
- // " bne %0, zero, 1b \n" // if (c != 0) goto loop
61
- // : "+r"(c) // c is input/output operand
62
- // );
63
- // }
54
+ static void loopdelay (uint32_t count )
55
+ {
56
+ volatile uint32_t c = count / 3 ;
57
+ if (c == 0 ) { return ; }
58
+ // while (c-- != 0);
59
+ asm volatile (
60
+ "1: \n" // loop label
61
+ " addi %0, %0, -1 \n" // c--
62
+ " bne %0, zero, 1b \n" // if (c != 0) goto loop
63
+ : "+r" (c ) // c is input/output operand
64
+ );
65
+ }
64
66
65
67
66
68
// Endpoint status
@@ -71,21 +73,30 @@ typedef struct usb_edpt
71
73
72
74
uint8_t dev_addr ;
73
75
uint8_t ep_addr ;
74
- uint16_t max_packet_size ;
76
+ uint8_t max_packet_size ;
77
+
78
+ uint8_t xfer_type ;
75
79
76
80
// Data toggle (0 or not 0) for DATA0/1
77
81
uint8_t data_toggle ;
82
+ } usb_edpt_t ;
83
+
84
+
85
+ static usb_edpt_t usb_edpt_list [CFG_TUH_DEVICE_MAX * 6 ] = {};
86
+
78
87
88
+ typedef struct usb_current_xfer_st {
89
+ bool is_busy ;
90
+ uint8_t dev_addr ;
91
+ uint8_t ep_addr ;
79
92
// Xfer started time in millis for timeout
80
93
uint32_t current_xfer_packet_start_millis ;
81
94
uint8_t * current_xfer_buffer ;
82
95
uint16_t current_xfer_bufferlen ;
83
96
uint16_t current_xfer_xferred_len ;
97
+ } usb_current_xfer_t ;
84
98
85
- } usb_edpt_t ;
86
-
87
-
88
- static usb_edpt_t usb_edpt_list [8 ] = { };
99
+ static volatile usb_current_xfer_t usb_current_xfer_info = {};
89
100
90
101
91
102
static usb_edpt_t * get_edpt_record (uint8_t dev_addr , uint8_t ep_addr )
@@ -113,26 +124,26 @@ static usb_edpt_t* get_empty_record_slot(void)
113
124
return NULL ;
114
125
}
115
126
116
- static usb_edpt_t * add_edpt_record (uint8_t dev_addr , uint8_t ep_addr , uint16_t max_packet_size )
127
+ static usb_edpt_t * add_edpt_record (uint8_t dev_addr , uint8_t ep_addr , uint16_t max_packet_size , uint8_t xfer_type )
117
128
{
118
129
usb_edpt_t * slot = get_empty_record_slot ();
130
+ if (slot == NULL ) {
131
+ PANIC ("add_edpt_record(0x%02x, 0x%02x, ...) no slot for new record\r\n" , dev_addr , ep_addr );
132
+ }
119
133
TU_ASSERT (slot != NULL , NULL );
120
134
121
135
slot -> dev_addr = dev_addr ;
122
136
slot -> ep_addr = ep_addr ;
123
137
slot -> max_packet_size = max_packet_size ;
138
+ slot -> xfer_type = xfer_type ;
124
139
slot -> data_toggle = 0 ;
125
- slot -> current_xfer_packet_start_millis = 0 ;
126
- slot -> current_xfer_buffer = NULL ;
127
- slot -> current_xfer_bufferlen = 0 ;
128
- slot -> current_xfer_xferred_len = 0 ;
129
140
130
141
slot -> configured = true;
131
142
132
143
return slot ;
133
144
}
134
145
135
- static usb_edpt_t * get_or_add_edpt_record (uint8_t dev_addr , uint8_t ep_addr , uint16_t max_packet_size )
146
+ static usb_edpt_t * get_or_add_edpt_record (uint8_t dev_addr , uint8_t ep_addr , uint16_t max_packet_size , uint8_t xfer_type )
136
147
{
137
148
usb_edpt_t * ret = get_edpt_record (dev_addr , ep_addr );
138
149
if (ret != NULL )
@@ -141,7 +152,7 @@ static usb_edpt_t* get_or_add_edpt_record(uint8_t dev_addr, uint8_t ep_addr, uin
141
152
}
142
153
else
143
154
{
144
- return add_edpt_record (dev_addr , ep_addr , max_packet_size );
155
+ return add_edpt_record (dev_addr , ep_addr , max_packet_size , xfer_type );
145
156
}
146
157
}
147
158
@@ -157,6 +168,17 @@ static void remove_edpt_record_for_device(uint8_t dev_addr)
157
168
}
158
169
}
159
170
171
+ // static void dump_edpt_record_list() {
172
+ // for (size_t i = 0; i < TU_ARRAY_SIZE(usb_edpt_list); i++) {
173
+ // usb_edpt_t* cur = &usb_edpt_list[i];
174
+ // if (cur->configured) {
175
+ // printf("[%2d] Device 0x%02x Endpoint 0x%02x\r\n", i, cur->dev_addr, cur->ep_addr);
176
+ // } else {
177
+ // printf("[%2d] not configured\r\n", i);
178
+ // }
179
+ // }
180
+ // }
181
+
160
182
161
183
/** Enable or disable USBFS Host function */
162
184
static void hardware_init_host (bool enabled )
@@ -180,7 +202,8 @@ static void hardware_init_host(bool enabled)
180
202
USBOTG_H_FS -> HOST_EP_MOD = USBFS_UH_EP_TX_EN | USBFS_UH_EP_RX_EN ;
181
203
USBOTG_H_FS -> HOST_RX_DMA = (uint32_t )USBFS_RX_Buf ;
182
204
USBOTG_H_FS -> HOST_TX_DMA = (uint32_t )USBFS_TX_Buf ;
183
- USBOTG_H_FS -> INT_EN = USBFS_UIE_TRANSFER | USBFS_UIE_DETECT ;
205
+ // USBOTG_H_FS->INT_EN = USBFS_UIE_TRANSFER | USBFS_UIE_DETECT;
206
+ USBOTG_H_FS -> INT_EN = USBFS_UIE_DETECT ;
184
207
}
185
208
}
186
209
@@ -199,6 +222,7 @@ static bool hardware_start_xfer(uint8_t pid, uint8_t ep_addr, uint8_t data_toggl
199
222
USBOTG_H_FS -> HOST_TX_CTRL = (data_toggle != 0 ) ? USBFS_UH_T_TOG : 0 ;
200
223
USBOTG_H_FS -> HOST_RX_CTRL = (data_toggle != 0 ) ? USBFS_UH_R_TOG : 0 ;
201
224
USBOTG_H_FS -> HOST_EP_PID = pid_edpt ;
225
+ USBOTG_H_FS -> INT_EN |= USBFS_UIE_TRANSFER ;
202
226
USBOTG_H_FS -> INT_FG = USBFS_UIF_TRANSFER ;
203
227
return true;
204
228
}
@@ -371,19 +395,21 @@ void hcd_int_handler(uint8_t rhport, bool in_isr)
371
395
372
396
if (USBOTG_H_FS -> INT_FG & USBFS_UIF_TRANSFER )
373
397
{
398
+ // Disable transfer interrupt
399
+ USBOTG_H_FS -> INT_EN &= ~USBFS_UIE_TRANSFER ;
400
+ // Clear the flag
401
+ // USBOTG_H_FS->INT_FG = USBFS_UIF_TRANSFER;
374
402
// Copy PID and Endpoint
375
403
uint8_t pid_edpt = USBOTG_H_FS -> HOST_EP_PID ;
376
404
uint8_t status = USBOTG_H_FS -> INT_ST ;
405
+ uint8_t dev_addr = USBOTG_H_FS -> DEV_ADDR & USBFS_USB_ADDR_MASK ;
377
406
// Clear register to stop transfer
378
- USBOTG_H_FS -> HOST_EP_PID = 0 ;
379
- // Clear the flag
380
- USBOTG_H_FS -> INT_FG = USBFS_UIF_TRANSFER ;
407
+ // USBOTG_H_FS->HOST_EP_PID = 0x00;
381
408
382
409
LOG_CH32_USBFSH ("hcd_int_handler() pid_edpt=0x%02x\r\n" , pid_edpt );
383
410
384
411
uint8_t request_pid = pid_edpt >> 4 ;
385
- uint8_t response_pid = USBOTG_H_FS -> INT_ST & USBFS_UIS_H_RES_MASK ;
386
- uint8_t dev_addr = USBOTG_H_FS -> DEV_ADDR ;
412
+ uint8_t response_pid = status & USBFS_UIS_H_RES_MASK ;
387
413
uint8_t ep_addr = pid_edpt & 0x0f ;
388
414
if (request_pid == USB_PID_IN )
389
415
{
@@ -393,7 +419,7 @@ void hcd_int_handler(uint8_t rhport, bool in_isr)
393
419
usb_edpt_t * edpt_info = get_edpt_record (dev_addr , ep_addr );
394
420
if (edpt_info == NULL )
395
421
{
396
- PANIC ("\r\nget_edpt_record() returned NULL in USBHD_IRQHandler\r\n" );
422
+ PANIC ("\r\nget_edpt_record(0x%02x, 0x%02x ) returned NULL in USBHD_IRQHandler\r\n" , dev_addr , ep_addr );
397
423
}
398
424
399
425
if (status & USBFS_UIS_TOG_OK )
@@ -406,43 +432,45 @@ void hcd_int_handler(uint8_t rhport, bool in_isr)
406
432
case USB_PID_OUT :
407
433
{
408
434
uint16_t tx_len = USBOTG_H_FS -> HOST_TX_LEN ;
409
- edpt_info -> current_xfer_bufferlen -= tx_len ;
410
- edpt_info -> current_xfer_xferred_len += tx_len ;
411
- if (edpt_info -> current_xfer_bufferlen == 0 )
435
+ usb_current_xfer_info . current_xfer_bufferlen -= tx_len ;
436
+ usb_current_xfer_info . current_xfer_xferred_len += tx_len ;
437
+ if (usb_current_xfer_info . current_xfer_bufferlen == 0 )
412
438
{
413
- LOG_CH32_USBFSH ("USB_PID_OUT completed %d bytes\r\n" , edpt_info -> current_xfer_xferred_len );
414
- hcd_event_xfer_complete (dev_addr , ep_addr , edpt_info -> current_xfer_xferred_len , XFER_RESULT_SUCCESS , true);
439
+ LOG_CH32_USBFSH ("USB_PID_%s completed %d bytes\r\n" , request_pid == USB_PID_OUT ? "OUT" : "SETUP" , usb_current_xfer_info .current_xfer_xferred_len );
440
+ usb_current_xfer_info .is_busy = false;
441
+ hcd_event_xfer_complete (dev_addr , ep_addr , usb_current_xfer_info .current_xfer_xferred_len , XFER_RESULT_SUCCESS , true);
415
442
return ;
416
443
}
417
444
else
418
445
{
419
446
LOG_CH32_USBFSH ("USB_PID_OUT continue...\r\n" );
420
- edpt_info -> current_xfer_buffer += tx_len ;
447
+ usb_current_xfer_info . current_xfer_buffer += tx_len ;
421
448
uint16_t copylen = USBFS_TX_BUF_LEN ;
422
- if (copylen > edpt_info -> current_xfer_bufferlen )
449
+ if (copylen > usb_current_xfer_info . current_xfer_bufferlen )
423
450
{
424
- copylen = edpt_info -> current_xfer_bufferlen ;
451
+ copylen = usb_current_xfer_info . current_xfer_bufferlen ;
425
452
}
426
- memcpy (USBFS_TX_Buf , edpt_info -> current_xfer_buffer , copylen );
453
+ memcpy (USBFS_TX_Buf , usb_current_xfer_info . current_xfer_buffer , copylen );
427
454
hardware_start_xfer (USB_PID_OUT , ep_addr , edpt_info -> data_toggle );
428
455
return ;
429
456
}
430
457
}
431
458
case USB_PID_IN :
432
459
{
433
460
uint16_t received_len = USBOTG_H_FS -> RX_LEN ;
434
- edpt_info -> current_xfer_xferred_len += received_len ;
435
- uint16_t xferred_len = edpt_info -> current_xfer_xferred_len ;
461
+ usb_current_xfer_info . current_xfer_xferred_len += received_len ;
462
+ uint16_t xferred_len = usb_current_xfer_info . current_xfer_xferred_len ;
436
463
LOG_CH32_USBFSH ("Read %d bytes\r\n" , received_len );
437
- // if (received_len > 0 && (edpt_info-> current_xfer_buffer == NULL || edpt_info-> current_xfer_bufferlen == 0)) {
464
+ // if (received_len > 0 && (usb_current_xfer_info. current_xfer_buffer == NULL || usb_current_xfer_info. current_xfer_bufferlen == 0)) {
438
465
// PANIC("Data received but buffer not set\r\n");
439
466
// }
440
- memcpy (edpt_info -> current_xfer_buffer , USBFS_RX_Buf , received_len );
441
- edpt_info -> current_xfer_buffer += received_len ;
442
- if ((received_len < edpt_info -> max_packet_size ) || (xferred_len == edpt_info -> current_xfer_bufferlen ))
467
+ memcpy (usb_current_xfer_info . current_xfer_buffer , USBFS_RX_Buf , received_len );
468
+ usb_current_xfer_info . current_xfer_buffer += received_len ;
469
+ if ((received_len < edpt_info -> max_packet_size ) || (xferred_len == usb_current_xfer_info . current_xfer_bufferlen ))
443
470
{
444
471
// USB device sent all data.
445
472
LOG_CH32_USBFSH ("USB_PID_IN completed\r\n" );
473
+ usb_current_xfer_info .is_busy = false;
446
474
hcd_event_xfer_complete (dev_addr , ep_addr , xferred_len , XFER_RESULT_SUCCESS , true);
447
475
return ;
448
476
}
@@ -464,18 +492,24 @@ void hcd_int_handler(uint8_t rhport, bool in_isr)
464
492
{
465
493
if (response_pid == USB_PID_STALL )
466
494
{
467
- LOG_CH32_USBFSH ("Data toggle mismatched and STALL\r\n" );
495
+ LOG_CH32_USBFSH ("STALL response \r\n" );
468
496
hcd_edpt_clear_stall (0 , dev_addr , ep_addr );
469
497
edpt_info -> data_toggle = 0 ;
470
498
hardware_start_xfer (request_pid , ep_addr , 0 );
471
499
return ;
472
500
}
473
501
else if (response_pid == USB_PID_NAK )
474
502
{
475
- LOG_CH32_USBFSH ("Data toggle mismatched and NAK\r\n" );
476
- uint32_t elapsed_time = board_millis () - edpt_info -> current_xfer_packet_start_millis ;
477
- if (elapsed_time > USB_XFER_TIMEOUT_MILLIS )
503
+ LOG_CH32_USBFSH ("NAK reposense \r\n" );
504
+ uint32_t elapsed_time = board_millis () - usb_current_xfer_info . current_xfer_packet_start_millis ;
505
+ if (edpt_info -> xfer_type == TUSB_XFER_INTERRUPT && ( elapsed_time > USB_INTERRUPT_XFER_TIMEOUT_MILLIS ) )
478
506
{
507
+ usb_current_xfer_info .is_busy = false;
508
+ hcd_event_xfer_complete (dev_addr , ep_addr , 0 , XFER_RESULT_SUCCESS , true);
509
+ }
510
+ else if (elapsed_time > USB_XFER_TIMEOUT_MILLIS )
511
+ {
512
+ usb_current_xfer_info .is_busy = false;
479
513
hcd_event_xfer_complete (dev_addr , ep_addr , 0 , XFER_RESULT_FAILED , true);
480
514
}
481
515
else
@@ -487,12 +521,14 @@ void hcd_int_handler(uint8_t rhport, bool in_isr)
487
521
else if (response_pid == USB_PID_DATA0 || response_pid == USB_PID_DATA1 )
488
522
{
489
523
LOG_CH32_USBFSH ("Data toggle mismatched and DATA0/1 (not STALL). RX_LEN=%d\r\n" , USBOTG_H_FS -> RX_LEN );
524
+ usb_current_xfer_info .is_busy = false;
490
525
hcd_event_xfer_complete (dev_addr , ep_addr , 0 , XFER_RESULT_FAILED , true);
491
526
return ;
492
527
}
493
528
else
494
529
{
495
530
LOG_CH32_USBFSH ("In USBHD_IRQHandler, unexpected response PID: 0x%02x\r\n" , response_pid );
531
+ usb_current_xfer_info .is_busy = false;
496
532
hcd_event_xfer_complete (dev_addr , ep_addr , 0 , XFER_RESULT_FAILED , true);
497
533
return ;
498
534
}
@@ -510,16 +546,17 @@ bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const
510
546
uint8_t ep_addr = ep_desc -> bEndpointAddress ;
511
547
uint8_t ep_num = tu_edpt_number (ep_addr );
512
548
uint16_t max_packet_size = ep_desc -> wMaxPacketSize ;
513
- LOG_CH32_USBFSH ("hcd_edpt_open(rhport=%d, dev_addr=0x%02x, %p) EndpointAdderss=0x%02x,maxPacketSize=%d\r\n" , rhport , dev_addr , ep_desc , ep_addr , max_packet_size );
549
+ uint8_t xfer_type = ep_desc -> bmAttributes .xfer ;
550
+ LOG_CH32_USBFSH ("hcd_edpt_open(rhport=%d, dev_addr=0x%02x, %p) EndpointAdderss=0x%02x,maxPacketSize=%d,xfer_type=%d\r\n" , rhport , dev_addr , ep_desc , ep_addr , max_packet_size , xfer_type );
514
551
515
552
if (ep_num == 0x00 )
516
553
{
517
- TU_ASSERT (get_or_add_edpt_record (dev_addr , 0x00 , max_packet_size ) != NULL , false);
518
- TU_ASSERT (get_or_add_edpt_record (dev_addr , 0x80 , max_packet_size ) != NULL , false);
554
+ TU_ASSERT (get_or_add_edpt_record (dev_addr , 0x00 , max_packet_size , xfer_type ) != NULL , false);
555
+ TU_ASSERT (get_or_add_edpt_record (dev_addr , 0x80 , max_packet_size , xfer_type ) != NULL , false);
519
556
}
520
557
else
521
558
{
522
- TU_ASSERT (get_or_add_edpt_record (dev_addr , ep_addr , max_packet_size ) != NULL , false);
559
+ TU_ASSERT (get_or_add_edpt_record (dev_addr , ep_addr , max_packet_size , xfer_type ) != NULL , false);
523
560
}
524
561
525
562
update_device_address (dev_addr );
@@ -540,26 +577,36 @@ bool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *
540
577
{
541
578
(void )rhport ;
542
579
580
+ while (usb_current_xfer_info .is_busy ) {
581
+ osal_task_delay (1 );
582
+ }
583
+ usb_current_xfer_info .is_busy = true;
584
+
543
585
usb_edpt_t * edpt_info = get_edpt_record (dev_addr , ep_addr );
544
586
if (edpt_info == NULL )
545
587
{
546
588
PANIC ("get_edpt_record() returned NULL in hcd_edpt_xfer()\r\n" );
547
589
}
590
+
591
+ update_device_address (dev_addr );
592
+ tusb_speed_t device_speed = hcd_port_speed_get (rhport );
593
+ update_port_speed (device_speed );
548
594
549
- edpt_info -> current_xfer_buffer = buffer ;
550
- edpt_info -> current_xfer_bufferlen = buflen ;
551
-
552
- edpt_info -> current_xfer_packet_start_millis = board_millis ();
553
- edpt_info -> current_xfer_xferred_len = 0 ;
595
+ usb_current_xfer_info .dev_addr = dev_addr ;
596
+ usb_current_xfer_info .ep_addr = ep_addr ;
597
+ usb_current_xfer_info .current_xfer_buffer = buffer ;
598
+ usb_current_xfer_info .current_xfer_bufferlen = buflen ;
599
+ usb_current_xfer_info .current_xfer_packet_start_millis = board_millis ();
600
+ usb_current_xfer_info .current_xfer_xferred_len = 0 ;
554
601
555
602
if (tu_edpt_dir (ep_addr ) == TUSB_DIR_IN )
556
603
{
557
- LOG_CH32_USBFSH ("hcd_edpt_xfer(): READ, ep_addr=0x%02x, len=%d\r\n" , ep_addr , buflen );
604
+ LOG_CH32_USBFSH ("hcd_edpt_xfer(): READ, dev_addr=0x%02x, ep_addr=0x%02x, len=%d\r\n" , dev_addr , ep_addr , buflen );
558
605
return hardware_start_xfer (USB_PID_IN , ep_addr , edpt_info -> data_toggle );
559
606
}
560
607
else
561
608
{
562
- LOG_CH32_USBFSH ("hcd_edpt_xfer(): WRITE, ep_addr=0x%02x, len=%d\r\n" , ep_addr , buflen );
609
+ LOG_CH32_USBFSH ("hcd_edpt_xfer(): WRITE, dev_addr=0x%02x, ep_addr=0x%02x, len=%d\r\n" , dev_addr , ep_addr , buflen );
563
610
uint16_t copylen = USBFS_TX_BUF_LEN ;
564
611
if (copylen > buflen )
565
612
{
@@ -584,8 +631,20 @@ bool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)
584
631
bool hcd_setup_send (uint8_t rhport , uint8_t dev_addr , uint8_t const setup_packet [8 ])
585
632
{
586
633
(void )rhport ;
634
+
635
+ if (usb_current_xfer_info .is_busy ) {
636
+ osal_task_delay (1 );
637
+ }
638
+ usb_current_xfer_info .is_busy = true;
639
+
587
640
LOG_CH32_USBFSH ("hcd_setup_send(rhport=%d, dev_addr=0x%02x, %p)\r\n" , rhport , dev_addr , setup_packet );
588
641
642
+ // loopdelay(SystemCoreClock / 1000000 * 100);
643
+ loopdelay (1 );
644
+
645
+ update_device_address (dev_addr );
646
+ tusb_speed_t device_speed = hcd_port_speed_get (rhport );
647
+ update_port_speed (device_speed );
589
648
590
649
usb_edpt_t * edpt_info_tx = get_edpt_record (dev_addr , 0x00 );
591
650
usb_edpt_t * edpt_info_rx = get_edpt_record (dev_addr , 0x80 );
@@ -600,11 +659,13 @@ bool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet
600
659
const uint16_t setup_packet_datalen = 8 ;
601
660
memcpy (USBFS_TX_Buf , setup_packet , setup_packet_datalen );
602
661
USBOTG_H_FS -> HOST_TX_LEN = setup_packet_datalen ;
603
-
604
- edpt_info_tx -> current_xfer_packet_start_millis = board_millis ();
605
- edpt_info_tx -> current_xfer_buffer = USBFS_TX_Buf ;
606
- edpt_info_tx -> current_xfer_bufferlen = setup_packet_datalen ;
607
- edpt_info_tx -> current_xfer_xferred_len = 0 ;
662
+ uint8_t ep_addr = (setup_packet [0 ] & 0x80 ) ? 0x80 : 0x00 ;
663
+ usb_current_xfer_info .dev_addr = dev_addr ;
664
+ usb_current_xfer_info .ep_addr = ep_addr ;
665
+ usb_current_xfer_info .current_xfer_packet_start_millis = board_millis ();
666
+ usb_current_xfer_info .current_xfer_buffer = USBFS_TX_Buf ;
667
+ usb_current_xfer_info .current_xfer_bufferlen = setup_packet_datalen ;
668
+ usb_current_xfer_info .current_xfer_xferred_len = 0 ;
608
669
609
670
hardware_start_xfer (USB_PID_SETUP , 0 , 0 );
610
671
0 commit comments