STM32 HAL HCD : USBHOST changes for f4,f2,l4,f7

- reset toggle_out , toggle_in at init
-  in/out toggle in on ctrl endpoint
- remove call back when transmission restarted
pull/3432/head
Michel Jaouen 2016-12-05 15:49:12 +01:00
parent 54db0a4143
commit 8af69dcbd6
8 changed files with 176 additions and 30 deletions

View File

@ -200,7 +200,10 @@ HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].ep_num = epnum & 0x7FU; hhcd->hc[ch_num].ep_num = epnum & 0x7FU;
hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U); hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U);
hhcd->hc[ch_num].speed = speed; hhcd->hc[ch_num].speed = speed;
/* reset to 0 */
hhcd->hc[ch_num].toggle_out = 0;
hhcd->hc[ch_num].toggle_in = 0;
status = USB_HC_Init(hhcd->Instance, status = USB_HC_Init(hhcd->Instance,
ch_num, ch_num,
epnum, epnum,
@ -335,7 +338,26 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
uint16_t length, uint16_t length,
uint8_t do_ping) uint8_t do_ping)
{ {
hhcd->hc[ch_num].ep_is_in = direction; if ((hhcd->hc[ch_num].ep_is_in != direction)) {
if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL)){
/* reconfigure the endpoint !!! from tx -> rx, and rx ->tx */
USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
if (direction)
{
USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR |= 1 << 15;
}
else
{
USBx_HC(ch_num)->HCINTMSK &= ~USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR &= ~(1 << 15);
}
hhcd->hc[ch_num].ep_is_in = direction;
/* if reception put toggle_in to 1 */
if (direction == 1) hhcd->hc[ch_num].toggle_in=1;
}
}
hhcd->hc[ch_num].ep_type = ep_type; hhcd->hc[ch_num].ep_type = ep_type;
if(token == 0) if(token == 0)
@ -372,6 +394,18 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].do_ping = do_ping; hhcd->hc[ch_num].do_ping = do_ping;
} }
} }
else if ((token == 1) && (direction == 1))
{
if( hhcd->hc[ch_num].toggle_in == 0)
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
}
else
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
}
}
break; break;
case EP_TYPE_BULK: case EP_TYPE_BULK:
@ -402,7 +436,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].data_pid = HC_PID_DATA1; hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
} }
} }
break; break;
case EP_TYPE_INTR: case EP_TYPE_INTR:
if(direction == 0U) if(direction == 0U)
@ -429,7 +463,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
} }
} }
break; break;
case EP_TYPE_ISOC: case EP_TYPE_ISOC:
hhcd->hc[ch_num].data_pid = HC_PID_DATA0; hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
break; break;
@ -866,6 +900,8 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
{ {
int reactivate = 0;
__HAL_HCD_MASK_HALT_HC_INT(chnum); __HAL_HCD_MASK_HALT_HC_INT(chnum);
if(hhcd->hc[chnum].state == HC_XFRC) if(hhcd->hc[chnum].state == HC_XFRC)
@ -896,9 +932,10 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
tmpreg &= ~USB_OTG_HCCHAR_CHDIS; tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
tmpreg |= USB_OTG_HCCHAR_CHENA; tmpreg |= USB_OTG_HCCHAR_CHENA;
USBx_HC(chnum)->HCCHAR = tmpreg; USBx_HC(chnum)->HCCHAR = tmpreg;
reactivate = 1;
} }
__HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); if (reactivate == 0) HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)

View File

@ -1518,6 +1518,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe
/* Write packet into the Tx FIFO. */ /* Write packet into the Tx FIFO. */
USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0); USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
hc->xfer_count = hc->xfer_len;
} }
} }

View File

@ -204,7 +204,10 @@ HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].ep_num = epnum & 0x7FU; hhcd->hc[ch_num].ep_num = epnum & 0x7FU;
hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U); hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U);
hhcd->hc[ch_num].speed = speed; hhcd->hc[ch_num].speed = speed;
/* reset to 0 */
hhcd->hc[ch_num].toggle_out = 0;
hhcd->hc[ch_num].toggle_in = 0;
status = USB_HC_Init(hhcd->Instance, status = USB_HC_Init(hhcd->Instance,
ch_num, ch_num,
epnum, epnum,
@ -339,9 +342,27 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
uint16_t length, uint16_t length,
uint8_t do_ping) uint8_t do_ping)
{ {
hhcd->hc[ch_num].ep_is_in = direction; if ((hhcd->hc[ch_num].ep_is_in != direction)) {
hhcd->hc[ch_num].ep_type = ep_type; if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL)){
/* reconfigure the endpoint !!! from tx -> rx, and rx ->tx */
USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
if (direction)
{
USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR |= 1 << 15;
}
else
{
USBx_HC(ch_num)->HCINTMSK &= ~USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR &= ~(1 << 15);
}
hhcd->hc[ch_num].ep_is_in = direction;
/* if reception put toggle_in to 1 */
if (direction == 1) hhcd->hc[ch_num].toggle_in=1;
}
}
hhcd->hc[ch_num].ep_type = ep_type;
if(token == 0U) if(token == 0U)
{ {
hhcd->hc[ch_num].data_pid = HC_PID_SETUP; hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
@ -376,6 +397,17 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].do_ping = do_ping; hhcd->hc[ch_num].do_ping = do_ping;
} }
} }
else if ((token == 1) && (direction == 1))
{
if( hhcd->hc[ch_num].toggle_in == 0)
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
}
else
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
}
}
break; break;
case EP_TYPE_BULK: case EP_TYPE_BULK:
@ -870,20 +902,21 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
{ {
int reactivate=0;
__HAL_HCD_MASK_HALT_HC_INT(chnum); __HAL_HCD_MASK_HALT_HC_INT(chnum);
if(hhcd->hc[chnum].state == HC_XFRC) if(hhcd->hc[chnum].state == HC_XFRC)
{ {
hhcd->hc[chnum].urb_state = URB_DONE; hhcd->hc[chnum].urb_state = URB_DONE;
} }
else if (hhcd->hc[chnum].state == HC_STALL) else if (hhcd->hc[chnum].state == HC_STALL)
{ {
hhcd->hc[chnum].urb_state = URB_STALL; hhcd->hc[chnum].urb_state = URB_STALL;
} }
else if((hhcd->hc[chnum].state == HC_XACTERR) || else if((hhcd->hc[chnum].state == HC_XACTERR) ||
(hhcd->hc[chnum].state == HC_DATATGLERR)) (hhcd->hc[chnum].state == HC_DATATGLERR))
{ {
if(hhcd->hc[chnum].ErrCnt++ > 3U) if(hhcd->hc[chnum].ErrCnt++ > 3U)
{ {
@ -894,15 +927,16 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
{ {
hhcd->hc[chnum].urb_state = URB_NOTREADY; hhcd->hc[chnum].urb_state = URB_NOTREADY;
} }
/* re-activate the channel */ /* re-activate the channel */
tmpreg = USBx_HC(chnum)->HCCHAR; tmpreg = USBx_HC(chnum)->HCCHAR;
tmpreg &= ~USB_OTG_HCCHAR_CHDIS; tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
tmpreg |= USB_OTG_HCCHAR_CHENA; tmpreg |= USB_OTG_HCCHAR_CHENA;
USBx_HC(chnum)->HCCHAR = tmpreg; USBx_HC(chnum)->HCCHAR = tmpreg;
reactivate = 1;
} }
__HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); if (reactivate == 0) HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)

View File

@ -1540,6 +1540,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe
/* Write packet into the Tx FIFO. */ /* Write packet into the Tx FIFO. */
USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0); USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
hc->xfer_count = hc->xfer_len;
} }
} }

View File

@ -200,6 +200,9 @@ HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].ep_num = epnum & 0x7F; hhcd->hc[ch_num].ep_num = epnum & 0x7F;
hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80); hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80);
hhcd->hc[ch_num].speed = speed; hhcd->hc[ch_num].speed = speed;
/* reset to 0 */
hhcd->hc[ch_num].toggle_out = 0;
hhcd->hc[ch_num].toggle_in = 0;
status = USB_HC_Init(hhcd->Instance, status = USB_HC_Init(hhcd->Instance,
ch_num, ch_num,
@ -337,9 +340,27 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
uint16_t length, uint16_t length,
uint8_t do_ping) uint8_t do_ping)
{ {
hhcd->hc[ch_num].ep_is_in = direction; if ((hhcd->hc[ch_num].ep_is_in != direction)) {
hhcd->hc[ch_num].ep_type = ep_type; if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL)){
/* reconfigure the endpoint !!! from tx -> rx, and rx ->tx */
USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
if (direction)
{
USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR |= 1 << 15;
}
else
{
USBx_HC(ch_num)->HCINTMSK &= ~USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR &= ~(1 << 15);
}
hhcd->hc[ch_num].ep_is_in = direction;
/* if reception put toggle_in to 1 */
if (direction == 1) hhcd->hc[ch_num].toggle_in=1;
}
}
hhcd->hc[ch_num].ep_type = ep_type;
if(token == 0) if(token == 0)
{ {
hhcd->hc[ch_num].data_pid = HC_PID_SETUP; hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
@ -348,7 +369,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
{ {
hhcd->hc[ch_num].data_pid = HC_PID_DATA1; hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
} }
/* Manage Data Toggle */ /* Manage Data Toggle */
switch(ep_type) switch(ep_type)
{ {
@ -359,7 +380,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
{ /* For Status OUT stage, Length==0, Status Out PID = 1 */ { /* For Status OUT stage, Length==0, Status Out PID = 1 */
hhcd->hc[ch_num].toggle_out = 1; hhcd->hc[ch_num].toggle_out = 1;
} }
/* Set the Data Toggle bit as per the Flag */ /* Set the Data Toggle bit as per the Flag */
if ( hhcd->hc[ch_num].toggle_out == 0) if ( hhcd->hc[ch_num].toggle_out == 0)
{ /* Put the PID 0 */ { /* Put the PID 0 */
@ -374,8 +395,20 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].do_ping = do_ping; hhcd->hc[ch_num].do_ping = do_ping;
} }
} }
else if ((token == 1) && (direction == 1))
{
if( hhcd->hc[ch_num].toggle_in == 0)
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
}
else
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
}
}
break; break;
case EP_TYPE_BULK: case EP_TYPE_BULK:
if(direction == 0) if(direction == 0)
{ {
@ -404,7 +437,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].data_pid = HC_PID_DATA1; hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
} }
} }
break; break;
case EP_TYPE_INTR: case EP_TYPE_INTR:
if(direction == 0) if(direction == 0)
@ -870,7 +903,8 @@ static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
{ {
__HAL_HCD_MASK_HALT_HC_INT(chnum); int reactivate = 0;
__HAL_HCD_MASK_HALT_HC_INT(chnum);
if(hhcd->hc[chnum].state == HC_XFRC) if(hhcd->hc[chnum].state == HC_XFRC)
{ {
@ -894,15 +928,16 @@ static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
{ {
hhcd->hc[chnum].urb_state = URB_NOTREADY; hhcd->hc[chnum].urb_state = URB_NOTREADY;
} }
/* re-activate the channel */ /* re-activate the channel */
tmpreg = USBx_HC(chnum)->HCCHAR; tmpreg = USBx_HC(chnum)->HCCHAR;
tmpreg &= ~USB_OTG_HCCHAR_CHDIS; tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
tmpreg |= USB_OTG_HCCHAR_CHENA; tmpreg |= USB_OTG_HCCHAR_CHENA;
USBx_HC(chnum)->HCCHAR = tmpreg; USBx_HC(chnum)->HCCHAR = tmpreg;
reactivate = 1;
} }
__HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); if (reactivate == 0 )HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)

View File

@ -1520,6 +1520,8 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe
/* Write packet into the Tx FIFO. */ /* Write packet into the Tx FIFO. */
USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0); USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
hc->xfer_count = hc->xfer_len;
} }
} }

View File

@ -206,6 +206,9 @@ HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].ep_num = epnum & 0x7F; hhcd->hc[ch_num].ep_num = epnum & 0x7F;
hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80); hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80);
hhcd->hc[ch_num].speed = speed; hhcd->hc[ch_num].speed = speed;
/* reset to 0 */
hhcd->hc[ch_num].toggle_out = 0;
hhcd->hc[ch_num].toggle_in = 0;
status = USB_HC_Init(hhcd->Instance, status = USB_HC_Init(hhcd->Instance,
ch_num, ch_num,
@ -343,8 +346,26 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
uint16_t length, uint16_t length,
uint8_t do_ping) uint8_t do_ping)
{ {
hhcd->hc[ch_num].ep_is_in = direction; if ((hhcd->hc[ch_num].ep_is_in != direction)) {
hhcd->hc[ch_num].ep_type = ep_type; if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL)){
/* reconfigure the endpoint !!! from tx -> rx, and rx ->tx */
USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
if (direction)
{
USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR |= 1 << 15;
}
else
{
USBx_HC(ch_num)->HCINTMSK &= ~USB_OTG_HCINTMSK_BBERRM;
USBx_HC(ch_num)->HCCHAR &= ~(1 << 15);
}
hhcd->hc[ch_num].ep_is_in = direction;
/* if reception put toggle_in to 1 */
if (direction == 1) hhcd->hc[ch_num].toggle_in=1;
}
}
hhcd->hc[ch_num].ep_type = ep_type;
if(token == 0) if(token == 0)
{ {
@ -380,6 +401,17 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
hhcd->hc[ch_num].do_ping = do_ping; hhcd->hc[ch_num].do_ping = do_ping;
} }
} }
else if ((token == 1) && (direction == 1))
{
if( hhcd->hc[ch_num].toggle_in == 0)
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
}
else
{
hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
}
}
break; break;
case EP_TYPE_BULK: case EP_TYPE_BULK:
@ -878,6 +910,7 @@ static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
{ {
int reactivate = 0;
__HAL_HCD_MASK_HALT_HC_INT(chnum); __HAL_HCD_MASK_HALT_HC_INT(chnum);
if(hhcd->hc[chnum].state == HC_XFRC) if(hhcd->hc[chnum].state == HC_XFRC)
@ -907,10 +940,11 @@ static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
tmpreg = USBx_HC(chnum)->HCCHAR; tmpreg = USBx_HC(chnum)->HCCHAR;
tmpreg &= ~USB_OTG_HCCHAR_CHDIS; tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
tmpreg |= USB_OTG_HCCHAR_CHENA; tmpreg |= USB_OTG_HCCHAR_CHENA;
USBx_HC(chnum)->HCCHAR = tmpreg; USBx_HC(chnum)->HCCHAR = tmpreg;
reactivate = 1;
} }
__HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); if (reactivate == 0) HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
} }
else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)

View File

@ -1399,6 +1399,8 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe
/* Write packet into the Tx FIFO. */ /* Write packet into the Tx FIFO. */
USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0); USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
hc->xfer_count = hc->xfer_len;
} }
} }