⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbloopbacklib.c

📁 VxWorks BSP for S3C2510A
💻 C
📖 第 1 页 / 共 4 页
字号:
  /* Return immediately if the output IRP is already in use. */  if (pLoopbackDev->bulkLoopbackInProgress)	return OK;  /* mark the bulk loopback tarnsfer as in progress */  pLoopbackDev->bulkLoopbackInProgress = TRUE;  while(iteration-- != 0)  {    /* Prepare the IRP for bulk out tarnsfer */    pIrp = &pLoopbackDev->bulkOutIrp;      /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));      pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = 0/*USB_LOOPBACK_TIMEOUT*/;    pIrp->transferLen = loopbackLen;    pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_OUT;    pIrp->bfrList [0].pBfr = (UCHAR *)outBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;        /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->bulkOutPipeHandle, pIrp) != OK)    {      pLoopbackDev->bulkLoopbackInProgress = FALSE;      bulkOutErrors++;      printf("usbdTransfer failed -Bulk Out \n");      return ERROR;    }  	  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->bulkLoopbackSem,/*USB_LOOPBACK_TIMEOUT + 100*/OSS_BLOCK ) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->bulkLoopbackSem);      printf("OSS_SEM_TAKE failed -Bulk Out \n");      pLoopbackDev->bulkLoopbackInProgress = FALSE;      bulkOutErrors++;      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0   	if (pIrp->result != OK)  	{  	  printf("pIrp->result is %x\n",pIrp->result);      bulkOutErrors++;      OSS_SEM_GIVE (pLoopbackDev->bulkLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif        /* Prepare the IRP for bulk IN transfer */    pIrp = &pLoopbackDev->bulkInIrp;      /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));      pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = 0/*USB_LOOPBACK_TIMEOUT*/;    pIrp->transferLen = loopbackLen;      pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_IN;    pIrp->bfrList [0].pBfr = (UCHAR *)inBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;    /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->bulkInPipeHandle, pIrp) != OK)  	{      pLoopbackDev->bulkLoopbackInProgress = FALSE;      bulkInErrors++;      printf("usbdTransfer failed -Bulk In \n");      return ERROR;    }  	  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->bulkLoopbackSem,OSS_BLOCK /*USB_LOOPBACK_TIMEOUT + 100*/) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->bulkLoopbackSem);      pLoopbackDev->bulkLoopbackInProgress = FALSE;      bulkInErrors++;      printf("OSS_SEM_TAKE failed -Bulk In \n");      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0  	if (pIrp->result != OK)  	{  	  bulkInErrors++;  	  OSS_SEM_GIVE (pLoopbackDev->bulkLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif    /* Match the inBfr with outBfr for equality */    for (count = 0; count < loopbackLen; count++)    {    	if( inBfr[count]!= outBfr[count])    	{    		bulkPacketMismatch++;      }    }  }/* While loop */  printf("\nBulk loopback report:\n");  printf("Bulk-Out errors:%d\n",bulkOutErrors);  printf("Bulk-In errors:%d\n",bulkInErrors);  printf("Bulk-Loopback packet mismatch:%d\n",bulkPacketMismatch);    /* Update the stats in the pLoopbackDevice */  pLoopbackDev->deviceStat.bulkOutErrors += bulkOutErrors;  pLoopbackDev->deviceStat.bulkInErrors += bulkInErrors;  pLoopbackDev->deviceStat.bulkPacketMismatch += bulkPacketMismatch;  pLoopbackDev->bulkLoopbackInProgress = FALSE;  return OK;}/***************************************************************************** usbLoopbackInt - initiates loopback data transmission for interrupt endpoint.** If the interrupt loopback is not already in use, this function populates the* interrupt out and IN IRP with the buffer and submits the IRPs for* requested number of times.** This function assumes that the outBfr and inBfr are allocated with enough size to* hold the loopbackLen data.Also the first two bytes of buffer contains the* length of whole buffer including these length field** RETURNS: OK, or ERROR if unable to initiate transmission*/LOCAL int usbLoopbackInt(USB_LOOPBACK_CHAN *pChan,char *outBfr,                          char *inBfr,int loopbackLen,int iteration){  pUSB_LOOPBACK_DEVICE pLoopbackDev = (pUSB_LOOPBACK_DEVICE) pChan;  pUSB_IRP pIrp;  UINT16 count;  UINT32 intOutErrors =0;  UINT32 intInErrors =0;  UINT32 intPacketMismatch =0;  /* Return if Interrupt looop back is not supported on the device */  if (!USB_IS_INT_LOOPBACK_SUPPORTED(pLoopbackDev->protocol))  {    printf("Interrupt loopback is not supported on the device!!!\n");    return ENOSYS;  }    /* validate the loopback buffer */  if ((outBfr == NULL) ||(inBfr == NULL))  {    printf ("Invalid bulk loopback buffers!!\n" );  	return S_usbLoopbackLib_BAD_PARAM;  }    /* Validate the length */  if(loopbackLen < 2 )  {  	printf ("Invalid bulk loopback length!!\n" );  	return S_usbLoopbackLib_BAD_PARAM;  }    if (loopbackLen > USB_LOOPBACK_MAX_LEN)  {    loopbackLen = USB_LOOPBACK_MAX_LEN;  }    /* Return immediately if the output IRP is already in use. */  if (pLoopbackDev->intLoopbackInProgress)	return OK;  /* mark the int loopback tarnsfer as in progress */  pLoopbackDev->intLoopbackInProgress = TRUE;  while(iteration-- != 0)  {    /* Prepare the IRP for bulk out tarnsfer */    pIrp = &pLoopbackDev->intOutIrp;    /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));    pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = USB_TIMEOUT_NONE;    pIrp->transferLen = loopbackLen;    pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_OUT;    pIrp->bfrList [0].pBfr = (UCHAR *)outBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;    /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->intOutPipeHandle, pIrp) != OK)    {      pLoopbackDev->intLoopbackInProgress = FALSE;      intOutErrors++;      printf("usbdTransfer failed -Int Out \n");      return ERROR;    }  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->intLoopbackSem,/*USB_LOOPBACK_TIMEOUT + 100*/OSS_BLOCK) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->intLoopbackSem);      pLoopbackDev->intLoopbackInProgress = FALSE;      intOutErrors++;      printf("OSS_SEM_TAKE failed -Int Out \n");      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0  	if (pIrp->result != OK)  	{  	  intOutErrors++;  	  OSS_SEM_GIVE (pLoopbackDev->intLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif    /* Prepare the IRP for int IN transfer */    pIrp = &pLoopbackDev->intInIrp;    /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));    pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = USB_LOOPBACK_TIMEOUT;    pIrp->transferLen = loopbackLen;    pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_IN;    pIrp->bfrList [0].pBfr = (UCHAR *)inBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;    /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->intInPipeHandle, pIrp) != OK)  	{      pLoopbackDev->intLoopbackInProgress = FALSE;      intInErrors++;      printf("usbdTransfer failed -Int In \n");      return ERROR;    }  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->intLoopbackSem,/*USB_LOOPBACK_TIMEOUT + 100*/OSS_BLOCK) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->intLoopbackSem);      pLoopbackDev->intLoopbackInProgress = FALSE;      intInErrors++;      printf("OSS_SEM_TAKE failed -Int In \n");      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0  	if (pIrp->result != OK)  	{  	  intInErrors++;  	  OSS_SEM_GIVE (pLoopbackDev->intLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif    /* Match the inBfr with outBfr for equality */    for (count = 0; count < loopbackLen; count++)    {    	if( inBfr[count]!= outBfr[count])    	{    		intPacketMismatch++;      }    }  }/* While loop */  printf("\nInt loopback report:\n");  printf("Int-Out errors:%d\n",intOutErrors);  printf("Int-In errors:%d\n",intInErrors);  printf("Int-Loopback packet mismatch:%d\n",intPacketMismatch);    /* Update the stats in the pLoopbackDevice */  pLoopbackDev->deviceStat.intOutErrors += intOutErrors;  pLoopbackDev->deviceStat.intInErrors += intInErrors;  pLoopbackDev->deviceStat.intPacketMismatch += intPacketMismatch;  pLoopbackDev->intLoopbackInProgress = FALSE;  return OK;}/***************************************************************************** usbLoopbackIsoch - initiates loopback data transmission for isoch endpoint.** If the isoch loopback is not already in use, this function populates the* isoch out and IN IRP with the buffer and submits the IRPs for* requested number of times.** This function assumes that the outBfr and inBfr are allocated with enough size to* hold the loopbackLen data.Also the first two bytes of buffer contains the* length of whole buffer including these length field** RETURNS: OK, or ERROR if unable to initiate transmission*/LOCAL int usbLoopbackIsoch(USB_LOOPBACK_CHAN *pChan,char *outBfr,                          char *inBfr,int loopbackLen,int iteration){  pUSB_LOOPBACK_DEVICE pLoopbackDev = (pUSB_LOOPBACK_DEVICE) pChan;  pUSB_IRP pIrp;  UINT16 count;  UINT32 isochOutErrors =0;  UINT32 isochInErrors =0;  UINT32 isochPacketMismatch =0;  /* Return if Isoch looop back is not supported on the device */  if (!USB_IS_ISOCH_LOOPBACK_SUPPORTED(pLoopbackDev->protocol))  {    printf("Isoch loopback is not supported on the device!!!\n");    return ENOSYS;  }  /* validate the loopback buffer */  if ((outBfr == NULL) ||(inBfr == NULL))  {    printf ("Invalid bulk loopback buffers!!\n" );  	return S_usbLoopbackLib_BAD_PARAM;  }    /* Validate the length */  if(loopbackLen < 2 )  {  	printf ("Invalid bulk loopback length!!\n" );  	return S_usbLoopbackLib_BAD_PARAM;  }    if (loopbackLen > USB_LOOPBACK_MAX_LEN)  {    loopbackLen = USB_LOOPBACK_MAX_LEN;  }    /* Return immediately if the output IRP is already in use. */  if (pLoopbackDev->isochLoopbackInProgress)	return OK;  /* mark the int loopback tarnsfer as in progress */  pLoopbackDev->isochLoopbackInProgress = TRUE;  while(iteration-- != 0)  {    /* Prepare the IRP for bulk out tarnsfer */    pIrp = &pLoopbackDev->isochOutIrp;    /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));    pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = USB_TIMEOUT_NONE;    pIrp->transferLen = loopbackLen;    pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_OUT;    pIrp->bfrList [0].pBfr = (UCHAR *)outBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;    /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->isochOutPipeHandle, pIrp) != OK)    {      pLoopbackDev->isochLoopbackInProgress = FALSE;      isochOutErrors++;      printf("usbdTransfer failed -Isoch Out \n");      return ERROR;    }  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->isochLoopbackSem,/*USB_LOOPBACK_TIMEOUT + 100*/OSS_BLOCK) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->isochLoopbackSem);      pLoopbackDev->isochLoopbackInProgress = FALSE;      isochOutErrors++;      printf("OSS_SEM_TAKE failed -Isoch Out \n");      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0  	if (pIrp->result != OK)  	{  	  isochOutErrors++;  	  OSS_SEM_GIVE (pLoopbackDev->isochLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif    /* Prepare the IRP for int IN transfer */    pIrp = &pLoopbackDev->isochInIrp;    /* Initialize IRP */    memset (pIrp, 0, sizeof (*pIrp));    pIrp->userPtr = pLoopbackDev;    pIrp->irpLen = sizeof (*pIrp);    pIrp->userCallback = usbLoopbackIrpCallback;    pIrp->timeout = USB_LOOPBACK_TIMEOUT;    pIrp->transferLen = loopbackLen;    pIrp->bfrCount = 1;    pIrp->bfrList [0].pid = USB_PID_IN;    pIrp->bfrList [0].pBfr = (UCHAR *)inBfr;    pIrp->bfrList [0].bfrLen = loopbackLen;    /* Submit IRP */    if (usbdTransfer (usbdHandle, pLoopbackDev->isochInPipeHandle, pIrp) != OK)  	{      pLoopbackDev->isochLoopbackInProgress = FALSE;      isochInErrors++;      printf("usbdTransfer failed -Isoch In \n");      return ERROR;    }  	/* Wait for transfer to be completed */    if (OSS_SEM_TAKE (pLoopbackDev->isochLoopbackSem,/*USB_LOOPBACK_TIMEOUT + 100*/OSS_BLOCK) != OK )    {      OSS_SEM_GIVE (pLoopbackDev->isochLoopbackSem);      pLoopbackDev->isochLoopbackInProgress = FALSE;      isochInErrors++;      printf("OSS_SEM_TAKE failed -Isoch In \n");      return (S_usbLoopbackLib_GENERAL_FAULT);    }#if 0  	if (pIrp->result != OK)  	{  	  isochInErrors++;  	  OSS_SEM_GIVE (pLoopbackDev->isochLoopbackSem);  	  continue;/* Continue for next iteration */    }#endif    /* Match the inBfr with outBfr for equality */    for (count = 0; count < loopbackLen; count++)    {    	if( inBfr[count]!= outBfr[count])    	{    		isochPacketMismatch++;      }    }  }/* While loop */  printf("\nIsoch loopback report:\n");  printf("Int-Out errors:%d\n",isochOutErrors);  printf("Int-In errors:%d\n",isochInErrors);  printf("Int-Loopback packet mismatch:%d\n",isochPacketMismatch);    /* Update the stats in the pLoopbackDevice */  pLoopbackDev->deviceStat.isochOutErrors += isochOutErrors;  pLoopbackDev->deviceStat.isochInErrors += isochInErrors;  pLoopbackDev->deviceStat.isochPacketMismatch += isochPacketMismatch;  pLoopbackDev->isochLoopbackInProgress = FALSE;  return OK;}/***************************************************************************** findEndpoint - Searches for a BULK endpoint of the indicated direction.** RETURNS: pointer to matching endpoint descriptor or NULL if not found*/LOCAL pUSB_ENDPOINT_DESCR findEndpoint    (    pUINT8 pBfr,    UINT16 bfrLen,    UINT16 direction,    UINT8 attribute    )    {    pUSB_ENDPOINT_DESCR pEp;    while ((pEp = usbDescrParseSkip (&pBfr, 				     &bfrLen, 				     USB_DESCR_ENDPOINT)) 				  != NULL)	{	if ((pEp->attributes & USB_ATTR_EPTYPE_MASK) == attribute &&	    (pEp->endpointAddress & USB_ENDPOINT_DIR_MASK) == direction)	    break;	}    return pEp;    }/***************************************************************************** configureLoopbackDevice - configure USB Loopback for operation** Selects the configuration/interface specified in the <pLoopbackDev>* structure.  These values come from the USBD dynamic attach callback,* which in turn retrieved them from the configuration/interface* descriptors which reported the device to be a Loopback.** RETURNS: OK if successful, else ERROR if failed to configure channel*/LOCAL STATUS configureLoopbackDevice    (    pUSB_LOOPBACK_DEVICE pLoopbackDev    )    {    pUSB_CONFIG_DESCR pCfgDescr = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -