在 Linux/Mono 中通过 USB 控制传输传输了错误的数据
Wrong data transfered via USB control transfer in Linux/Mono
我们这里有一个 USB 设备,上面有一个 EZ-USB FX 芯片,我们使用 LibUsbDotNet
通过 libusb-1.0
"talk" 连接到它。使用 Windows 一切正常,但在 Ubuntu 14.04
下使用 Mono 3.12.1
它不起作用。我做了一些调查和测试,发现它无法初始化设备,我们使用以下逻辑(这是来自我的测试程序,但 "real logic" 是等效的):
protected bool ResetDevice(UsbDevice Device)
{
Console.WriteLine("First ensure that the EZ-USB 8051 is RESET (CPUCS=1)");
if (!ControlTransfer(Device, new byte[] { 1 }))
return false;
Console.WriteLine ("Then allow the EZ-USB CPU to 're-enumerate' (CPUCS=0)");
if (!ControlTransfer(Device, new byte[] { 0 }))
return false;
Console.WriteLine("Reset done...");
return true;
}
public bool ControlTransfer(UsbDevice Device, byte[] data, short? value = null)
{
int written;
var setupPacket = SetupPacket(value);
return Device.ControlTransfer(ref setupPacket, data, data.Length, out written);
}
internal UsbSetupPacket SetupPacket(short? value = null)
{
var controlPacket = new UsbSetupPacket();
controlPacket.Request = 0xA0;
controlPacket.RequestType = 64;
controlPacket.Value = value ?? 0x07F92;
controlPacket.Index = 0;
return controlPacket;
}
然后我使用 USB 分析器分析通过 USB-Port 发送的命令。
使用 Windows 我得到以下信息:
这是正确的,正如您所看到的,设备重置了并且可以使用,但是当使用 Linux 时,我得到以下信息:
现在,命令发送 68
和 A8
而不是 01
和 00
,因此设备什么都不做。
有谁知道这是什么原因吗?为什么在Linux下发送错误的数据包?
这似乎是 LibUsbDotNet 的一个错误(很可能 THIS 一个),因为当前 trunk
(v2.2.9) 的构建确实解决了这个问题。
我们这里有一个 USB 设备,上面有一个 EZ-USB FX 芯片,我们使用 LibUsbDotNet
通过 libusb-1.0
"talk" 连接到它。使用 Windows 一切正常,但在 Ubuntu 14.04
下使用 Mono 3.12.1
它不起作用。我做了一些调查和测试,发现它无法初始化设备,我们使用以下逻辑(这是来自我的测试程序,但 "real logic" 是等效的):
protected bool ResetDevice(UsbDevice Device)
{
Console.WriteLine("First ensure that the EZ-USB 8051 is RESET (CPUCS=1)");
if (!ControlTransfer(Device, new byte[] { 1 }))
return false;
Console.WriteLine ("Then allow the EZ-USB CPU to 're-enumerate' (CPUCS=0)");
if (!ControlTransfer(Device, new byte[] { 0 }))
return false;
Console.WriteLine("Reset done...");
return true;
}
public bool ControlTransfer(UsbDevice Device, byte[] data, short? value = null)
{
int written;
var setupPacket = SetupPacket(value);
return Device.ControlTransfer(ref setupPacket, data, data.Length, out written);
}
internal UsbSetupPacket SetupPacket(short? value = null)
{
var controlPacket = new UsbSetupPacket();
controlPacket.Request = 0xA0;
controlPacket.RequestType = 64;
controlPacket.Value = value ?? 0x07F92;
controlPacket.Index = 0;
return controlPacket;
}
然后我使用 USB 分析器分析通过 USB-Port 发送的命令。
使用 Windows 我得到以下信息:
这是正确的,正如您所看到的,设备重置了并且可以使用,但是当使用 Linux 时,我得到以下信息:
68
和 A8
而不是 01
和 00
,因此设备什么都不做。
有谁知道这是什么原因吗?为什么在Linux下发送错误的数据包?
这似乎是 LibUsbDotNet 的一个错误(很可能 THIS 一个),因为当前 trunk
(v2.2.9) 的构建确实解决了这个问题。