[haiku-commits] r42002 - haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 7 Jun 2011 02:25:59 +0200 (CEST)

Author: mmlr
Date: 2011-06-07 02:25:58 +0200 (Tue, 07 Jun 2011)
New Revision: 42002
Changeset: https://dev.haiku-os.org/changeset/42002

Modified:
   haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp
   haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp
   haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h
Log:
Move the quirky device detection out of the HIDDevice constructor and into the
usb_hid_device_added hook so that we can actually detect non-HID devices at all.


Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp     
2011-06-06 23:54:01 UTC (rev 42001)
+++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp     
2011-06-07 00:25:58 UTC (rev 42002)
@@ -82,10 +82,33 @@
                        i, interfaceClass, interface->descr->interface_subclass,
                        interface->descr->interface_protocol);
 
-               if (interfaceClass == USB_INTERFACE_CLASS_HID) {
+               // check for quirky devices first
+               int32 quirkyIndex = -1;
+               for (int32 j = 0; j < gQuirkyDeviceCount; j++) {
+                       usb_hid_quirky_device &quirky = gQuirkyDevices[j];
+                       if ((quirky.vendor_id != 0
+                                       && deviceDescriptor->vendor_id != 
quirky.vendor_id)
+                               || (quirky.product_id != 0
+                                       && deviceDescriptor->product_id != 
quirky.product_id)
+                               || (quirky.device_class != 0
+                                       && interfaceClass != 
quirky.device_class)
+                               || (quirky.device_subclass != 0
+                                       && interface->descr->interface_subclass
+                                               != quirky.device_subclass)
+                               || (quirky.device_protocol != 0
+                                       && interface->descr->interface_protocol
+                                               != quirky.device_protocol)) {
+                               continue;
+                       }
+
+                       quirkyIndex = j;
+                       break;
+               }
+
+               if (quirkyIndex >= 0 || interfaceClass == 
USB_INTERFACE_CLASS_HID) {
                        mutex_lock(&sDriverLock);
                        HIDDevice *hidDevice
-                               = new(std::nothrow) HIDDevice(device, config, 
i);
+                               = new(std::nothrow) HIDDevice(device, config, 
i, quirkyIndex);
 
                        if (hidDevice != NULL && hidDevice->InitCheck() == 
B_OK) {
                                hidDevice->SetParentCookie(parentCookie);

Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp  
2011-06-06 23:54:01 UTC (rev 42001)
+++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp  
2011-06-07 00:25:58 UTC (rev 42002)
@@ -24,7 +24,7 @@
 
 
 HIDDevice::HIDDevice(usb_device device, const usb_configuration_info *config,
-       size_t interfaceIndex)
+       size_t interfaceIndex, int32 quirkyIndex)
        :       fStatus(B_NO_INIT),
                fDevice(device),
                fInterfaceIndex(interfaceIndex),
@@ -44,25 +44,18 @@
        const usb_device_descriptor *deviceDescriptor
                = gUSBModule->get_device_descriptor(device);
 
-       // check for quirky devices first and don't bother in that case
        HIDWriter descriptorWriter;
        bool hasFixedDescriptor = false;
-       quirky_init_function quirkyInit = NULL;
-       for (int32 i = 0; i < gQuirkyDeviceCount; i++) {
-               usb_hid_quirky_device &quirky = gQuirkyDevices[i];
-               if (deviceDescriptor->vendor_id == quirky.vendor_id
-                       && deviceDescriptor->product_id == quirky.product_id) {
+       if (quirkyIndex >= 0) {
+               quirky_build_descriptor quirkyBuildDescriptor
+                       = gQuirkyDevices[quirkyIndex].build_descriptor;
 
-                       quirkyInit = quirky.init_function;
-                       if (quirky.build_descriptor != NULL
-                               && quirky.build_descriptor(descriptorWriter) == 
B_OK) {
+               if (quirkyBuildDescriptor != NULL
+                       && quirkyBuildDescriptor(descriptorWriter) == B_OK) {
 
-                               reportDescriptor = (uint8 
*)descriptorWriter.Buffer();
-                               descriptorLength = 
descriptorWriter.BufferLength();
-                               hasFixedDescriptor = true;
-                       }
-
-                       break;
+                       reportDescriptor = (uint8 *)descriptorWriter.Buffer();
+                       descriptorLength = descriptorWriter.BufferLength();
+                       hasFixedDescriptor = true;
                }
        }
 
@@ -176,10 +169,15 @@
                return;
        }
 
-       if (quirkyInit != NULL) {
-               fStatus = quirkyInit(device, config, interfaceIndex);
-               if (fStatus != B_OK)
-                       return;
+       if (quirkyIndex >= 0) {
+               quirky_init_function quirkyInit
+                       = gQuirkyDevices[quirkyIndex].init_function;
+
+               if (quirkyInit != NULL) {
+                       fStatus = quirkyInit(device, config, interfaceIndex);
+                       if (fStatus != B_OK)
+                               return;
+               }
        }
 
        ProtocolHandler::AddHandlers(*this, fProtocolHandlerList,

Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h    
2011-06-06 23:54:01 UTC (rev 42001)
+++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h    
2011-06-07 00:25:58 UTC (rev 42002)
@@ -18,7 +18,7 @@
 public:
                                                                
HIDDevice(usb_device device,
                                                                        const 
usb_configuration_info *config,
-                                                                       size_t 
interfaceIndex);
+                                                                       size_t 
interfaceIndex, int32 quirkyIndex);
                                                                ~HIDDevice();
 
                        void                            SetParentCookie(int32 
cookie);


Other related posts:

  • » [haiku-commits] r42002 - haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid - mmlr