Scubapro Aladin Square
Linus Torvalds
torvalds at linux-foundation.org
Tue Nov 14 12:04:55 PST 2017
On Tue, Nov 14, 2017 at 11:57 AM, Jef Driesen <jef at libdivecomputer.org> wrote:
>
> I suspect this is not caused by a difference in the libusb version, but a
> difference in the subsurface branch of libdivecomputer. If you look at the
> g2.log of the successful download on Windows, then you can clearly see
> libdivecomputer is sending out 33 byte packets (1 byte report id and 32
> bytes payload).
.. but that's _exactly_ the usb library difference. On Windows, it's
using hidapi instead. Just a library difference.
> So somehow the subsurface branch doesn't use the right size.
> It's probably the csize+1 in this code:
That "+1" should only trigger for GATT, since packet_size is 64 for usbhid, see
static dc_custom_io_t custom = {
.packet_size = 64,
.packet_close = usbhid_packet_close,
.packet_read = usbhid_packet_read,
.packet_write = usbhid_packet_write,
};
in dc_usbhid_custom_io().
That said, the part that *should* trigger:
> status = io->packet_write(io, buf, sizeof(buf), &transferred);
Already has that "sizeof(buf)", which is TX_PACKET_SIZE.
The reason it is then turned into 31 is because of this in src/usbhid.c:
// Skip a report id of zero.
unsigned char report = buffer[0];
if (report == 0) {
buffer++;
length--;
}
and that's because at least _my_ usblib doesn't need/want that extra
report byte.
I'm not sure if it hurts, though. So maybe that code could be disabled.
Linus
More information about the subsurface
mailing list