Estamos desenvolvendo em um pequeno dispositivo incorporado. Este dispositivo nos uma placa overum gumstix rodando OpenEmbedded linux. Nós temos nosso desenvolvimento quase completamente feito, e nos deparamos com os bugs mais estranhos que não conseguimos descobrir.
Temos um dispositivo USB (espectrofotômetro) que possui uma conexão USB2.0 e uma fonte de alimentação externa para a fonte de luz. O comportamento típico é que você conecta a fonte de alimentação e, em seguida, a conexão USB a um host. Quando a conexão USB é detectada pelo dispositivo, o dispositivo é inicializado e ativa a fonte de luz e o ventilador. O dispositivo pode então ser usado pelo sistema host.
O problema é que, se o dispositivo estiver conectado ao Gumstix antes de ligarmos o Gumstix, o dispositivo USB aparentemente não é sondado pelo sistema (e, portanto, não liga). Em uma situação normal, quando a conexão é inicializada conectando-se o cabo usb, a especificação se liga e fica disponível para o sistema (isso pode ser visto via "lsusb" normalmente). Nenhuma dessas coisas está acontecendo. Não há nenhum dispositivo detectado via "lsusb" e nenhum erro de dmesg de qualquer tipo que possamos ver. É como se o dispositivo não estivesse conectado.
O dispositivo aparece e funciona bem se desconectarmos o cabo USB e reconectá-lo assim que o sistema for inicializado. Acende e aparece no barramento usb, e podemos acessá-lo com o nosso driver.
Em qualquer outro desktop ou laptop, não importa se o sistema host está ligado ou desligado quando conectamos o espectrômetro. Esse comportamento é o que eu considero ser "normal" - que o sistema usb é investigado e inicializado no momento da inicialização, e os dispositivos usb ficam online. Em outras palavras, nosso sistema é totalmente funcional, desde que conectemos o dispositivo USB após o sistema ser inicializado. Infelizmente isso não é possível em nosso produto final - tudo acontece ao mesmo tempo.
Informações adicionais:
1) Tentamos uma unidade flash conectada ao sistema quando o sistema está desligado. A inicialização do sistema coloca a unidade flash online, como esperado
2) Não há mensagens sobre o dispositivo spectro ou usb (usando dmesg). "lsusb" lista apenas os hubs / controladores USB. É literalmente como se o dispositivo não estivesse presente e não estivesse conectado.
3) Tentamos uma nova imagem do gumstix e uma imagem antiga do ano passado. Ambas as imagens têm esse problema. Este problema existe em todos os 3 dispositivos gumstix que usamos.
Alguém tem alguma sugestão? Pelo que posso dizer, não é realmente possível fazer uma "reinicialização" completa do sistema usb que é uma emulação completa de "desconectar" e "reconfigurar" um dispositivo usb. Eu sinto que o que está acontecendo é que não há uma sonda inicial no barramento usb que acionaria o handshack usb, mas isso é de alguma forma específico para o espectro. Isto parece ser um problema no kernel ou pelo menos um problema em como o kernel está inicializando o subsistema usb. Eu não tenho muita certeza.
Eu tentei a lista de e-mails do gumstix, mas parece que ninguém viu esse problema antes. Qualquer conselho ou sugestão sobre onde começar a procurar seria fantástico.
Obrigado!
Blaine
output etc.
$ uname -a
Linux overo 2.6.33 #1 Tue Apr 27 08:35:38 PDT 2010 armv7l GNU/Linux
When the system is up and running and spectro is plugged in (working as intended), this is lsusb:
Bus 001 Device 116: ID 2457:1022
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x2457
idProduct 0x1022
bcdDevice 0.02
iManufacturer 1 USB4000 1.01.11
iProduct 2 Ocean Optics USB4000
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 46
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 400mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 4
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
dmesg output:
usb usb1: usb auto-resume
hub 1-0:1.0: hub_resume
usb usb2: usb auto-resume
ehci-omap ehci-omap.0: resume root hub
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0000
hub 2-0:1.0: hub_resume
hub 2-0:1.0: state 7 ports 3 chg 0000 evt 0000
hub 1-0:1.0: hub_suspend
usb usb1: bus auto-suspend
hub 2-0:1.0: hub_suspend
usb usb2: bus auto-suspend
ehci-omap ehci-omap.0: suspend root hub
usb usb2: usb resume
ehci-omap ehci-omap.0: resume root hub
hub 2-0:1.0: hub_resume
ehci-omap ehci-omap.0: GetStatus port 2 status 001803 POWER sig=j CSC CONNECT
hub 2-0:1.0: port 2: status 0501 change 0001
hub 2-0:1.0: state 7 ports 3 chg 0004 evt 0000
hub 2-0:1.0: port 2, status 0501, change 0000, 480 Mb/s
ehci-omap ehci-omap.0: port 2 high speed
ehci-omap ehci-omap.0: GetStatus port 2 status 001005 POWER sig=se0 PE CONNECT
usb 2-2: new high speed USB device using ehci-omap and address 2
ehci-omap ehci-omap.0: port 2 high speed
ehci-omap ehci-omap.0: GetStatus port 2 status 001005 POWER sig=se0 PE CONNECT
usb 2-2: default language 0x0409
usb 2-2: udev 2, busnum 2, minor = 129
usb 2-2: New USB device found, idVendor=2457, idProduct=1022
usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-2: Product: Ocean Optics USB4000
usb 2-2: Manufacturer: USB4000 1.01.11
usb 2-2: uevent
usb 2-2: usb_probe_device
usb 2-2: configuration #1 chosen from 1 choice
usb 2-2: uevent
usb 2-2: adding 2-2:1.0 (config #1, interface 0)
usb 2-2:1.0: uevent
drivers/usb/core/inode.c: creating file '002'
dmesg has nothing to say, and lusb simply lists nothing else but the two default usb controllers / hubs if we plug the device in before the system is turned on.