Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
/**
* @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;
}