uint32_t USB_OTG_USBH_handle_hc_n_Out_ISR(USB_OTG_CORE_HANDLE *pdev, uint32_t num) { USB_OTG_HCINTn_TypeDef hcint; USB_OTG_HCGINTMSK_TypeDef hcintmsk; USB_OTG_HC_REGS *hcreg; USB_OTG_HCCHAR_TypeDef hcchar; int ret = 0; hcreg = pdev->regs.HC_REGS[num]; hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT); hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCGINTMSK); hcint.d32 = hcint.d32 &hcintmsk.d32; hcchar.d32 = USB_OTG_READ_REG32(&hcreg->HCCHAR); // USB_OTG_WRITE_REG32(&hcreg->HCINT, hcint.d32|0x7f); //clear 0-10bit if (hcint.b.ahberr) { CLEAR_HC_INT(hcreg, ahberr); UNMASK_HOST_INT_CHH(num); } else if (hcint.b.ack) { CLEAR_HC_INT(hcreg, ack); } else if (hcint.b.xfercompl) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg, xfercompl); pdev->host.HC_Status[num] = HC_XFRC; } else if (hcint.b.stall) { CLEAR_HC_INT(hcreg, stall); UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_STALL; } else if (hcint.b.nak) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg, nak); pdev->host.HC_Status[num] = HC_NAK; } else if (hcint.b.xacterr) { UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); pdev->host.ErrCnt[num]++; pdev->host.HC_Status[num] = HC_XACTERR; CLEAR_HC_INT(hcreg, xacterr); } else if (hcint.b.nyet) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg, nyet); pdev->host.HC_Status[num] = HC_NYET; } else if (hcint.b.datatglerr) { UNMASK_HOST_INT_CHH(num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg, nak); pdev->host.HC_Status[num] = HC_DATATGLERR; CLEAR_HC_INT(hcreg, datatglerr); } else if (hcint.b.chhltd) { MASK_HOST_INT_CHH(num); ret = 1; if (pdev->host.HC_Status[num] == HC_XFRC) { pdev->host.URB_State[num] = URB_DONE; if (hcchar.b.eptype == EP_TYPE_BULK) { if (pdev->host.hc[num].packet_count & 1) pdev->host.hc[num].toggle_out ^= 1; } } else if (pdev->host.HC_Status[num] == HC_NAK) { pdev->host.URB_State[num] = URB_NOTREADY; } else if (pdev->host.HC_Status[num] == HC_NYET) { if (pdev->host.hc[num].do_ping == 1) { USB_OTG_HC_DoPing(pdev, num); } pdev->host.URB_State[num] = URB_NOTREADY; } else if (pdev->host.HC_Status[num] == HC_STALL) { pdev->host.URB_State[num] = URB_STALL; } else if (pdev->host.HC_Status[num] == HC_XACTERR) { if (pdev->host.ErrCnt[num] == 3) { pdev->host.URB_State[num] = URB_ERROR; pdev->host.ErrCnt[num] = 0; } }else ret = 0; CLEAR_HC_INT(hcreg, chhltd); } else { p_err("unkown out isr:%08x\n", hcint.d32); } return ret; }
uint32_t USB_OTG_USBH_handle_hc_n_Out_ISR(USB_OTG_CORE_HANDLE *pdev, uint32_t num) { USB_OTG_HCINTn_TypeDef hcint; USB_OTG_HCGINTMSK_TypeDef hcintmsk; USB_OTG_HC_REGS *hcreg; USB_OTG_HCCHAR_TypeDef hcchar; int ret = 0; hcreg = pdev->regs.HC_REGS[num]; hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT); hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCGINTMSK); hcint.d32 = hcint.d32 &hcintmsk.d32; hcchar.d32 = USB_OTG_READ_REG32(&hcreg->HCCHAR); USB_OTG_WRITE_REG32(&hcreg->HCINT, hcint.d32 | 0x7f); //clear 0-10bit if (hcint.b.chhltd) { hcint.b.chhltd = 0; ret = 1; if (pdev->host.HC_Status[num] == HC_XFRC) { pdev->host.URB_State[num] = URB_DONE; if (hcchar.b.eptype == EP_TYPE_BULK) { if (pdev->host.hc[num].packet_count &1) pdev->host.hc[num].toggle_out ^= 1; } } else if (pdev->host.HC_Status[num] == HC_NAK) { pdev->host.URB_State[num] = URB_NOTREADY; } else if (pdev->host.HC_Status[num] == HC_NYET) { if (pdev->host.hc[num].do_ping == 1) { USB_OTG_HC_DoPing(pdev, num); } pdev->host.URB_State[num] = URB_NOTREADY; } else if (pdev->host.HC_Status[num] == HC_STALL) { pdev->host.URB_State[num] = URB_STALL; } else if (pdev->host.HC_Status[num] == HC_XACTERR) { if (pdev->host.ErrCnt[num] == 3) { pdev->host.URB_State[num] = URB_ERROR; pdev->host.ErrCnt[num] = 0; } } else if (pdev->host.HC_Status[num] == HC_HALTED) { pdev->host.URB_State[num] = URB_ERROR; pdev->host.ErrCnt[num] = 0; } else{ ret = 0; p_err("unkown out chhltd:%d\n", pdev->host.HC_Status[num]); } } if (hcint.b.xfercompl) { hcint.b.xfercompl = 0; if (num > 0) pdev->host.ErrCnt[num] = 0; USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_XFRC; } if(hcint.d32 == 0) goto end; if (hcint.b.ahberr) { p_err("ahberr in:%08x\n", USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCDMA)) ; } if (hcint.b.ack) { p_err("ack\n"); } if (hcint.b.stall) { USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_STALL; } if (hcint.b.nak) { pdev->host.ErrCnt[num] = 0; USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_NAK; } if (hcint.b.xacterr) { USB_OTG_HC_Halt(pdev, num); pdev->host.ErrCnt[num]++; pdev->host.HC_Status[num] = HC_XACTERR; } if (hcint.b.nyet) { pdev->host.ErrCnt[num] = 0; USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_NYET; } if (hcint.b.datatglerr) { USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_DATATGLERR; } end: return ret; }
/** * @brief USB_OTG_USBH_handle_hc_n_Out_ISR * Handles interrupt for a specific Host Channel * @param pdev: Selected device * @param hc_num: Channel number * @retval status */ uint32_t USB_OTG_USBH_handle_hc_n_Out_ISR (USB_OTG_CORE_HANDLE *pdev , uint32_t num) { USB_OTG_HCINTn_TypeDef hcint; USB_OTG_HCINTMSK_TypeDef hcintmsk; USB_OTG_HC_REGS *hcreg; USB_OTG_HCCHAR_TypeDef hcchar; hcreg = pdev->regs.HC_REGS[num]; hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT); hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCINTMSK); hcint.d32 = hcint.d32 & hcintmsk.d32; hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCCHAR); #ifdef USE_HOST_MODE if (hcint.b.ahberr) { CLEAR_HC_INT(hcreg ,ahberr); UNMASK_HOST_INT_CHH (num); } else if (hcint.b.ack) { CLEAR_HC_INT(hcreg , ack); } else if (hcint.b.frmovrun) { UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg ,frmovrun); } else if (hcint.b.xfercompl) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg , xfercompl); pdev->host.HC_Status[num] = HC_XFRC; } else if (hcint.b.stall) { CLEAR_HC_INT(hcreg , stall); UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); pdev->host.HC_Status[num] = HC_STALL; } else if (hcint.b.nak) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg , nak); pdev->host.HC_Status[num] = HC_NAK; } else if (hcint.b.xacterr) { UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); pdev->host.ErrCnt[num] ++; pdev->host.HC_Status[num] = HC_XACTERR; CLEAR_HC_INT(hcreg , xacterr); } else if (hcint.b.nyet) { pdev->host.ErrCnt[num] = 0; UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg , nyet); pdev->host.HC_Status[num] = HC_NYET; } else if (hcint.b.datatglerr) { UNMASK_HOST_INT_CHH (num); USB_OTG_HC_Halt(pdev, num); CLEAR_HC_INT(hcreg , nak); pdev->host.HC_Status[num] = HC_DATATGLERR; CLEAR_HC_INT(hcreg , datatglerr); } else if (hcint.b.chhltd) { MASK_HOST_INT_CHH (num); if(pdev->host.HC_Status[num] == HC_XFRC) { pdev->host.URB_State[num] = URB_DONE; if (hcchar.b.eptype == EP_TYPE_BULK) { pdev->host.hc[num].toggle_out ^= 1; } } else if(pdev->host.HC_Status[num] == HC_NAK) { pdev->host.URB_State[num] = URB_NOTREADY; } else if(pdev->host.HC_Status[num] == HC_NYET) { if(pdev->host.hc[num].do_ping == 1) { USB_OTG_HC_DoPing(pdev, num); } pdev->host.URB_State[num] = URB_NOTREADY; } else if(pdev->host.HC_Status[num] == HC_STALL) { pdev->host.URB_State[num] = URB_STALL; } else if(pdev->host.HC_Status[num] == HC_XACTERR) { if (pdev->host.ErrCnt[num] == 3) { pdev->host.URB_State[num] = URB_ERROR; pdev->host.ErrCnt[num] = 0; } } CLEAR_HC_INT(hcreg , chhltd); } #endif return 1; }