[РЕШЕНО]. Обнаружил, что драйвер для Linux поддерживает только
bulk-режим передачи для данных. Драйвер для Windows - поддерживает
Interrupt. Устройство работает только в режиме Interrupt. В обоих
ОС конфигурация устройства одинаковая. Шаги настройки одинаковые до
момента оформления подписки URB данных. В момент регистрации очереди данных, ядро ругается на несоответствие типа канала (pipe) типу конечной точки (endpoint), на точку с Interrupt пытается подключиться канал Bulk.
Покопался в исходном коде, добавил массу отладочного вывода из модуля ядра, докопался до сути проблемы и прикинул, что, пожалуй, можно переписать драйвер на Interrupt - обмен. Но в конкретном проекте, при сжатых сроках, не платят за это.
Проблема решилась переводом устройства в режим HIDraw. Дальше данные забираю из кодов клавиш. Бонус - для сканера это режим по-умолчанию и работает после сброса на заводские.
Исходное моё обращение ниже.
Прошу помощи с USB. Есть устройство. Беспроводной сканер
штрих-кодов с собственным USB-приёмопередатчиком. Если коротко:
COM-порт в Windows работает, в Linux - нет. Нужно разобраться.
Что имеем:
1. Есть устройство, беспроводной сканер штрих-кодов. Один из его возможных режимов работы - виртуальный ком-порт. Учитывая, USB-донгл может быть или USB-HID, или VCP, можно предположить, что китайцы заложили туда эмуляцию CH340, и там не этот чип, а какой-нибудь условный ESP с радиоинтерфейсом 2.4ГГц.
2. Сейчас нужно наладить работу в режиме VCP, под Linux. Нужно поднять последовательный порт на хосте Linux, дальше буду пробрасывать данные по IP на виртуальный COM-порт в Windows. Идея, как пробросить последовательный порт, есть. Вариант с USB-HID не отбрасываю, но как получить данные по USB-HID и передать их в COM-порт Windows - идей пока нет.
3. В Windows всё работает. Используется штатный драйвер CH340. То, что отсканировал сканер, передаётся в терминал, открывший ком-порт.
4. В Linux успешно загружается драйвер ch341. Успешно открывается порт. Но, похоже, открывается не тот поток (или что там у USB) и никаких данных на порту не видно.
Вот что происходит при переходе донгла в режим ком-порта:
[ 2772.731828] usb 2-1: USB disconnect, device number 6
[ 2773.047959] usb 2-1: new full-speed USB device number 7 using ohci-platform
[ 2773.141835] ch341 2-1:1.0: ch341-uart converter detected
[ 2773.174002] usb 2-1: ch341-uart converter now attached to ttyUSB0
Пакетики USB идут, но терминал, открывший dev/ttyUSB0, данных не видит. Тишина.
Делал дампы с USB. Можно сравнить Windows и Linux. Но, к сожалению, я ничего не понимаю. Помогите, у кого глаз намётан. Пожалуйста.
Вот дампы, картинки, pcap во вложении.
В Windows, с момента включения устройства в диспетчере устройств, так (сразу видно больше всего при включении происходит):

В Линукс, после вставки донгла и перехода его из HID в VCP по команде сканера, так:

В общем, план понять, в чём разница, затем залезть в исходник драйвера, примерно, такой:
https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c
и поправить, если порог сложности не превысит возможностей.
Спасибо!
Windows…n_Disconnect_Disable_fltd.pcapng
Linux_C…ion_fltd.pcapng