I'm working on my new Baseboard design which has a Microchip 4-port USB Hub chip on it. This chip uses only a SMBus Write and Read command. I upgraded the kernel to 3.4.90 since 3.4.75 was still using 200kHz as the I2C default speed.
I'm using Python to issue commands and looking at a write_i2c_block_data command on the scope I have confirmed that the command structure is sent properly. I need to also decode on the scope the read but it appears that the read is missing the 1st byte.
If I issue a
sudo i2cdump -y 1 0x2c s
Error: Adapter does not have SMBus block read capability
but if I issue a
cubie@Cubian:~$ sudo i2cdump -y 1 0x2c i
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 20 24 04 14 25 b3 0b 9b 00 01 00 00 00 01 32 01 $??%???.?...?2?
10: 32 32 04 09 13 15 0a 49 00 4f 00 00 00 54 00 45 22?????I.O...T.E
20: 20 43 00 48 00 4e 00 4f 00 4c 00 4f 00 47 00 49 C.H.N.O.L.O.G.I
30: 00 45 00 53 00 00 00 4c 00 4c 00 43 00 00 00 00 .E.S...L.L.C....
40: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
50: 00 00 00 00 00 42 00 69 00 67 00 00 00 42 00 72 .....B.i.g...B.r
60: 20 6f 00 74 00 68 00 65 00 72 00 00 00 42 00 61 o.t.h.e.r...B.a
70: 00 73 00 65 00 62 00 6f 00 61 00 72 00 64 00 00 .s.e.b.o.a.r.d..
80: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
90: 00 00 00 32 00 30 00 31 00 34 00 30 00 38 00 30 ...2.0.1.4.0.8.0
a0: 20 30 00 30 00 31 00 00 00 00 00 00 00 00 00 00 0.0.1..........
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
d0: 00 e1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .?..............
e0: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Notice how every other "0" byte is a 0x20?
If I run this code:
import smbus
bus = smbus.SMBus(1)
reg00 = [0x20, 0x24, 0x04, 0x14, 0x25, 0xB3, 0x0B, 0x9B, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x32, 0x01, 0x32]
bus.write_i2c_block_data(0x2c, 0x00, reg00)
You get the above dump. From my understanding the 1st byte is supposed to be the number of bytes being sent. That code does appear correctly on the scope when I'm writing data
I've made some progress and it appears that the hub does get enumerated:
cubie@Cubian:~$ lsusb
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
But if I try to get some additional information about the hub, lsusb complains that it couldn't open the hub so I'm not sure if it really enumerated properly
cubie@Cubian:~$ lsusb -v -s 001:003
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 2 TT per port
bMaxPacketSize0 64
idVendor 0x0424 Standard Microsystems Corp.
idProduct 0x2514 USB 2.0 Hub
bcdDevice b.b3
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 2mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 1 Single TT
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0001 1x 1 bytes
bInterval 12
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 2 TT per port
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0001 1x 1 bytes
bInterval 12
If I plug a keyboard into the hub it does not show up so I know that something is still not right. Since the idVendor and idProduct come through correctly I am going to assume that at least part of the registers did get written correctly even though reading them says they did not.
If anyone has any helpful advice or knowledge of this I would greatly appreciate some feedback!
Thanks,
George