USB HID cihazı yalnızca 1 olayı tetikliyor


11

ASUS PSR 2000 Web Sörf Uzaktan Kumandası ile birlikte gelen bir eDIO USB Çoklu Uzaktan Kumanda (Kızılötesi Alıcı) var.

Uzaktan kumanda tarafından gönderilen tuş vuruşlarını alır, böylece Uzaktan COntroller benim pi bağlamak çalışıyorum.

Denetleyici bir HID cihazı olarak algılanır. İşte lsusb -v komutunun ayrıntıları

    Bus 001 Device 007: ID 147a:e001 Formosa Industrial Computing, Inc.
    Couldn't open device, some information will be missing
    Device Descriptor:
    bLength                18
    bDescriptorType         1
    bcdUSB               1.10
    bDeviceClass            0 (Defined at Interface level)
   bDeviceSubClass         0
   bDeviceProtocol         0
   bMaxPacketSize0         8
   idVendor           0x147a Formosa Industrial Computing, Inc.
   idProduct          0xe001
   bcdDevice            1.22
   iManufacturer           1
   iProduct                2
   iSerial                 0
   bNumConfigurations      1
  Configuration Descriptor:
  bLength                 9
  bDescriptorType         2
wTotalLength           34
bNumInterfaces          1
bConfigurationValue     1
iConfiguration          4
bmAttributes         0xa0
  (Bus Powered)
  Remote Wakeup
MaxPower              300mA
Interface Descriptor:
  bLength                 9
  bDescriptorType         4
  bInterfaceNumber        0
  bAlternateSetting       0
  bNumEndpoints           1
  bInterfaceClass         3 Human Interface Device
  bInterfaceSubClass      1 Boot Interface Subclass
  bInterfaceProtocol      2 Mouse
  iInterface              0
    HID Device Descriptor:
      bLength                 9
      bDescriptorType        33
      bcdHID               1.10
      bCountryCode            0 Not supported
      bNumDescriptors         1
      bDescriptorType        34 Report
      wDescriptorLength      20
     Report Descriptors:
       ** UNAVAILABLE **
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x81  EP 1 IN
    bmAttributes            3
      Transfer Type            Interrupt
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0004  1x 4 bytes
    bInterval              10

Ayrıca, hedef klasörde oluşturulmuş bir etkinlikle hedef cihazı görüntüleyebilirim

    pi@raspberrypi /dev/input/by-id $ dir
    usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00

İlişkili olay işleyicisi, aşağıdaki komuttan görüldüğü gibidir.

pi@raspberrypi /proc/bus/input $ cat devices
I: Bus=0003 Vendor=147a Product=e001 Version=0110
N: Name="Cypress Semiconductor eDio USB Multi Remote Controlle"
P: Phys=usb-bcm2708_usb-1.2/input0
S: Sysfs=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input2
U: Uniq=
H: Handlers=event0
B: PROP=0
B: EV=1

Sorun, aygıt için oluşturulan olay işleyicisinden çıktıyı okumaya çalıştığımda. İlk tuş vuruşu kaydedildi, ancak sonraki tuş vuruşları CAT komutu tarafından görüntülenmiyor.

 pi@raspberrypi /dev/input $ cat event0 | xxd
 0000000: e007 9450 9476 0900 0000 0000 0000 0000  ...P.v..........

Lütfen cihazın çalışmasını sağlamak için ne yapabileceğimi önerin. İlk tuşa basıldıktan sonra herhangi bir tuşa basılması, cihaz yeniden takılmadığı sürece hiçbir şey döndürmez.

Lütfen sorunu çözmek için ne yapılması gerektiğini önerin.


Kimse bir şey ??? Cihazda neler olup bittiğinden emin değilim. Belki bir moderatör burada bir sorun varsa soruyu daha iyi çerçevelememe yardımcı olabilir mi?
SteveIrwin

Soru güzel. Ancak, oldukça yerelleştirilmiş, bu yüzden eminim pek çok insan aynı sorunu olurdu. Chris Wallace'ın konuşan teknesi tarafından kullanılan benzer bir şey gördüğümü bilmeniz sizi sakinleştirebilir, böylece buna bir göz atabilirsiniz. Sorunu teşhis etmek için isteyeceğim ilk şey; kendi kendine çalışan bir hub mı kullanıyorsunuz, çünkü bu bir güç sorunu olabilir.
Jivings

Sen olmadan denedin |xxdmi? Çıktıyı tamponlar. Uzaktan kumandanım tarafından gönderilen anahtar kodlarını almak için irwpaketten kullandım lirc.
macrojames

özel sürücü Linux Çekirdek Düzeltme Eki anlamına gelir. Daha kolay seçenek libusb, USB Uç Noktalarına doğrudan erişim sağladığı için libusb kullanmaktır.
Lars Pötter

Yanıtlar:


5

Sorun eksik USB Descrioptors gibi görünüyor:

  Couldn't open device, some information will be missing
  Report Descriptors:
  ** UNAVAILABLE **

Okunabilen Tanımlayıcı bunun bir Fare olduğunu söylüyor.

  bInterfaceProtocol      2 Mouse

Ve veri formatını tanımlayan 20 Byte'lık bir Tanımlayıcı olacağını:

  bDescriptorType        34 Report
  wDescriptorLength      20

Ama bu eksik.

Özel Donanım ve Yazılım kombinasyonunuzda garip bir Sorun var veya Programcı tembeldi ve kendi Sürücüleri muhtemelen buna ihtiyaç duymadığı için Rapor Tanımlayıcıyı uygulamadı. Ama büyük olasılıkla bu girdi aygıtını oluşturan sürücüyü karıştırdı.

Uç noktadan 4 baytı okumak için libusb'yi kullanmayı deneyebilirsiniz. Belki oylama işleri. Veya cihazı orijinal sürücüyle kullanırken USB iletişimine bir göz atın. Ve evet, pahalı USB Kaydedicilerinden birine sahip değilseniz bu çok zordur. Ancak Linux Çekirdeğinin Yazılım USB Günlüğü desteği vardır ve Windows için bazı yazılım Kayıt Cihazları mevcuttur.


4

Sonunda Libusb için bir paket olan PyUSB kütüphanesini kullanarak kendi uygulamamı yazmak için zamanım oldu.

Kodu buraya gönderiyorum. Birisine yardım edebilirsin.

Burada kullanılan yapılandırma dosyasını oluşturan başka bir kod parçasına sahibim. Hepsine ihtiyacım olmadığı için tüm uzak anahtarları eşlemedim.

import usb.core
import usb.util
import ConfigParser 
import shlex
import subprocess
import logging

# find our device
diction={
  6402315641282315:'1',
  6402415641282415:'2',
  6402515641282515:'3',
  6402615641282615:'4',
  6402715641282715:'5',
  6402815641282815:'6',
  6402915641282915:'7',
  6403015641283015:'8',
  6403115641283115:'9',
  }



def load_config():
    dict={}
    config = ConfigParser.RawConfigParser()
    config.read('/codes/remote/remote.cfg')

    dict['vendor']=config.getint('Settings','idVendor')

    dict['product']=config.getint('Settings','idProduct')

    dict['interface']=config.getint('Settings', 'interface')

    r=config.options('Key Mappings')

    for item in r:
        if config.get('Key Mappings',item)!='': 
            dict[item]=config.get('Key Mappings',item)
            #print config.get('Key Mappings',item)
    return dict

def pyus():

    try:
        load_log()
        dict=load_config()
        join_int = lambda nums: int(''.join(str(i) for i in nums))
        #print dict

        dev = usb.core.find(idVendor=dict['vendor'], idProduct=dict['product'])
        interface=dict['interface']

        if dev is None:
            raise ValueError('Device not found')

        if dev.is_kernel_driver_active(interface) is True:
                #print "but we need to detach kernel driver"
                dev.detach_kernel_driver(interface)
        #dev.detatch_kernel_driver(interface) 
        # set the active configuration. With no arguments, the first
        # configuration will be the active one
        dev.set_configuration()

        # get an endpoint instance
        cfg = dev.get_active_configuration()
        interface_number = cfg[(0,0)].bInterfaceNumber
        alternate_setting = usb.control.get_interface(dev,interface_number)
        intf = usb.util.find_descriptor(
            cfg, bInterfaceNumber = interface_number,
            bAlternateSetting = alternate_setting
        )

        ep = usb.util.find_descriptor(
            intf,
            # match the first IN endpoint
            custom_match = \
            lambda e: \
                usb.util.endpoint_direction(e.bEndpointAddress) == \
                usb.util.ENDPOINT_IN
        )

        assert ep is not None
        #print 'packet details',ep.bEndpointAddress , ep.wMaxPacketSize

        while 1:
            try:
                data = dev.read(ep.bEndpointAddress, ep.wMaxPacketSize*2,interface,1000)
                data=data.tolist()
                key=join_int(data)
                #print "Key is " , key
                if  key in diction:

                    try:
                        args=shlex.split(dict[diction[key]])
                        #print args
                        p=subprocess.Popen(args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
                        #print "Pressed key is ",diction[key]
                    except:
                        pass


            except usb.core.USBError as e:
                pass
    except:
        pass

pyus()
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.