@@ -297,29 +297,29 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
297297 tusb_hc_data_t * hc = & host -> hc [ch_num ];
298298 uint32_t tmpreg ;
299299
300- if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_AHBERR ) == USB_OTG_HCINT_AHBERR )
300+ if ((HC -> HCINT & USB_OTG_HCINT_AHBERR ) == USB_OTG_HCINT_AHBERR )
301301 {
302302 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_AHBERR );
303303 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
304304 }
305- else if ( (USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_BBERR ) == USB_OTG_HCINT_BBERR )
305+ else if ( (HC -> HCINT & USB_OTG_HCINT_BBERR ) == USB_OTG_HCINT_BBERR )
306306 {
307307 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_BBERR );
308308 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
309309 }
310- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_ACK ) == USB_OTG_HCINT_ACK )
310+ else if ((HC -> HCINT & USB_OTG_HCINT_ACK ) == USB_OTG_HCINT_ACK )
311311 {
312312 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_ACK );
313313 }
314- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_STALL ) == USB_OTG_HCINT_STALL )
314+ else if ((HC -> HCINT & USB_OTG_HCINT_STALL ) == USB_OTG_HCINT_STALL )
315315 {
316316 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
317317 hc -> state = TUSB_CS_STALL ;
318318 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_NAK );
319319 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_STALL );
320320 tusb_otg_halt_channel (USBx , ch_num );
321321 }
322- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_DTERR ) == USB_OTG_HCINT_DTERR )
322+ else if ((HC -> HCINT & USB_OTG_HCINT_DTERR ) == USB_OTG_HCINT_DTERR )
323323 {
324324 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
325325 tusb_otg_halt_channel (USBx , ch_num );
@@ -332,18 +332,18 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
332332 /* ... */
333333 }
334334
335- if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_FRMOR ) == USB_OTG_HCINT_FRMOR )
335+ if ((HC -> HCINT & USB_OTG_HCINT_FRMOR ) == USB_OTG_HCINT_FRMOR )
336336 {
337337 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
338338 tusb_otg_halt_channel (USBx , ch_num );
339339 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_FRMOR );
340340 }
341- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_XFRC ) == USB_OTG_HCINT_XFRC )
341+ else if ((HC -> HCINT & USB_OTG_HCINT_XFRC ) == USB_OTG_HCINT_XFRC )
342342 {
343343 uint32_t HcEpType = (HC -> HCCHAR & USB_OTG_HCCHAR_EPTYP ) >> 18 ;
344344 if (USBx -> GAHBCFG & USB_OTG_GAHBCFG_DMAEN )
345345 {
346- hc -> count = hc -> size - (USBx_HC ( ch_num ) -> HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ );
346+ hc -> count = hc -> size - (HC -> HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ );
347347 }
348348
349349 hc -> state = TUSB_CS_TRANSFER_COMPLETE ;
@@ -359,7 +359,7 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
359359 }
360360 else if (HcEpType == HCCHAR_INTR )
361361 {
362- USBx_HC ( ch_num ) -> HCCHAR |= USB_OTG_HCCHAR_ODDFRM ;
362+ HC -> HCCHAR |= USB_OTG_HCCHAR_ODDFRM ;
363363 hc -> xfer_done = 1 ;
364364 tusb_on_channel_event (host , ch_num );
365365 }
@@ -370,7 +370,7 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
370370 hc -> toggle_in ^= 1U ;
371371
372372 }
373- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_CHH ) == USB_OTG_HCINT_CHH )
373+ else if ((HC -> HCINT & USB_OTG_HCINT_CHH ) == USB_OTG_HCINT_CHH )
374374 {
375375 __HAL_HCD_MASK_HALT_HC_INT (ch_num );
376376
@@ -398,19 +398,19 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
398398 }
399399
400400 /* re-activate the channel */
401- tmpreg = USBx_HC ( ch_num ) -> HCCHAR ;
401+ tmpreg = HC -> HCCHAR ;
402402 tmpreg &= ~USB_OTG_HCCHAR_CHDIS ;
403403 tmpreg |= USB_OTG_HCCHAR_CHENA ;
404- USBx_HC ( ch_num ) -> HCCHAR = tmpreg ;
404+ HC -> HCCHAR = tmpreg ;
405405 }
406406 else if (hc -> state == TUSB_CS_NAK )
407407 {
408408 //hhcd->hc[ch_num].urb_state = URB_NOTREADY;
409409 /* re-activate the channel */
410- tmpreg = USBx_HC ( ch_num ) -> HCCHAR ;
410+ tmpreg = HC -> HCCHAR ;
411411 tmpreg &= ~USB_OTG_HCCHAR_CHDIS ;
412412 tmpreg |= USB_OTG_HCCHAR_CHENA ;
413- USBx_HC ( ch_num ) -> HCCHAR = tmpreg ;
413+ HC -> HCCHAR = tmpreg ;
414414 }
415415 else
416416 {
@@ -420,15 +420,15 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
420420 tusb_on_channel_event (host , ch_num );
421421 //HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
422422 }
423- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_TXERR ) == USB_OTG_HCINT_TXERR )
423+ else if ((HC -> HCINT & USB_OTG_HCINT_TXERR ) == USB_OTG_HCINT_TXERR )
424424 {
425425 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
426426 hc -> error_count ++ ;
427427 hc -> state = TUSB_CS_TRANSACTION_ERROR ;
428428 tusb_otg_halt_channel (USBx , ch_num );
429429 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_TXERR );
430430 }
431- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_NAK ) == USB_OTG_HCINT_NAK )
431+ else if ((HC -> HCINT & USB_OTG_HCINT_NAK ) == USB_OTG_HCINT_NAK )
432432 {
433433 uint32_t HcEpType = (HC -> HCCHAR & USB_OTG_HCCHAR_EPTYP ) >> 18 ;
434434 if (HcEpType == HCCHAR_INTR )
@@ -464,15 +464,16 @@ static void tusb_otg_in_channel_handler(tusb_host_t* host, uint8_t ch_num)
464464static void tusb_otg_out_channel_handler (tusb_host_t * host , uint8_t ch_num )
465465{
466466 USB_OTG_GlobalTypeDef * USBx = GetUSB (host );
467+ USB_OTG_HostChannelTypeDef * HC = USBx_HC (ch_num );
467468 tusb_hc_data_t * hc = & host -> hc [ch_num ];
468469 uint32_t tmpreg ;
469470
470- if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_AHBERR ) == USB_OTG_HCINT_AHBERR )
471+ if ((HC -> HCINT & USB_OTG_HCINT_AHBERR ) == USB_OTG_HCINT_AHBERR )
471472 {
472473 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_AHBERR );
473474 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
474475 }
475- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_ACK ) == USB_OTG_HCINT_ACK )
476+ else if ((HC -> HCINT & USB_OTG_HCINT_ACK ) == USB_OTG_HCINT_ACK )
476477 {
477478 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_ACK );
478479
@@ -484,7 +485,7 @@ static void tusb_otg_out_channel_handler(tusb_host_t* host, uint8_t ch_num)
484485 tusb_otg_halt_channel (USBx , ch_num );
485486 }
486487 }
487- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_NYET ) == USB_OTG_HCINT_NYET )
488+ else if ((HC -> HCINT & USB_OTG_HCINT_NYET ) == USB_OTG_HCINT_NYET )
488489 {
489490 hc -> state = TUSB_CS_NYET ;
490491 hc -> do_ping = 1U ;
@@ -493,28 +494,28 @@ static void tusb_otg_out_channel_handler(tusb_host_t* host, uint8_t ch_num)
493494 tusb_otg_halt_channel (USBx , ch_num );
494495 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_NYET );
495496 }
496- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_FRMOR ) == USB_OTG_HCINT_FRMOR )
497+ else if ((HC -> HCINT & USB_OTG_HCINT_FRMOR ) == USB_OTG_HCINT_FRMOR )
497498 {
498499 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
499500 tusb_otg_halt_channel (USBx , ch_num );
500501 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_FRMOR );
501502 }
502- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_XFRC ) == USB_OTG_HCINT_XFRC )
503+ else if ((HC -> HCINT & USB_OTG_HCINT_XFRC ) == USB_OTG_HCINT_XFRC )
503504 {
504505 hc -> error_count = 0U ;
505506 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
506507 tusb_otg_halt_channel (USBx , ch_num );
507508 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_XFRC );
508509 hc -> state = TUSB_CS_TRANSFER_COMPLETE ;
509510 }
510- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_STALL ) == USB_OTG_HCINT_STALL )
511+ else if ((HC -> HCINT & USB_OTG_HCINT_STALL ) == USB_OTG_HCINT_STALL )
511512 {
512513 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_STALL );
513514 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
514515 tusb_otg_halt_channel (USBx , ch_num );
515516 hc -> state = TUSB_CS_STALL ;
516517 }
517- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_NAK ) == USB_OTG_HCINT_NAK )
518+ else if ((HC -> HCINT & USB_OTG_HCINT_NAK ) == USB_OTG_HCINT_NAK )
518519 {
519520 hc -> error_count = 0U ;
520521 hc -> state = TUSB_CS_NAK ;
@@ -527,27 +528,27 @@ static void tusb_otg_out_channel_handler(tusb_host_t* host, uint8_t ch_num)
527528 tusb_otg_halt_channel (USBx , ch_num );
528529 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_NAK );
529530 }
530- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_TXERR ) == USB_OTG_HCINT_TXERR )
531+ else if ((HC -> HCINT & USB_OTG_HCINT_TXERR ) == USB_OTG_HCINT_TXERR )
531532 {
532533 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
533534 tusb_otg_halt_channel (USBx , ch_num );
534535 hc -> state = TUSB_CS_TRANSACTION_ERROR ;
535536 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_TXERR );
536537 }
537- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_DTERR ) == USB_OTG_HCINT_DTERR )
538+ else if ((HC -> HCINT & USB_OTG_HCINT_DTERR ) == USB_OTG_HCINT_DTERR )
538539 {
539540 __HAL_HCD_UNMASK_HALT_HC_INT (ch_num );
540541 tusb_otg_halt_channel (USBx , ch_num );
541542 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_NAK );
542543 __HAL_HCD_CLEAR_HC_INT (ch_num , USB_OTG_HCINT_DTERR );
543544 hc -> state = TUSB_CS_DT_ERROR ;
544545 }
545- else if ((USBx_HC ( ch_num ) -> HCINT & USB_OTG_HCINT_CHH ) == USB_OTG_HCINT_CHH )
546+ else if ((HC -> HCINT & USB_OTG_HCINT_CHH ) == USB_OTG_HCINT_CHH )
546547 {
547548 __HAL_HCD_MASK_HALT_HC_INT (ch_num );
548549
549550 if (hc -> state == TUSB_CS_TRANSFER_COMPLETE ){
550- uint32_t HcEpType = (USBx_HC ( ch_num ) -> HCCHAR & USB_OTG_HCCHAR_EPTYP ) >> 18 ;
551+ uint32_t HcEpType = (HC -> HCCHAR & USB_OTG_HCCHAR_EPTYP ) >> 18 ;
551552 if (HcEpType == HCCHAR_BULK ){
552553 hc -> toggle_out ^= 1U ;
553554 }
@@ -556,10 +557,10 @@ static void tusb_otg_out_channel_handler(tusb_host_t* host, uint8_t ch_num)
556557 else if (hc -> state == TUSB_CS_NAK )
557558 {
558559 /* re-activate the channel */
559- //tmpreg = USBx_HC(ch_num) ->HCCHAR;
560+ //tmpreg = HC ->HCCHAR;
560561 //tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
561562 //tmpreg |= USB_OTG_HCCHAR_CHENA;
562- //USBx_HC(ch_num) ->HCCHAR = tmpreg;
563+ //HC ->HCCHAR = tmpreg;
563564 //hhcd->hc[ch_num].urb_state = URB_NOTREADY;
564565 }
565566 else if (hc -> state == TUSB_CS_NYET )
@@ -585,10 +586,10 @@ static void tusb_otg_out_channel_handler(tusb_host_t* host, uint8_t ch_num)
585586 }
586587
587588 /* re-activate the channel */
588- tmpreg = USBx_HC ( ch_num ) -> HCCHAR ;
589+ tmpreg = HC -> HCCHAR ;
589590 tmpreg &= ~USB_OTG_HCCHAR_CHDIS ;
590591 tmpreg |= USB_OTG_HCCHAR_CHENA ;
591- USBx_HC ( ch_num ) -> HCCHAR = tmpreg ;
592+ HC -> HCCHAR = tmpreg ;
592593 }
593594 else
594595 {
@@ -858,6 +859,7 @@ void tusb_otg_host_handler(tusb_host_t* host)
858859 tusb_otg_send_data (host , ch_num );
859860 break ;
860861 }
862+ ch_num ++ ;
861863 mask >>=1 ;
862864 }
863865 if (!host -> ptx_pending ){
@@ -874,6 +876,7 @@ void tusb_otg_host_handler(tusb_host_t* host)
874876 tusb_otg_send_data (host , ch_num );
875877 break ;
876878 }
879+ ch_num ++ ;
877880 mask >>=1 ;
878881 }
879882 if (!host -> nptx_pending ){
@@ -1044,15 +1047,21 @@ static void tusb_otg_send_data(tusb_host_t* host, uint8_t hc_num)
10441047 tusb_hc_data_t * hc = & host -> hc [hc_num ];
10451048 uint32_t i ;
10461049 uint32_t act_len ;
1050+ uint32_t req_size ;
10471051 uint32_t * pSrc = (uint32_t * )hc -> ch_buf ;
10481052 uint32_t len = hc -> size ;
10491053 // len = (len+3)/4;
10501054 if (xfer_type == EP_TYPE_CTRL || xfer_type == EP_TYPE_BULK ){
1051- act_len = USBx -> HNPTXSTS & 0xFFFFU ;
1055+ act_len = USBx -> HNPTXSTS ;
10521056 }else {
1053- act_len = USBx_HOST -> HPTXSTS & 0xFFFFU ;
1054- }
1055- act_len = ( act_len * 4 / mps ) * mps ;
1057+ act_len = USBx_HOST -> HPTXSTS ;
1058+ }
1059+ // calculate useful FIFO size, depend on two factor
1060+ // 1. remain [request queue space] * [max packet size]
1061+ req_size = ((act_len & 0xff0000 ) >> 16 ) * mps ;
1062+ // 2. remain FIFO buffer size, round to max packet size boundary
1063+ act_len = ( (act_len & 0xffff ) * 4 / mps ) * mps ;
1064+ if (act_len > req_size ) act_len = req_size ;
10561065 if (len > act_len ){
10571066 len = len - act_len ;
10581067 }else {
@@ -1064,6 +1073,7 @@ static void tusb_otg_send_data(tusb_host_t* host, uint8_t hc_num)
10641073 USBx_DFIFO ((uint32_t )hc_num ) = * ((__packed uint32_t * )pSrc );
10651074 pSrc ++ ;
10661075 }
1076+
10671077 hc -> ch_buf = (uint8_t * )pSrc ;
10681078 hc -> size = len ;
10691079 if (len ){
@@ -1074,6 +1084,9 @@ static void tusb_otg_send_data(tusb_host_t* host, uint8_t hc_num)
10741084 USBx -> GINTMSK |= USB_OTG_GINTMSK_PTXFEM ;
10751085 host -> ptx_pending |= (1 <<hc_num );
10761086 }
1087+ }else {
1088+ host -> nptx_pending &= ~(1 <<hc_num );
1089+ host -> ptx_pending &= ~(1 <<hc_num );
10771090 }
10781091}
10791092
0 commit comments