Nosso sistema Linux incorporado não reconhecerá um dispositivo USB se ele estiver conectado antes da energização. Sugestões?

5

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.
    
por Blaine 26.10.2010 / 19:44

2 respostas

4

Trazendo isto de volta dos mortos para conclusão.

Os detalhes são confusos, mas o dispositivo em si estava travando na inicialização. Eu acredito que tenha a ver com o uBoot gerado por chat na linha USB. Essencialmente, o uBoot pesquisou todas as linhas de hardware (incluindo USB) para encontrar uma imagem inicializável. Esse polling deve ser inofensivo, mas o firmware em nosso dispositivo USB não pode segurá-lo e travar imediatamente, tornando-o inoperante até uma reinicialização a frio (desconectando fisicamente o dispositivo e conectando-o novamente).

Nós relatamos esse bug para o fabricante do dispositivo, mas não recebemos nenhuma indicação de que a correção do problema (que aparentemente só nos afetou) seria uma prioridade, por isso recorremos a uma correção de US $ 0,50.

A maneira como resolvemos isso foi muito criativa, mas funcionou perfeitamente. Nós construímos um simples relé GPIO controlado e unimos a linha de energia USB através deste relé. Essencialmente, o sistema inicializou com o relé "off" e, portanto, sem energia para o USB devce. O sistema inicializou normalmente e, em nosso script de inicialização, simplesmente alternamos a linha GPIO para ativar o relé. O dispositivo USB estava livre para inicializar normalmente, sem interferência do uBoot.

    
por 28.09.2017 / 19:07
3

Parece que o dispositivo tentou conversar com o sistema operacional na primeira inicialização e, como a pilha não estava pronta naquele momento, ele foi "desconectado" do hub. Considere adicionar uma seção ao final do processo de inicialização para descartar o driver e forçar uma recarga. ( modprobe -vr ehci_hcd; modprobe -v ehci_hcd se USB2.0, uhci_hcd se USB1.x)

Outra possibilidade é que, quando o Gumstix for desligado, ele disse ao dispositivo para entrar no modo de economia de energia, que pode ser mal suportado pelo dispositivo. O Windows pode fazer coisas diferentes lá do que o Windows, que pode ser tudo o que o fornecedor testou. Para testar isso, você pode ter que dizer ao driver de dispositivo para não suspender ou desligar dispositivos durante a reinicialização do sistema. Consulte a documentação do Kernel do Linux sobre economia de energia na seção USB para começar.

    
por 27.10.2010 / 00:46