Scubapro Aladin Square

Linus Torvalds torvalds at linux-foundation.org
Tue Nov 14 12:14:59 PST 2017


On Tue, Nov 14, 2017 at 12:02 PM, vavincavent <vavincavent at gmail.com> wrote:
> I do : vincent at ASUS-R558UV:~/src/subsurface/build$ sudo tshark -i
> usbmon1 -s 256 -w /tmp/usb.pcap
> Running as user "root" and group "root". This could be dangerous.
> Capturing on 'usbmon1'
> 3794 ^C
>
> then connecting the square
> then testing download
> then : vincent at ASUS-R558UV:~/src/subsurface/build$ sudo udevadm control
> --reload-rules
> then : testing downlod
> then stop tshark

Thanks.

And now I see:

  Frame 2637: 95 bytes on wire (760 bits), 95 bytes captured (760
bits) on interface 0
  USB URB
      [Source: host]
      [Destination: 1.62.2]
      URB id: 0xffff97a01200d3c0
      URB type: URB_SUBMIT ('S')
      URB transfer type: URB_INTERRUPT (0x01)
      Endpoint: 0x02, Direction: OUT
      Device: 62
      URB bus id: 1
      Device setup request: not relevant ('-')
      Data: present (0)
      URB sec: 1510689518
      URB usec: 339270
      URB status: Operation now in progress (-EINPROGRESS) (-115)
      URB length [bytes]: 31
      Data length [bytes]: 31
      [Response in: 2638]
      [bInterfaceClass: HID (0x03)]
      Unused Setup Header
      Interval: 8
      Start frame: 0
      Copy of Transfer Flags: 0x00000000
      Number of ISO descriptors: 0
  Leftover Capture Data: 011000000000000000000000000000000000000000000000...

which is what I see with my G2 too. Thanks to getting the earlier
packets, it shows that bInterfaceClass etc correctly, and I see the
endpoints too (they are in the opposite order from the G2 - your IN
endpoint is #1, and out is #2)

But still no actual reply.

How about you disable that report byte code removal that I pointed out
to Jef, in src/usbhid.c:

        // Skip a report id of zero.
        unsigned char report = buffer[0];
        if (report == 0) {
                buffer++;
                length--;
        }

and basically disable the report byte games by doing

        unsigned char report = 1;

instead of reading "buffer[0]".

(or alternatively, just remove the code, but then remember to also
remove this part:

        if (report == 0) {
                nbytes++;
        }

which fakes out nbytes).

Maybe your version of libusb really wants that zero report byte like
hidapi does. Or maybe it's that the device really really wants to see
at least 32 bytes of data (the odd Windows thing sends out 33 bytes,
which is really odd, but whatever).

               Linus


More information about the subsurface mailing list