1

我有一个硬件系统,它使用 GroovyGameGear.com 的 LED Wiz 来控制运行 Windows Embedded 的系统前面的 LED。GroovyGameGear 提供了一个 dll (SimpleLEDWiz.dll),我从 python (cdll from ctypes) 运行它来控制 LED 控制器,效果很好。

这是问题所在:我们正在将 Windows Embedded 换成 Ubuntu 12.04,我(显然)将不再能够使用提供的 dll 来控制 LED 控制器(是的,我已经尝试过 wine)。开发人员已向我发送了一些看似简单的数据传输规范,但我对如何使其工作感到迷茫。在 /dev/bus/usb 中连接时我可以看到该设备,但除此之外我不确定该怎么做。如果可能的话,我很想把它保存在 Python 中。这是 LED Wiz 团队发给我的信息:

"""这是您在 LED-Wiz 端需要了解的内容;

开发人员 ID:FAFA 设备编号:F0 到 FF

报告的格式非常简单:在任何给定时间总是发送 8 个字节,并且硬件期望进行两种类型的传输。

第一个是我们所说的“状态转储”。这将设置输出的状态,如下所示:

字节 0 = 64 这是一个标志,用来告诉单元这个数据包是一个状态转储。永远是 64

字节 1 - 字节 5 = 参考 KWZ-SBA 命令。

字节 6 和字节 7 = 0 这些总是 0 并且是“填充”

“状态转储”还将允许从“配置文件转储”遇到的任何问题中恢复,因为它会重置 LED-Wiz 中的所有数据计数器。偶尔使用状态转储以确保所有内容都同步是个好主意。由于 USB 通信经过了良好的错误检查,因此没有必要这样做,但这是一种很好的做法。

另一个是“配置文件转储”。这需要四个 8 字节块中的 32 字节数据。将每个块视为 KWZ-PBA 命令中数据的四分之一。"""

任何帮助将不胜感激!谢谢!

4

1 回答 1

3

我也一直在努力。该设备是 HID 设备,因此使用报告进行通信。这些通过控制通道传输。一旦我发现这很简单:如果你得到 pyusb 并按照他们的教程(https://github.com/walac/pyusb/blob/master/docs/tutorial.rst),让它工作的方法是找到设备后发出控制转移:

import usb.core
import usb.util
import sys
#input is a 5 byte list
def  LWZ_SBA (input):
   #find device
   dev = usb.core.find(idVendor=0xfafa, idProduct=0x00f0)
   if dev is None:
      raise ValueError('LedWiz device not found')

   #claim device
   if dev.is_kernel_driver_active(0) is True:
      dev.detach_kernel_driver(0)
   usb.util.claim_interface(dev,0)

   #activate device
   if not dev.get_active_configuration():
      dev.set_configuration(1)

   msg = [64]+input+[0,0]

   #send message to device
   dev.ctrl_transfer(0x21, 0x09, 0x0200, 0, msg)

   #bmRequesttype - 0x21 - HID
   #bmrequest - 0x09 - SET_REPORT
   #wValue - Report Type and Rport ID - 0x02 0x00
   #wIndex - Interface - 0
   #msg - list of values

   #release device
   usb.util.release_interface(dev,0)

#use like this to turn all lights on
LWZ_SBA([255,255,255,255,4])

我还没有完成 PBA,但我假设您只是连续四次发出相同的命令(这次是所有 8 个字节,并且由于没有一个允许的值是 64,它知道您正在设置 PBA 而不是 SBA!

于 2012-09-13T23:13:22.387 回答