ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1212295
Nikolay_Po (29.05.2022 21:01 - 01.06.2022 12:00, просмотров: 2809)
[РЕШЕНО]. Обнаружил, что драйвер для 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