ইউএসবি এইচআইডি ডিভাইসটি কেবল 1 ইভেন্ট ফায়ার করছে


11

আমার কাছে একটি ইডিও ইউএসবি মাল্টি রিমোট কন্ট্রোলার (একটি ইনফ্রারেড রিসিভার) রয়েছে যা আসুস পিএসআর 2000 ওয়েব সার্ফিং রিমোট কন্ট্রোল নিয়ে এসেছিল।

আমি রিমোট কন্ট্রোলারটিকে আমার পাইতে সংযুক্ত করার চেষ্টা করছি যাতে এটি রিমোটের মাধ্যমে প্রেরিত কীস্ট্রোকগুলি গ্রহণ করে।

নিয়ামকটি এইচআইডি ডিভাইস হিসাবে সনাক্ত করা হয়েছে। Lsusb -v কমান্ডের বিবরণ এখানে

    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

ডেভ ফোল্ডারে লক্ষ্যযুক্ত ডিভাইসটি একটি ইভেন্ট তৈরির সাথেও দেখতে পাচ্ছি

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

এটির সাথে সম্পর্কিত ইভেন্ট হ্যান্ডলারটি নিম্নলিখিত কমান্ড থেকে নীচে দেখা যাচ্ছে।

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

সমস্যাটি যখন আমি ডিভাইসের জন্য তৈরি ইভেন্ট হ্যান্ডলার থেকে আউটপুটটি পড়ার চেষ্টা করছি first প্রথম কীস্ট্রোক নিবন্ধিত হয়েছে তবে পরবর্তী কী স্ট্রোকগুলি ক্যাট কমান্ড দ্বারা প্রদর্শিত হয় না।

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

ডিভাইসটি কাজ করতে আমি কী করতে পারি তা দয়া করে আমাকে পরামর্শ দিন। প্রথম কীস্ট্রোকের পরে কোনও কী টিপলে ডিভাইসটি পুনরায় সংযুক্ত না করা হলে কোনও কিছুই ফিরে আসে না।

সমস্যাটি সমাধানের জন্য কী করা দরকার তা দয়া করে পরামর্শ দিন।


যে কেউ কিছু হোক না কেন ... ডিভাইসটির সাথে কী চলছে সে সম্পর্কে আমি নির্লিপ্ত। সম্ভবত কোনও মডারেটর যদি প্রশ্নটি এখানে ফ্রেম করতে পারে তবে আমাকে আরও ভালভাবে ফ্রেম করতে সহায়তা করতে পারে?
স্টিভরউইন

প্রশ্নটা ভাল। তবে এটি বেশ স্থানীয়ভাবে তৈরি হয়েছে, তাই আমি নিশ্চিত যে খুব বেশি লোকের একই সমস্যা হত না। এটি আপনাকে জেনে শান্ত হতে পারে যে আমি ক্রিস ওয়ালেসের কথা বলার নৌকোটির সাথে খুব অনুরূপ ব্যবহৃত কিছু দেখেছি যাতে আপনি এটি দেখতে পারেন। সমস্যাটি নির্ণয়ের জন্য প্রথমে আমি যা জিজ্ঞাসা করব তা হ'ল; আপনি কি একটি স্ব-চালিত হাব ব্যবহার করছেন, কারণ এটি কোনও পাওয়ার সমস্যা হতে পারে।
জিভিংস

আপনি ছাড়া চেষ্টা করেছেন |xxd? এটি আউটপুট বাফার করে। আমি irwপ্যাকেজ lircথেকে আমার দূরবর্তী দ্বারা প্রেরিত কীকডগুলি পেতে ব্যবহার করেছি।
ম্যাক্রোজেমস

কাস্টম ড্রাইভারের অর্থ লিনাক্স কার্নেল প্যাচ। Libusb ইউএসবি এন্ডপয়েন্টগুলিতে সরাসরি অ্যাক্সেস দেয়ায় লিবাসব ব্যবহার করা সহজ বিকল্প।
লার্স প্যাটার

উত্তর:


5

সমস্যাটি অসম্পূর্ণ ইউএসবি বর্ণনাকারী বলে মনে হচ্ছে:

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

যে বর্ণনাটি পড়তে পারা যায় তা বলে যে এটি একটি মাউস।

  bInterfaceProtocol      2 Mouse

এবং সেখানে 20 বাইটের বিবরণী থাকবে যা ডেটা ফর্ম্যাটটি বর্ণনা করে:

  bDescriptorType        34 Report
  wDescriptorLength      20

তবে সে নিখোঁজ।

আপনার হার্ডওয়্যার এবং সফ্টওয়্যারটির নির্দিষ্ট সংমিশ্রণে একটি অদ্ভুত সমস্যা রয়েছে বা প্রোগ্রামারটি অলস ছিল এবং রিপোর্ট বিবরণীটি কার্যকর করে নি, কারণ তাদের নিজস্ব ড্রাইভার সম্ভবত এটির প্রয়োজন নেই। তবে সম্ভবত এটিই এমন ড্রাইভার পেল যা ইনপুট ডিভাইসটিকে বিভ্রান্ত করে।

আপনি শেষ বিন্দু থেকে 4 বাইট পড়তে libusb ব্যবহার করার চেষ্টা করতে পারেন। সম্ভবত ভোটগ্রহণ কাজ। বা আপনি মূল ড্রাইভারের সাথে ডিভাইসটি ব্যবহার করার সময় ইউএসবি যোগাযোগের দিকে একবার নজর দিন। এবং হ্যাঁ আপনি যদি ব্যয়বহুল ইউএসবি লগারদের চারপাশে রাখার মতো ঘটনাটি না ঘটে তবে এটি খুব জটিল। তবে লিনাক্স কার্নেলের সফ্টওয়্যার ইউএসবি লগিংয়ের জন্য সমর্থন রয়েছে এবং উইন্ডোজের জন্য কিছু সফ্টওয়্যার লগার পাওয়া যায়।


4

অবশেষে পাইউসবি লাইব্রেরিটি ব্যবহার করে আমার নিজের প্রয়োগটি লেখার সময় পেল যা লিবাস্বের একটি মোড়ক।

আমি কোডটি এখানে পোস্ট করছি someone কাউকে সাহায্য করতে পারে।

আমার কাছে অন্য একটি কোড রয়েছে যা কনফিগারেশন ফাইল তৈরি করে যা এখানে ব্যবহৃত হয়। তবে সমস্ত রিমোট কীগুলি ম্যাপ করে নেই, কারণ সেগুলির সমস্ত প্রয়োজন নেই।

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.