|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
我用的是vxworks5.5+tornado2.2,它自带有usb1.1的协议栈,在此基础上我编写了一个扫描仪设备驱动,但是传输却只有100KB/S,比实际的600-900KB/S少很多,但是却找不什么原因,下面是读操作时的代码片断,希望各位大虾帮帮我啊!万分感谢!
if (pScanDev->direction == USB_CBW_DIR_IN)
{
memset (&(pScanDev->outIrp), 0, sizeof (USB_IRP));
pScanDev->outIrp.irpLen = sizeof (USB_IRP);
pScanDev->outIrp.userCallback = usbScanIrpCallback;
pScanDev->outIrp.timeout = usbScanIrpTimeOut;
pScanDev->outIrp.transferLen = sizeof(pScanDev->CommandByte);
pScanDev->outIrp.bfrCount = 0x01;
pScanDev->outIrp.bfrList[0].pid = USB_PID_OUT;
pScanDev->outIrp.bfrList[0].pBfr = (UINT8*)(pScanDev->CommandByte);
pScanDev->outIrp.bfrList[0].bfrLen = sizeof(pScanDev->CommandByte);
pScanDev->outIrp.userPtr = pScanDev;
if (usbdTransfer (usbdHandle,
pScanDev->outPipeHandle,
&(pScanDev->outIrp))
!= OK)
{
logMsg ("usbScanCmdExecute: Unable to submit IRP for transfer\n",
0, 0, 0, 0, 0, 0);
return (USB_INTERNAL_ERROR);
}
/* Wait till the transfer of IRP completes or time out */
if ( OSS_SEM_TAKE (scanIrpSem,
usbScanIrpTimeOut + USB_SCAN_OFFS)
== ERROR )
{
logMsg ("usbScanCmdExecute: Irp Time out \n", 0, 0, 0, 0, 0, 0);
OSS_SEM_GIVE (scanIrpSem);
return (USB_INTERNAL_ERROR);
}
if (pScanDev->outIrp.result == S_usbHcdLib_STALLED)
{
usbScanDevResetRecovery (pScanDev);
OSS_SEM_GIVE (scanIrpSem);
return (USB_BULK_IO_ERROR);
}
memset (&(pScanDev->inIrp), 0, sizeof (USB_IRP));
/* form an IRP to read from BULK_IN pipe */
pScanDev->inIrp.irpLen = sizeof(USB_IRP);
pScanDev->inIrp.userCallback = usbScanIrpCallback;
pScanDev->inIrp.timeout = usbScanIrpTimeOut;
pScanDev->inIrp.transferLen = pScanDev->CommandLen;
pScanDev->inIrp.bfrCount = 0x01;
pScanDev->inIrp.bfrList[0].pid = USB_PID_IN;
pScanDev->inIrp.bfrList[0].pBfr = pScanDev->scanInData;
pScanDev->inIrp.bfrList[0].bfrLen = pScanDev->CommandLen;
pScanDev->inIrp.userPtr = pScanDev;
if (usbdTransfer (usbdHandle,
pScanDev->inPipeHandle,
&(pScanDev->inIrp))
!= OK)
{
logMsg ("usbScanCmdExecute: Unable to submit IRP for "\
"BULK_IN data transfer\n", 0, 0, 0, 0, 0, 0);
OSS_SEM_GIVE (scanIrpSem);
return (USB_INTERNAL_ERROR);
}
if ( OSS_SEM_TAKE (scanIrpSem, usbScanIrpTimeOut + 1000) == ERROR )
{
logMsg ("usbScanCmdExecute: Irp in Use \n", 0, 0, 0, 0, 0, 0);
return (USB_INTERNAL_ERROR);
}
if (pScanDev->inIrp.result == S_usbHcdLib_STALLED)
{
usbScanDevResetRecovery (pScanDev);
OSS_SEM_GIVE (scanIrpSem);
return (USB_BULK_IO_ERROR);
}
} |
|