Gömülü linux sistemimiz, açılıştan önce takılı olduğunda bir USB Aygıtını tanımaz. Öneriler?


5

Küçük bir gömülü cihaz üzerinde geliştiriyoruz. Bu cihaz bize OpenEmbedded linux kullanan bir gumstix overo kurulu. Gelişmemizi neredeyse tamamen tamamladık ve çözemediğimiz en tuhaf böceklerle karşılaştık.

Işık kaynağı için USB2.0 Bağlantısı ve harici güç kaynağı olan bir USB Aygıtımız (Spektrofotometre) var . Tipik davranış, güç kaynağını ve ardından ana bilgisayara USB bağlantısını takmanızdır. USB bağlantısı cihaz tarafından algılandığında, cihaz açılır ve ışık kaynağını ve fanı etkinleştirir. Cihaz daha sonra ana sistem tarafından kullanılabilir.

Sorun, eğer Gumstix'i açmadan önce cihaz Gumstix'e takılırsa, USB cihazının sistem tarafından görünmediği (ve dolayısıyla açılmadığı). Normal bir durumda, bağlantı USB kablosuna takarak başlatıldığında, spektro kendisini açar ve sisteme uygun hale gelir (bu genellikle "lsusb" ile görülebilir). Bunların hiçbiri olmuyor. "Lsusb" ile algılanan bir cihaz yok ve görebileceğimiz herhangi bir dmesg hatası yok. Cihaz takılı değil gibi.

Cihaz gelmez ortaya çıkıp USB kablosunu prizden eğer iyi çalışır ve sistem yeniden başlatıldığında bir kez geri takın. USB veriyolunda açılır ve açılır ve sürücümüzle erişebiliriz.

Başka bir masaüstünde veya dizüstü bilgisayarda, spektrometreyi taktığımızda ana sistemin açık veya kapalı olması önemli değildir. Bu davranış "normal" olarak düşündüğüm şeydir - usb sisteminin önyükleme sırasında sonlandırılmış ve başlatılmış olması ve usb aygıtlarının çevrimiçi olması. Başka bir deyişle, sistem başlatıldıktan sonra usb aygıtını taktığımız sürece sistemimiz tamamen işlevseldir. Maalesef bu, nihai ürünümüzde mümkün değil - her şey bir anda oluyor.

Ek Bilgi: 1) Sistem kapatıldığında sisteme bağlı bir flash sürücü denedik. Sistemi başlatmak, beklendiği gibi flash sürücüyü çevrimiçi duruma getirir 2) Spektro veya usb cihazıyla ilgili herhangi bir mesaj yoktur (dmesg kullanarak). "lsusb" yalnızca USB hub'larını / denetleyicilerini listeler. Tam anlamıyla cihaz yokmuş ve takılı değil gibi. 3) Gumstix'ten yepyeni bir görüntü ve geçen seneden daha eski bir görüntü denedik. Her iki görüntünün de bu sorunu var. Bu sorun kullandığımız 3 gumstix cihazının hepsinde var.

Bir önerisi olan var mı? Söyleyebileceğim kadarıyla, bir usb aygıtı "çıkarma" ve "takma" tam bir emülasyonu olan usb sisteminin tam bir "yeniden başlatılması" yapmak gerçekten mümkün değil. Ne olduğunu hissediyorum, usb veriyolunda usb el sıkışmasını tetikleyecek bir başlangıç ​​probu bulunmadığını hissediyorum, ancak bu bir şekilde spectro'ya özgüdür. Bu bir çekirdek sorunu veya en azından çekirdeğin usb alt sistemini başlatmasıyla ilgili bir sorun gibi görünüyor. Gerçekten emin değilim.

Gumstix posta listesini denedim, ancak bu konuyu daha önce görmüş hiç kimse yok gibi görünüyor. Bakmaya nereden başlayacağınızla ilgili herhangi bir tavsiye veya öneri harika olurdu.

Teşekkür ederim! 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.

Hey, bu sorunu hiç çözdün mü? Ahududu Pi'ye takılmış bir Arduino ile de aynı sorunu yaşıyorum.
ndbroadbent

Evet. Aşağıdaki gönderime bakın. Kısacası, bellenim, uBoot'un neden olduğu USB hattındaki davranış nedeniyle çöküyordu.
Blaine

Haha, röle ile ilgili harika bir çözüm. Bunu bir dahaki sefere akılda tutacak.
ndbroadbent

Teşekkürler! Bu soruyu 7 yıl sonra cevaplamak biraz garip ama hey. Geç olsun güç olmasın?
Blaine

Yanıtlar:


5

Tamamlanması için bunu ölümden geri getir.

Ayrıntılar bulanık, ancak cihazın kendisi önyükleme sırasında çöküyordu. USB hattında uBoot tarafından oluşturulan sohbetlerle ilgili olduğuna inanıyorum. Temel olarak, uBoot önyüklenebilir bir görüntü bulmak için tüm donanım hatlarını (USB dahil) çağırdı. Bu yoklama zararsız olmalıdır, ancak USB cihazımızdaki ürün yazılımı hemen kullanılamaz ve sert bir sıfırlama yapılıncaya kadar çalışamaz duruma gelir (cihazın fiziksel olarak fişini çekip tekrar takın).

Bu hatayı cihaz üreticisine bildirdik ancak sorunun düzeltilmesinin (sadece bizi etkileyen sadece etkileyici) bir öncelik olacağına dair bir belirti alamadık, bu yüzden $ .50'lik bir düzeltmeye başvurduk.

Bunu çözme şeklimiz oldukça yaratıcıydı ama kusursuz çalıştı. Basit bir GPIO kontrollü röle inşa ettik ve USB güç hattını bu röle ile birleştirdik. Temel olarak, sistem "kapalı" rölesi ile başlatıldı ve bu nedenle USB aygıtına güç gelmiyor. Sistem normal olarak başlatıldı ve başlangıç ​​komut dosyasında röleyi etkinleştirmek için GPIO satırını değiştirdik. USB aygıtı normalde önyükleme yapmakta serbestti, uBoot ile etkileşime girmiyordu.


3

Cihaz ilk açılışta işletim sistemi ile sohbet etmeye çalıştı gibi gözüküyor ve yığın o sırada hazır olmadığından hub'dan çıkış yaptı. Sürücüyü bırakmak ve yeniden yüklemeyi zorlamak için önyükleme işleminin sonuna bir bölüm eklemeyi düşünün. ( modprobe -vr ehci_hcd; modprobe -v ehci_hcdeğer USB2.0 uhci_hcdise, USB1.x ise)

Başka bir olasılık da Gumstix kapandığında, cihaza uygunsuz şekilde desteklenebilecek olan güç tasarrufu moduna geçmesini söylemesidir. Windows, orada satıcının test ettiği her şeyden farklı olan Windows’tan farklı şeyler yapabilir. Bunu test etmek için, sistem yeniden başlatmaları sırasında aygıt sürücüsüne aygıtları askıya almamasını veya kapatmamasını söylemeniz gerekebilir. Bak Güç Depolama Linux Kernel Belgeleri USB bölümünde başlamak için.


Önerileriniz için teşekkür ederim. Aygıtın kilitlendiğinden veya önyüklemede benzer bir şey olduğundan şüphelenmeye başladık (gumstix'in önyüklemeye çalıştığı gibi). Modprobe numarası da işe yarayabilir. Tekrar teşekkürler.
Blaine

1
Hatta bir iPod takılıyken (USB Depolama) bazı masaüstü sistemlerinde önyüklemeyi reddediyorum. Gumstix durumunda, önyükleme girişimlerinde başlatma sırasında sorunların ortaya çıkması düşünülebilir ve bu başarısız olduğunda, USB denetleyicisinin önyüklemenin devam edebilmesi için aygıtı görmezden gelmesi gerekir. Bir cihazın, sunucuyu askıya alma / sıfırlama işlemi sırasında "ısrar etmesi" konusunda işaret eden bir sayfa daha buldum: mjmwired.net/kernel/Documentation/usb/persist.txt
zerolagtime

BTW, tavsiye faydalı olduğu takdirde, lütfen cevabı "yararlı" olarak işaretleyin. Teşekkürler!
zerolagtime

Ooooh, "gir" Yorumunu gönderir. Sadece bunu farkettim. Bağlantı için teşekkürler, kontrol ediyorum. sanırım 15 itibar puanı kazanana kadar oy kullanamıyorum.
Blaine,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.