On Sep 24, 2010, at 9:43 PM, Arjen de Korte wrote:

> Citeren "Brian R. Smith" <[email protected]>:
> 
>> Should megatec_usb.c/set_data_krauler just skip the "usb" subdriver function 
>> table and go straight for usb_get_string?  Or should the usb subdriver be 
>> extended with a call that doesn't go through usb_get_string_simple?
> 
> The 'megatec_usb' driver is no longer maintained and has been replaced by the 
> 'blazer_usb' driver. This uses direct calls to the libusb library, so the fix 
> you recommend should be much easier to implement. Please post some debug 
> output before and after making these changes by running the driver with -DDD 
> enabled (not more).

Ah, thanks for that.  Yes, blazer_usb is a better place for the change.  Sorry 
I didn't notice it earlier.

Here's debug output, from before:
====================================================================
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
   0.000000     debug level is '3'
   0.118093     Checking device (1D6B/0001) (005/001)
   0.118164     - VendorID: 1d6b
   0.118177     - ProductID: 0001
   0.118188     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118199     - Product: UHCI Host Controller
   0.118209     - Serial Number: 0000:00:1d.3
   0.118220     - Bus: 005
   0.118230     Trying to match device
   0.118256     Device does not match - skipping
   0.118273     Checking device (1D6B/0001) (004/001)
   0.118317     - VendorID: 1d6b
   0.118328     - ProductID: 0001
   0.118339     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118350     - Product: UHCI Host Controller
   0.118362     - Serial Number: 0000:00:1d.2
   0.118372     - Bus: 004
   0.118383     Trying to match device
   0.118395     Device does not match - skipping
   0.118411     Checking device (1D6B/0001) (003/001)
   0.118453     - VendorID: 1d6b
   0.118465     - ProductID: 0001
   0.118476     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118487     - Product: UHCI Host Controller
   0.118498     - Serial Number: 0000:00:1d.1
   0.118508     - Bus: 003
   0.118519     Trying to match device
   0.118531     Device does not match - skipping
   0.118546     Checking device (0001/0000) (002/002)
   0.124522     - VendorID: 0001
   0.124540     - ProductID: 0000
   0.124550     - Manufacturer: unknown
   0.124561     - Product: unknown
   0.124572     - Serial Number: unknown
   0.124583     - Bus: 002
   0.124594     Trying to match device
   0.124633     Device matches
   0.127542     Trying megatec protocol...
   0.127559     send: Q1
   0.130530     read: error sending control message: Broken pipe
   0.133511     Stall condition cleared
   0.133523     blazer_status: short reply
   0.133536     Status read 1 failed
   0.133547     send: Q1
   0.149536     read: error sending control message: Broken pipe
   0.152559     Stall condition cleared
   0.152600     blazer_status: short reply
   0.152617     Status read 2 failed
   0.152634     send: Q1
   0.155557     read: error sending control message: Broken pipe
   0.158531     Stall condition cleared
   0.158553     blazer_status: short reply
   0.158565     Status read 3 failed
   0.158576     Trying mustek protocol...
   0.158587     send: QS
   0.158599     read: QS
   0.158609     blazer_status: short reply
   0.158620     Status read 1 failed
   0.158631     send: QS
   0.158641     read: QS
   0.158652     blazer_status: short reply
   0.158663     Status read 2 failed
   0.158674     send: QS
   0.158685     read: QS
   0.158696     blazer_status: short reply
   0.158707     Status read 3 failed
   0.158717     Trying megatec/old protocol...
   0.158728     send: D
   0.158738     read: D
   0.158749     blazer_status: short reply
   0.158760     Status read 1 failed
   0.158771     send: D
   0.158781     read: D
   0.158792     blazer_status: short reply
   0.158803     Status read 2 failed
   0.158814     send: D
   0.158824     read: D
   0.158835     blazer_status: short reply
   0.158846     Status read 3 failed
   0.158857     No supported UPS detected
====================================================================

And after:
====================================================================
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
   0.000000     debug level is '3'
   0.118088     Checking device (1D6B/0001) (005/001)
   0.118160     - VendorID: 1d6b
   0.118172     - ProductID: 0001
   0.118182     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118193     - Product: UHCI Host Controller
   0.118204     - Serial Number: 0000:00:1d.3
   0.118219     - Bus: 005
   0.118232     Trying to match device
   0.118257     Device does not match - skipping
   0.118275     Checking device (1D6B/0001) (004/001)
   0.118319     - VendorID: 1d6b
   0.118331     - ProductID: 0001
   0.118342     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118353     - Product: UHCI Host Controller
   0.118364     - Serial Number: 0000:00:1d.2
   0.118374     - Bus: 004
   0.118385     Trying to match device
   0.118397     Device does not match - skipping
   0.118413     Checking device (1D6B/0001) (003/001)
   0.118455     - VendorID: 1d6b
   0.118467     - ProductID: 0001
   0.118477     - Manufacturer: Linux 2.6.32-24-generic uhci_hcd
   0.118488     - Product: UHCI Host Controller
   0.118499     - Serial Number: 0000:00:1d.1
   0.118510     - Bus: 003
   0.118520     Trying to match device
   0.118532     Device does not match - skipping
   0.118548     Checking device (0001/0000) (002/002)
   0.124095     - VendorID: 0001
   0.124115     - ProductID: 0000
   0.124126     - Manufacturer: unknown
   0.124136     - Product: unknown
   0.124147     - Serial Number: unknown
   0.124158     - Bus: 002
   0.124168     Trying to match device
   0.124208     Device matches
   0.127113     Trying megatec protocol...
   0.127131     send: Q1
   0.133087     blazer_status: short reply
   0.133104     Status read 1 failed
   0.133116     send: Q1
   0.414304     Status read in 2 tries
   0.414328     Supported UPS detected with megatec protocol
   0.414340     send: F
   0.571288     Ratings read in 1 tries
   0.571313     send: I
   0.774349     Vendor information read in 1 tries
   0.774377     Battery runtime will not be calculated (runtimecal not set)
   0.774402     send: Q1
   1.054571     dstate_init: sock /var/state/ups/blazer_usb-DynamixUPS open on 
fd 5
   1.054609     send: Q1
   1.059418     read: timeout
   1.059432     blazer_status: short reply
   1.059444     Communications with UPS lost: status read failed!
   3.056628     send: Q1
   3.336276     Communications with UPS re-established
   5.058367     send: Q1
   7.060107     send: Q1
   7.064567     read: timeout
   7.064582     blazer_status: short reply
   7.064593     Communications with UPS lost: status read failed!
   9.062118     send: Q1
   9.342426     Communications with UPS re-established
  11.062258     send: Q1
  13.063998     send: Q1
  15.065761     send: Q1
  17.067520     send: Q1
  17.072148     read: timeout
  17.072163     blazer_status: short reply
  17.072175     Communications with UPS lost: status read failed!
  19.069533     send: Q1
  19.326997     Communications with UPS re-established
  21.071296     send: Q1
  23.073059     send: Q1
  25.074820     send: Q1
  27.076584     send: Q1
  29.078351     send: Q1
  31.080117     send: Q1
  33.081884     send: Q1
  35.083655     send: Q1
  37.085429     send: Q1
  39.087206     send: Q1
  41.088984     send: Q1
  43.090759     send: Q1
  43.339563     blazer_status: non numerical value [27.0]
  45.092528     send: Q1
  47.094300     send: Q1
  49.096050     send: Q1
  51.097802     send: Q1
  53.099556     send: Q1
  55.101309     send: Q1
  57.103065     send: Q1
  57.107474     read: timeout
  57.107489     blazer_status: short reply
  57.107501     Communications with UPS lost: status read failed!
  59.105087     send: Q1
  59.391341     Communications with UPS re-established
  61.106825     send: Q1
^C  63.022253   Signal 2: exiting
====================================================================

The communication gets lost/restored often, but it works.

The diffs aren't complicated - it's the guts of usb_get_string_simple 
repurposed:
====================================================================
*** blazer_usb.c.orig   2010-02-12 10:43:23.000000000 +1300
--- blazer_usb.c        2010-09-25 13:43:09.523546405 +1200
***************
*** 233,238 ****
--- 233,239 ----
        };
  
        int     i;
+       char tbuf[255]; /* Some devices choke on size > 255 */
  
        upsdebugx(3, "send: %.*s", (int)strcspn(cmd, "\r"), cmd);
  
***************
*** 244,257 ****
                }
  
                for (retry = 0; retry < 10; retry++) {
!                       int     ret;
! 
!                       ret = usb_get_string_simple(udev, command[i].index, 
buf, buflen);
  
                        if (ret <= 0) {
                                upsdebugx(3, "read: %s", ret ? usb_strerror() : 
"timeout");
                                return ret;
                        }
  
                        /* "UPS No Ack" has a special meaning */
                        if (!strcasecmp(buf, "UPS No Ack")) {
--- 245,279 ----
                }
  
                for (retry = 0; retry < 10; retry++) {
!                       int     ret, di, si;
!       
!                       //ret = usb_get_string_simple(udev, command[i].index, 
buf, buflen);
!                       // Most of the guts of usb_get_string_simple, but 
eliminated
!                       // request for languages - seems to confuse stoopid UPS
!                       ret = usb_get_string(udev, command[i].index, 0x0409, 
tbuf, sizeof(tbuf));
  
                        if (ret <= 0) {
                                upsdebugx(3, "read: %s", ret ? usb_strerror() : 
"timeout");
                                return ret;
                        }
+                       if (tbuf[1] != USB_DT_STRING)
+                               return -EIO;
+                       
+                       if (tbuf[0] > ret)
+                               return -EFBIG;
+                   
+                       for (di = 0, si = 2; si < tbuf[0]; si += 2)
+                       {
+                               if (di >= (buflen - 1))
+                                       break;
+               
+                               if (tbuf[si + 1])       /* high byte */
+                                       buf[di++] = '?';
+                               else
+                                       buf[di++] = tbuf[si];
+                       }
+               
+                       buf[di] = 0;
  
                        /* "UPS No Ack" has a special meaning */
                        if (!strcasecmp(buf, "UPS No Ack")) {
====================================================================

Take care,
--
Brian R. Smith
[email protected]




_______________________________________________
Nut-upsdev mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/nut-upsdev

Reply via email to