Hello everyone, I have had some success with PyUSB, but it's all new to me and I am struggling with something which should be simple. I am using PyUSB v1.0.
I am trying to write to the GPIO pins on a USB sound interface. I have one of the extremely common USB sound dongles which contains a 3S SSS1623 chip. This chip has two GPIO pins, and inputs for buttons (volume up/down, mic. mute and speaker mute). I have the datasheet for the 3S chip which shows me the pins for GPIO, but it doesn't tell me the HID commands. Another common device is the C-Media CM108 chip, which has four GPIO pins. The C-Media chip is compatible (but not identical) and I have the datasheet for this too, with pinouts *and* HID commands. So far I have written a simple PyUSB script which identifies the 3S chip, detaches the HID interface, and loops around continuously reporting the button states and GPIO states. I used the C-Media HID 'read' documentation to decode what the 3S chip reports, and it matches. Next I want to write four bytes to set GPIO0 to ouput, and drive it high or low. I am using the C-Media 'write' documentation, but it's not working. The documentation might be incompatible with the 3S chip, or I may have made a stupid mistake. Below is the code I am using for testing. The main while loop runs forever. If no buttons are pressed, or no GPIO changes state the endpoint read command times out and generates an error which causes the loop to restart. If the read command is successful then the code carries on and prints out the data (4 bytes) that are received. I am running the code as root because I haven't sorted out the permissions. I intend the write command to send a 4-byte packet with a bit set for the GPIO direction (input or output) and value (high or low). For this experiment I want to toggle the bit every second. The write command always times out unless I press a button on the device. Is this the expected result? The return value from the write command (if it doesn't time out) is 4, which is the number of bytes in the packet. The GPIO pin does not change state, so maybe the write command isn't actually working, or maybe the documentation (for the CM108 chip) doesn't work for writing to the SSS1623 chip (it works for reading). Are my expectations correct? Is my code reasonable? Thanks in advance for any advice. Andrew Test code: import sys import time import usb.core import usb.util # Search for one of the two devices VENDOR_ID = 0x0c76 PRODUCT_ID = 0x1607 # SSS1623 chip device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) if device is None: VENDOR_ID = 0x0c76 PRODUCT_ID = 0x1605 # SSS1621 chip device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) if device is None: sys.exit("No device found") print "Found %04x:%04x"%(VENDOR_ID,PRODUCT_ID) if device.is_kernel_driver_active(0): try: device.detach_kernel_driver(3) except usb.core.USBError: print "Could not detach kernel driver. Maybe it's already detached." # It seems to be okay to carry on here. # sys.exit("Could not detach kernel driver") # This is the HID endpoint on this device. endpoint = device[0][(3,0)][0] out_state = True last_second=0 while 1: this_second = int(time.time())%2 # Write data packet (from CM108 documentation) # byte 0: 00xx xxxx Write GPIO # byte 1: xxxx dcba GPIO3-0 output values # byte 2: xxxx dcba GPIO3-0 data-direction register (1=output) # byte 3: xxxx xxxx SPDIF if this_second!=last_second: if out_state: print "Want to write '1' to port" packet=[0x00,0x01,0x01,0x00] else: print "Want to write '0' to port" packet=[0x00,0x00,0x01,0x00] out_state = not(out_state) last_second=this_second try: endpoint.write(packet,10) except usb.core.USBError: print 'Error writing to device' try: data=endpoint.read(endpoint.wMaxPacketSize,10) except usb.core.USBError: continue print data GPIO0=data[1] & 0x01 GPIO1=data[1] & 0x02 volup=data[0] & 0x01 voldn=data[0] & 0x02 spmut=data[0] & 0x04 mcmut=data[0] & 0x08 print GPIO0,GPIO1,volup,voldn,spmut,mcmut Here is the output of lsusb for the device (from a user account, not root): lsusb -v -d 0c76: Bus 003 Device 044: ID 0c76:1607 JMTek, LLC. audio controller Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0c76 JMTek, LLC. idProduct 0x1607 audio controller bcdDevice 1.00 iManufacturer 0 iProduct 1 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 247 bNumInterfaces 4 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 1 Control Device bInterfaceProtocol 0 iInterface 0 AudioControl Interface Descriptor: bLength 10 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 1.00 wTotalLength 100 bInCollection 2 baInterfaceNr( 0) 1 baInterfaceNr( 1) 2 AudioControl Interface Descriptor: bLength 12 bDescriptorType 36 bDescriptorSubtype 2 (INPUT_TERMINAL) bTerminalID 1 wTerminalType 0x0101 USB Streaming bAssocTerminal 0 bNrChannels 2 wChannelConfig 0x0003 Left Front (L) Right Front (R) iChannelNames 0 iTerminal 0 AudioControl Interface Descriptor: bLength 12 bDescriptorType 36 bDescriptorSubtype 2 (INPUT_TERMINAL) bTerminalID 2 wTerminalType 0x0201 Microphone bAssocTerminal 0 bNrChannels 1 wChannelConfig 0x0001 Left Front (L) iChannelNames 0 iTerminal 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (OUTPUT_TERMINAL) bTerminalID 17 wTerminalType 0x0301 Speaker bAssocTerminal 0 bSourceID 49 iTerminal 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (OUTPUT_TERMINAL) bTerminalID 18 wTerminalType 0x0101 USB Streaming bAssocTerminal 2 bSourceID 33 iTerminal 0 AudioControl Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 5 (SELECTOR_UNIT) bUnitID 33 bNrInPins 1 baSource( 0) 50 iSelector 0 AudioControl Interface Descriptor: bLength 10 bDescriptorType 36 bDescriptorSubtype 6 (FEATURE_UNIT) bUnitID 49 bSourceID 65 bControlSize 1 bmaControls( 0) 0x01 Mute bmaControls( 1) 0x02 Volume bmaControls( 2) 0x02 Volume iFeature 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 6 (FEATURE_UNIT) bUnitID 50 bSourceID 2 bControlSize 1 bmaControls( 0) 0x43 Mute Volume Automatic Gain bmaControls( 1) 0x00 iFeature 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 6 (FEATURE_UNIT) bUnitID 51 bSourceID 2 bControlSize 1 bmaControls( 0) 0x03 Mute Volume bmaControls( 1) 0x00 iFeature 0 AudioControl Interface Descriptor: bLength 13 bDescriptorType 36 bDescriptorSubtype 4 (MIXER_UNIT) bUnitID 65 bNrInPins 2 baSourceID( 0) 1 baSourceID( 1) 51 bNrChannels 2 wChannelConfig 0x0003 Left Front (L) Right Front (R) iChannelNames 0 bmControls 0x00 iMixer 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 AudioStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 1 bDelay 1 frames wFormatTag 1 PCM AudioStreaming Interface Descriptor: bLength 11 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bNrChannels 2 bSubframeSize 2 bBitResolution 16 bSamFreqType 1 Discrete tSamFreq[ 0] 48000 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 9 Transfer Type Isochronous Synch Type Adaptive Usage Type Data wMaxPacketSize 0x00c8 1x 200 bytes bInterval 1 bRefresh 0 bSynchAddress 0 AudioControl Endpoint Descriptor: bLength 7 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x00 bLockDelayUnits 1 Milliseconds wLockDelay 1 Milliseconds Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 AudioStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 18 bDelay 1 frames wFormatTag 1 PCM AudioStreaming Interface Descriptor: bLength 11 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bNrChannels 1 bSubframeSize 2 bBitResolution 16 bSamFreqType 1 Discrete tSamFreq[ 0] 48000 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x00c8 1x 200 bytes bInterval 1 bRefresh 0 bSynchAddress 0 AudioControl Endpoint Descriptor: bLength 7 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x00 bLockDelayUnits 0 Undefined wLockDelay 0 Undefined Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 3 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.00 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 50 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0004 1x 4 bytes bInterval 8 cannot read device status, Operation not permitted (1) ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ pyusb-users mailing list pyusb-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pyusb-users