private static void IsoXferReport(ReadIsoTransferQueue readIsoTransfers, IsoTransferItem isoTransferItem, int transferLength) { int packetPos; Test.Dcs.Stop(transferLength); if (readIsoTransfers.LastStartFrame == 0) { Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3}", readIsoTransfers.CompletedCount, isoTransferItem.Iso.StartFrame, transferLength, Math.Round(Test.Dcs.Bps, 2)); } else { int lastFrameCount = isoTransferItem.Iso.StartFrame - readIsoTransfers.LastStartFrame; Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3} LastFrameCount={4}", readIsoTransfers.CompletedCount, isoTransferItem.Iso.StartFrame, transferLength, Math.Round(Test.Dcs.Bps, 2), lastFrameCount); } int numPackets = isoTransferItem.Iso.NumberOfPackets; for (packetPos = 0; packetPos < numPackets; packetPos++) { KISO_PACKET isoPacket; isoTransferItem.Iso.GetPacket(packetPos, out isoPacket); if (isoPacket.Length > 1) { // This is somewhat specific to data that is returned by the benchmark firmware. byte firstPacketByte = isoTransferItem.Buffer[isoPacket.Offset]; byte secondPacketByte = isoTransferItem.Buffer[isoPacket.Offset + 1]; Test.LogLn(" [{0:000}] Length={1} B0={2:X2}h B1={3:X2}h", packetPos, isoPacket.Length, firstPacketByte, secondPacketByte); } else { Test.LogLn(" [{0:000}] Empty Packet", packetPos); } } readIsoTransfers.CompletedCount++; readIsoTransfers.LastStartFrame = isoTransferItem.Iso.StartFrame; }
private static void Main(string[] args) { bool success; WINUSB_PIPE_INFORMATION pipeInfo; UsbK usb; USB_INTERFACE_DESCRIPTOR interfaceDescriptor; // Find and configure the device. if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; #if BMFW // TODO FOR USER: Remove this block if not using benchmark firmware. // This configures devices running benchmark firmware for streaming DeviceToHost transfers. Console.WriteLine("Configuring for benchmark device.."); BM_TEST_TYPE testType = BM_TEST_TYPE.READ; success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); if (!success) { Console.WriteLine("Bench_Configure failed."); } #endif // Create the ISO transfer queue. This class manages the pending and outstanding transfer lists. ReadIsoTransferQueue readXfers = new ReadIsoTransferQueue(usb, ref pipeInfo, Test.MaxOutstandingTransfers, Test.IsoPacketsPerTransfer); if (!Test.ShowTestReady()) goto Done; // Always issue a reset pipe prior to re/starting an ISO stream. usb.ResetPipe(pipeInfo.PipeId); // This example will not manage the start frame manually, but this is // how I might caculate the starting point. usb.GetCurrentFrameNumber(out readXfers.FrameNumber); unchecked { // Add some start latency readXfers.FrameNumber += 32; // Start FrameNumber at an interval of 8. readXfers.FrameNumber -= ((readXfers.FrameNumber)%8); } // This is a counter/timer used only for statistics gathering. Thread.Sleep(0); Test.Dcs.Start(); // Transfer processing loop do { IsoTransferItem isoTransferItem; int transferred; int errorCode; // While buffers exist in the completed list, submit them. while (readXfers.Completed.Count > 0 && readXfers.TotalSubmittedCount < Test.MaxTransfersTotal) { errorCode = readXfers.SubmitNextRead(); if (errorCode != 0) { Console.WriteLine("IsoReadPipe failed. ErrorCode: {0:X8}h", errorCode); goto Done; } } if (readXfers.Outstanding.Count == 0) { // The MAX_TRANSFERS_TOTAL test limit hit. Console.WriteLine("Done!"); goto Done; } // Wait for the oldest transfer to complete. errorCode = readXfers.WaitRead(out isoTransferItem, 1000, out transferred); if (errorCode != 0) { Console.WriteLine("OvlPool.Wait failed. ErrorCode: {0:X8}h", errorCode); goto Done; } // Report iso status. IsoXferReport(readXfers, isoTransferItem, transferred); if (readXfers.CompletedCount == 1) Test.Dcs.Start(); } while (true); Done: readXfers.Destroy(); Test.Free(); usb.Free(); }
private static void IsoXferReport(ReadIsoTransferQueue readIsoTransfers, IsoTransferItem isoTransferItem, int transferLength) { int packetPos; Test.Dcs.Stop(transferLength); if (readIsoTransfers.LastStartFrame == 0) { Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3}", readIsoTransfers.CompletedCount, isoTransferItem.Iso.StartFrame, transferLength, Math.Round(Test.Dcs.Bps, 2)); } else { int lastFrameCount = isoTransferItem.Iso.StartFrame - readIsoTransfers.LastStartFrame; Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3} LastFrameCount={4}", readIsoTransfers.CompletedCount, isoTransferItem.Iso.StartFrame, transferLength, Math.Round(Test.Dcs.Bps, 2), lastFrameCount); } int numPackets = isoTransferItem.Iso.NumberOfPackets; for (packetPos = 0; packetPos < numPackets; packetPos++) { KISO_PACKET isoPacket; isoTransferItem.Iso.GetPacket(packetPos, out isoPacket); if (isoPacket.Length > 1) { // This is somewhat specific to data that is returned by the benchmark firmware. byte firstPacketByte = isoTransferItem.Buffer[isoPacket.Offset]; byte secondPacketByte = isoTransferItem.Buffer[isoPacket.Offset + 1]; Test.LogLn(" [{0:000}] Length={1} B0={2:X2}h B1={3:X2}h", packetPos, isoPacket.Length, firstPacketByte, secondPacketByte); } else { Test.LogLn(" [{0:000}] Empty Packet", packetPos); } } readIsoTransfers.CompletedCount++; readIsoTransfers.LastStartFrame = isoTransferItem.Iso.StartFrame; }
private static void Main(string[] args) { bool success; WINUSB_PIPE_INFORMATION pipeInfo; UsbK usb; USB_INTERFACE_DESCRIPTOR interfaceDescriptor; // Find and configure the device. if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) { return; } #if BMFW // TODO FOR USER: Remove this block if not using benchmark firmware. // This configures devices running benchmark firmware for streaming DeviceToHost transfers. Console.WriteLine("Configuring for benchmark device.."); BM_TEST_TYPE testType = BM_TEST_TYPE.READ; success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); if (!success) { Console.WriteLine("Bench_Configure failed."); } #endif // Create the ISO transfer queue. This class manages the pending and outstanding transfer lists. ReadIsoTransferQueue readXfers = new ReadIsoTransferQueue(usb, ref pipeInfo, Test.MaxOutstandingTransfers, Test.IsoPacketsPerTransfer); if (!Test.ShowTestReady()) { goto Done; } // Always issue a reset pipe prior to re/starting an ISO stream. usb.ResetPipe(pipeInfo.PipeId); // This example will not manage the start frame manually, but this is // how I might caculate the starting point. usb.GetCurrentFrameNumber(out readXfers.FrameNumber); unchecked { // Add some start latency readXfers.FrameNumber += 32; // Start FrameNumber at an interval of 8. readXfers.FrameNumber -= ((readXfers.FrameNumber) % 8); } // This is a counter/timer used only for statistics gathering. Thread.Sleep(0); Test.Dcs.Start(); // Transfer processing loop do { IsoTransferItem isoTransferItem; int transferred; int errorCode; // While buffers exist in the completed list, submit them. while (readXfers.Completed.Count > 0 && readXfers.TotalSubmittedCount < Test.MaxTransfersTotal) { errorCode = readXfers.SubmitNextRead(); if (errorCode != 0) { Console.WriteLine("IsoReadPipe failed. ErrorCode: {0:X8}h", errorCode); goto Done; } } if (readXfers.Outstanding.Count == 0) { // The MAX_TRANSFERS_TOTAL test limit hit. Console.WriteLine("Done!"); goto Done; } // Wait for the oldest transfer to complete. errorCode = readXfers.WaitRead(out isoTransferItem, 1000, out transferred); if (errorCode != 0) { Console.WriteLine("OvlPool.Wait failed. ErrorCode: {0:X8}h", errorCode); goto Done; } // Report iso status. IsoXferReport(readXfers, isoTransferItem, transferred); if (readXfers.CompletedCount == 1) { Test.Dcs.Start(); } } while (true); Done: readXfers.Destroy(); Test.Free(); usb.Free(); }