21,597
社区成员
发帖
与我相关
我的任务
分享
PURB CUsbDev::IsoUsb_BuildIsoUrb(IN PMAUDIO_USBD_PIPE_INFORMATION PipeHandle)
{
ULONG siz;
ULONG length, packetSize, numPackets, i;
PURB urb = NULL;
BOOL bIn = FALSE;
length = PipeHandle->nDataLen; // 需要发送或接收数据的长度
packetSize = PipeHandle->MaximumPacketSize; // 208
numPackets = (length + packetSize - 1) / packetSize;
if ( numPackets <= 0 )
{
return NULL;
}
bIn = USBD_PIPE_DIRECTION_IN(PipeHandle);
siz = GET_ISO_URB_SIZE(numPackets);
urb = (PURB)ExAllocatePool(NonPagedPool, siz);
if (urb)
{
RtlZeroMemory(urb, siz);
urb->UrbIsochronousTransfer.Hdr.Length = (USHORT) siz;
urb->UrbIsochronousTransfer.Hdr.Function = URB_FUNCTION_ISOCH_TRANSFER;
urb->UrbIsochronousTransfer.PipeHandle = PipeHandle->PipeHandle;
urb->UrbIsochronousTransfer.TransferFlags = bIn ? (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK) : 0;
urb->UrbIsochronousTransfer.TransferBufferMDL = NULL;
urb->UrbIsochronousTransfer.TransferBuffer = PipeHandle->DataBuffer; // 数据buff
urb->UrbIsochronousTransfer.TransferBufferLength = length;
if (PipeHandle->FrameNumber > 0 )
{
urb->UrbIsochronousTransfer.StartFrame = IsoUsb_GetCurrentFrame();
}
else
{
urb->UrbIsochronousTransfer.TransferFlags |= USBD_START_ISO_TRANSFER_ASAP;
}
urb->UrbIsochronousTransfer.NumberOfPackets = numPackets;
urb->UrbIsochronousTransfer.UrbLink = NULL;
ULONG packetLen = bIn ? 0 : packetSize;
for (i=0; i< numPackets; i++)
{
urb->UrbIsochronousTransfer.IsoPacket[i].Offset = i * packetSize;
urb->UrbIsochronousTransfer.IsoPacket[i].Length = packetLen;
}
urb->UrbIsochronousTransfer.IsoPacket[i-1].Length = length - packetSize * (numPackets - 1); // 最后一个packet
}
return urb;
}