Skip to content

Commit ee2ebc8

Browse files
committed
check both FIFO size ans request queue size when transmit host channel data
1 parent 2bd4671 commit ee2ebc8

1 file changed

Lines changed: 48 additions & 35 deletions

File tree

usb_stack/src/teeny_usb_stm32_otg_host.c

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
464464
static 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

Comments
 (0)