--=-/h28pJ5/9YoLVmckZHXc
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Hello,

This patch for sanei_usb.c provides the following:

1. Detects endpoints for bAlternateSetting > 0 (for example webcams)
2. Some %d debug values for endpoints are changed to 0x%x
3. More debug info for control and isochronous mode


See the attached file for the patch.

Before adding the patch to the sanei_usb.c file in cvs i like to know
if there are any comments about it.

-- 
----------
m.vr.gr.
Gerard Klaver

--=-/h28pJ5/9YoLVmckZHXc
Content-Disposition: attachment; filename=sanei_usb-c.diff
Content-Type: text/x-patch; name=sanei_usb-c.diff; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit

--- sanei_usb-orig.c    2004-09-06 18:35:04.000000000 +0200
+++ sanei_usb-upd.c     2004-09-07 20:11:49.000000000 +0200
@@ -88,6 +88,10 @@
   SANE_Int bulk_out_ep;
   SANE_Int int_in_ep;
   SANE_Int int_out_ep;
+  SANE_Int iso_in_ep;
+  SANE_Int iso_out_ep;
+  SANE_Int control_in_ep;
+  SANE_Int control_out_ep;
   SANE_Int interface_nr;
 #ifdef HAVE_LIBUSB
   usb_dev_handle *libusb_handle;
@@ -518,6 +522,8 @@
 {
   int devcount;
   SANE_Bool found = SANE_FALSE;
+  int alt_setting_nr;
+  int num_altsetting;
 
   DBG (5, "sanei_usb_open: trying to open device `%s'\n", devname);
   if (!dn)
@@ -636,8 +642,22 @@
          usb_close (devices[devcount].libusb_handle);
          return status;
        }
-      interface = &dev->config[0].interface->altsetting[0];
+        /* looking for the max. bAlternateSetting value */
+      alt_setting_nr = 0;
+        while  ( alt_setting_nr == 
(dev->config[0].interface[0].altsetting[alt_setting_nr].bAlternateSetting )) 
+        {
+                alt_setting_nr++;
+           }
+
+        num_altsetting = alt_setting_nr;
+       for (alt_setting_nr = 0;
+                  alt_setting_nr < num_altsetting;
+                  alt_setting_nr++)
+       {
 
+       DBG (5, "sanei_usb_open: alt_setting_nr: %d\n", alt_setting_nr);
+        interface = &dev->config[0].interface->altsetting[alt_setting_nr];
+       
       /* Now we look for usable endpoints */
       for (num = 0; num < interface->bNumEndpoints; num++)
        {
@@ -645,41 +665,51 @@
          int address, direction, transfer_type;
 
          endpoint = &interface->endpoint[num];
+         DBG (5, "sanei_usb_open:num:: %d endpoint:: 0x%x\n", num, endpoint);
+         transfer_type = endpoint->bmAttributes & USB_ENDPOINT_TYPE_MASK;
          address = endpoint->bEndpointAddress & USB_ENDPOINT_ADDRESS_MASK;
          direction = endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK;
+
+         DBG (5, "sanei_usb_open: direction :: %d)\n", direction);
          transfer_type = endpoint->bmAttributes & USB_ENDPOINT_TYPE_MASK;
 
+         DBG (5, "sanei_usb_open:  address: %d transfertype: %d\n",
+                address, transfer_type);
+
+         
          /* save the endpoints we need later */
          if (transfer_type == USB_ENDPOINT_TYPE_INTERRUPT)
          {
-           DBG (5, "sanei_usb_open: found interupt-%s endpoint (address %d)\n",
+           DBG (5, "sanei_usb_open: found interrupt-%s endpoint (address 
0x%02x)\n",
                 direction ? "in" : "out", address);
            if (direction)      /* in */
            {
              if (devices[devcount].int_in_ep)
                DBG (3, "sanei_usb_open: we already have a int-in endpoint "
-                    "(address: %d), ignoring the new one\n",
+                    "(address: 0x%02x), ignoring the new one\n",
                     devices[devcount].int_in_ep);
              else
                devices[devcount].int_in_ep = endpoint->bEndpointAddress;
            }
            else
+           {
              if (devices[devcount].int_out_ep)
                DBG (3, "sanei_usb_open: we already have a int-out endpoint "
-                    "(address: %d), ignoring the new one\n",
+                    "(address: 0x%02x), ignoring the new one\n",
                     devices[devcount].int_out_ep);
              else
                devices[devcount].int_out_ep = endpoint->bEndpointAddress;
+           }
          }
          else if (transfer_type == USB_ENDPOINT_TYPE_BULK)
          {
-           DBG (5, "sanei_usb_open: found bulk-%s endpoint (address %d)\n",
+           DBG (5, "sanei_usb_open: found bulk-%s endpoint (address 0x%02x)\n",
                 direction ? "in" : "out", address);
            if (direction)      /* in */
              {
                if (devices[devcount].bulk_in_ep)
                  DBG (3, "sanei_usb_open: we already have a bulk-in endpoint "
-                      "(address: %d), ignoring the new one\n",
+                      "(address: 0x%02x), ignoring the new one\n",
                       devices[devcount].bulk_in_ep);
                else
                  devices[devcount].bulk_in_ep = endpoint->bEndpointAddress;
@@ -688,23 +718,60 @@
              {
                if (devices[devcount].bulk_out_ep)
                  DBG (3, "sanei_usb_open: we already have a bulk-out endpoint "
-                      "(address: %d), ignoring the new one\n",
+                      "(address: 0x%02x), ignoring the new one\n",
                       devices[devcount].bulk_out_ep);
                else
                  devices[devcount].bulk_out_ep = endpoint->bEndpointAddress;
              }
            }
-         /* ignore currently unsupported endpoints */
-         else {
-             DBG (5, "sanei_usb_open: ignoring %s-%s endpoint "
-                  "(address: %d)\n",
-                  transfer_type == USB_ENDPOINT_TYPE_CONTROL ? "control" :
-                  transfer_type == USB_ENDPOINT_TYPE_ISOCHRONOUS
-                  ? "isochronous" : "interrupt",
-                  direction ? "in" : "out", address);
-             continue;
+         else if (transfer_type == USB_ENDPOINT_TYPE_ISOCHRONOUS)
+         {
+           DBG (5, "sanei_usb_open: found isochronous-%s endpoint (address 
0x%02x)\n",
+                direction ? "in" : "out", address);
+           if (direction)      /* in */
+             {
+               if (devices[devcount].iso_in_ep)
+                 DBG (3, "sanei_usb_open: we already have a isochronous-in 
endpoint "
+                      "(address: 0x%02x), ignoring the new one\n",
+                      devices[devcount].iso_in_ep);
+               else
+                 devices[devcount].iso_in_ep = endpoint->bEndpointAddress;
+             }
+           else
+             {
+               if (devices[devcount].iso_out_ep)
+                 DBG (3, "sanei_usb_open: we already have a isochronous-out 
endpoint "
+                      "(address: 0x%02x), ignoring the new one\n",
+                      devices[devcount].iso_out_ep);
+               else
+                 devices[devcount].iso_out_ep = endpoint->bEndpointAddress;
+             }
            }
-       }
+         else if (transfer_type == USB_ENDPOINT_TYPE_CONTROL)
+         {
+           DBG (5, "sanei_usb_open: found control-%s endpoint (address 
0x%02x)\n",
+                direction ? "in" : "out", address);
+           if (direction)      /* in */
+             {
+               if (devices[devcount].control_in_ep)
+                 DBG (3, "sanei_usb_open: we already have a control-in 
endpoint "
+                      "(address: 0x%02x), ignoring the new one\n",
+                      devices[devcount].control_in_ep);
+               else
+                 devices[devcount].control_in_ep = endpoint->bEndpointAddress;
+             }
+           else
+             {
+               if (devices[devcount].control_out_ep)
+                 DBG (3, "sanei_usb_open: we already have a control-out 
endpoint "
+                      "(address: 0x%02x), ignoring the new one\n",
+                      devices[devcount].control_out_ep);
+               else
+                 devices[devcount].control_out_ep = endpoint->bEndpointAddress;
+             }
+         }
+        }
+     }   
 #else /* not HAVE_LIBUSB */
       DBG (1, "sanei_usb_open: can't open device `%s': "
           "libusb support missing\n", devname);
@@ -782,9 +849,11 @@
       /* Should only be done in case of a stall */
       usb_clear_halt (devices[dn].libusb_handle, devices[dn].bulk_in_ep);
       usb_clear_halt (devices[dn].libusb_handle, devices[dn].bulk_out_ep);
+      usb_clear_halt (devices[dn].libusb_handle, devices[dn].iso_in_ep);  
       /* be careful, we don't know if we are in DATA0 stage now */
       usb_resetep(devices[dn].libusb_handle, devices[dn].bulk_in_ep);
       usb_resetep(devices[dn].libusb_handle, devices[dn].bulk_out_ep);
+      usb_resetep(devices[dn].libusb_handle, devices[dn].iso_in_ep);  
 #endif
       usb_release_interface (devices[dn].libusb_handle, 
                             devices[dn].interface_nr);
@@ -944,7 +1013,7 @@
 {
   if (dn >= MAX_DEVICES || dn < 0)
     {
-      DBG (1, "sanei_usb_control_msg: dn >= MAX_DEVICES || dn < 0\n");
+      DBG (1, "sanei_usb_control_msg: dn >= MAX_DEVICES || dn < 0, dn=%d\n", 
dn);
       return SANE_STATUS_INVAL;
     }
 
@@ -1016,6 +1085,7 @@
 {
   ssize_t read_size = 0;
 
+  DBG (1, "sanei_usb_read_int: enter\n");
   if (!size)
     {
       DBG (1, "sanei_usb_read_int: size == NULL\n");
@@ -1080,5 +1150,7 @@
   *size = read_size;
   if (debug_level > 10)
     print_buffer (buffer, read_size);
+
+  DBG (1, "sanei_usb_read_int: exit\n");
   return SANE_STATUS_GOOD;
 }

--=-/h28pJ5/9YoLVmckZHXc--


Reply via email to