2012-08-15 15 views
1

我有一個硬件系統,它使用GroovyGameGear.com的LED Wiz控制運行Windows Embedded的系統前面的LED。 GroovyGameGear提供了一個dll(SimpleLEDWiz.dll),我從python(ctypes的cdll)運行來控制LED控制器,這很好。在Linux中操作LED Wiz

問題出在這裏:我們正在交換Windows Embedded for Ubuntu 12.04,並且我將(顯然)不再能夠使用提供的dll來控制LED控制器(是的,我試過酒)。開發人員向我發送了一些看起來很簡單的數據傳輸規範,但我很失敗,無法實現這一目標。我可以在/ dev/bus/usb中連接時看到設備,但除此之外,我不確定要做什麼。如果可能的話,我很樂意將它保留在Python中。這是從LED奇才隊發給我的信息:

「」「這是你需要知道的LED,奇才結束;

開發者ID:FAFA 設備編號:F0通過FF

報告的格式非常簡單:在任何一個給定的時間總是有8個字節發送,硬件期望有兩種類型的傳輸

第一個就是我們所說的「狀態轉儲」。 輸出的狀態如下:

字節0 = 64這是一個標誌,用於告訴單元此數據包是狀態轉儲。它將始終爲64

字節1 - 字節5 =請參閱KWZ-SBA命令。

字節6和字節7 = 0這是始終爲0,並且「填充」

的「狀態轉儲」也將允許從與「簡檔轉儲」遇到任何問題恢復,因爲它重置所有數據計數器在LED-Wiz內。偶爾使用狀態轉儲是一個好主意,只是爲了確保一切都是同步的。它不應該是必要的,因爲USB通信良好,但是這是一個很好的做法。

另一個是「配置文件轉儲」。這一個預期在四個8字節塊中的32個字節的數據。想想每個塊的,就好像它是在KWZ PBA的命令數據的四分之一。「」」

任何幫助將不勝感激!謝謝!

回答

2

我一直對這個問題,以及該設備是一個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!