mirror of https://github.com/ARMmbed/mbed-os.git
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 restartedpull/3432/head
parent
54db0a4143
commit
8af69dcbd6
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue