Вопрос или проблема
У меня есть клон Arduino Nano с чипом последовательного интерфейса CH340. Он отображается в lsusb как адаптер USB-Serial QinHeng Electronics HL-340, и когда он подключается, я вижу его в dmesg со следующим выводом:
[ 31.251098] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
[ 31.251544] vhci_hcd vhci_hcd.0: devid(65541) speed(2) speed_str(full-speed)
[ 31.252004] vhci_hcd vhci_hcd.0: Устройство подключено
[ 31.538489] vhci_hcd: скорость vhci_device не установлена
[ 31.608492] usb 1-1: новое устройство USB полной скорости номер 2, использующее vhci_hcd
[ 31.698522] vhci_hcd: скорость vhci_device не установлена
[ 31.768510] usb 1-1: Запрос SetAddress (2) к порту 0
[ 31.812328] usb 1-1: Обнаружено новое USB-устройство, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[ 31.812734] usb 1-1: Новые строки USB-устройства: Mfr=0, Product=2, SerialNumber=0
[ 31.813059] usb 1-1: Продукт: USB2.0-Serial
Но /dev/ttyUSB* отсутствует.
Спасибо.
На момент написания, причина отсутствия поддержки USB-последовательных устройств заключается в том, что их модули не включены в ядро WSL.
Вы можете скомпилировать собственное ядро WSL с модулями, выполнив следующие действия:
Вам могут понадобиться эти зависимости: sudo apt install build-essential flex bison libssl-dev libelf-dev dwarves libncurses-dev
Склонируйте репозиторий WSL2 с помощью: git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
Перейдите в папку WSL2-Linux-Kernel: cd WSL2-Linux-Kernel
Измените конфигурацию ядра, запустив make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl.
Перейдите в Device Drivers -> USB Support -> USB Serial Converter support и включите ваши драйверы здесь.
Семейство CP210x также распространено на платах разработчиков микроконтроллеров.
Вероятно, вы хотите включить их в ядро, так что нажмите y или пробел дважды, чтобы убедиться, что они включены с <*> вместо
Затем сохраните и выйдите из menuconfig и перезапишите config-wsl.
– Вам, вероятно, не следует использовать следующие зачеркивания, но они являются альтернативой предыдущим двум –
3. Измените файл config-wsl: nano Microsoft/config-wsl (или используйте ваш предпочитаемый редактор).
Перейдите к строке 2409 (shift+_ затем 2409 в nano) и замените # CONFIG_USB_SERIAL_CH341 is not set на CONFIG_USB_SERIAL_CH341=y
- Вы можете сделать то же самое для CONFIG_USB_SERIAL_CP210X – еще одного распространенного USB-последовательного адаптера.
Закройте текстовый редактор и сохраните (ctrl + x затем y затем enter в nano).
Соберите ядро, используя конфигурацию ядра WSL2: make KCONFIG_CONFIG=Microsoft/config-wsl
- Это может занять некоторое время
- Вы можете ускорить это с помощью аргумента -j, но не забудьте указать значение, например -j4
Скопируйте скомпилированное ядро в директорию вашего пользователя Windows: cp arch/x86/boot/bzImage /mnt/c/Users/<ваше-имя-пользователя>/wsl_kernel
Создайте файл в директории вашего пользователя Windows с именем .wslconfig и вставьте это в него:
[wsl2]
kernel = C:\\Users\\<ваше-имя-пользователя>\\wsl_kernel
Выключите WSL с помощью wsl –shutdown в командной строке Windows.
Откройте свой терминал WSL, и теперь вы должны иметь возможность подключать USB-последовательные устройства, как указано здесь.
И надеюсь, все должно работать!
(Проверено на Win10 и Win11 с дистрибутивом Ubuntu WSL2)
У Лео Бонда есть правильный ответ, но я не могу оставить комментарий из-за отсутствия репутации. Если ваш Ubuntu, похоже, не обновляется после редактирования файла .wslconfig, попробуйте удалить .wslconfig, а затем снова создать его в vi из WSL.
Мой Блокнот или Notepad++ вызвали какую-то ошибку форматирования, из-за которой WSL не смог прочитать .wslconfig и проигнорировал мои обновления ядра.
На момент написания:
Теперь в WSL2 с середины 2022 года(?) есть предварительно собранные модули, которые вы можете увидеть через
zgrep =m /proc/config.gz. В частности, есть модули для CH341 (работал у меня с CH340), CP210X, FTDI, которые покрывают большинство распространенных адаптеров USB-Serial. Загрузка через sudo modprobe ch341 и sudo modprobe usbserial сработали для меня. Проверьте с помощью lsmod и повторно проверьте dmesg.
@RShiver Я не могу проголосовать за вас, ни прокомментировать ваш пост из-за нехватки репутации.
Но я действительно хочу вас поблагодарить, так как sudo modprobe ftdi_sio действительно поддерживает FTDI4232H, который используется на плате разработчика, к которой я теперь наконец могу получить доступ из WSL2.
Вы не представляете, как трудно найти эту информацию в интернете.
Вывод dmesg:
[29493.050061] usbcore: зарегистрирован новый драйвер интерфейса ftdi_sio
[29493.050550] usbserial: зарегистрирована поддержка USB Serial для FTDI USB Serial Device
[29493.050977] ftdi_sio 1-2:1.0: Обнаружен конвертер FTDI USB Serial Device
[29493.051288] usb 1-2: Обнаружен FT4232H
[29493.052436] usb 1-2: Конвертер FTDI USB Serial Device теперь подключен к ttyUSB1
[29493.052942] ftdi_sio 1-2:1.1: Обнаружен конвертер FTDI USB Serial Device
[29493.053348] usb 1-2: Обнаружен FT4232H
[29493.054571] usb 1-2: Конвертер FTDI USB Serial Device теперь подключен к ttyUSB2
[29493.055006] ftdi_sio 1-2:1.2: Обнаружен конвертер FTDI USB Serial Device
[29493.055328] usb 1-2: Обнаружен FT4232H
[29493.056296] usb 1-2: Конвертер FTDI USB Serial Device теперь подключен к ttyUSB3
[29493.056723] ftdi_sio 1-2:1.3: Обнаружен конвертер FTDI USB Serial Device
[29493.057047] usb 1-2: Обнаружен FT4232H
[29493.058047] usb 1-2: Конвертер FTDI USB Serial Device теперь подключен к ttyUSB4
Чтобы облегчить подключение USB-устройств к WSL2, я теперь использую WSL USB Manager, который позволяет легко выбрать, какой порт перенаправлять.
Чтобы резюмировать все модули для пробирования большинства USB-последовательных адаптеров:
sudo modprobe ch341
sudo modprobe usbserial
sudo modprobe cp210x
sudo modprobe ftdi_sio
Ответ или решение
Решение проблемы: Устройство CH340 не отображается в /dev/ на WSL
Ваша проблема заключается в том, что USB-устройство Arduino Nano с чипом CH340 не отображается в подсистеме устройств /dev/
на Windows Subsystem for Linux (WSL). Вы уже сделали первые шаги к диагностике проблемы, так как устройство успешно определяется в lsusb
, и вы наблюдаете его активность с помощью вывода из dmesg
. Однако, отсутствие устройств вида /dev/ttyUSB*
указывает на недостаток поддержки USB-сериалов в WSL.
Причина проблемы
На момент написания этого текста основная проблема заключается в том, что модули для поддержки USB-сериальных устройств не включены в ядро WSL. Стандартная конфигурация ядра WSL не позволяет работать с дополнительными драйверами, необходимыми для правильного обнаружения этих устройств.
Решение проблемы
Для решения данной проблемы есть несколько методов, которые могут помочь вам подключить ваше USB-периферийное устройство в WSL. Рассмотрим наиболее эффективные способы:
-
Использование предустановленных модулей WSL2:
- На момент примерно середины 2022 года, в WSL2 были добавлены предустановленные модули для популярных USB-to-Serial адаптеров, таких как CH340, CP210X и FTDI. Вы можете проверить, включены ли необходимые модули, с помощью команды:
zgrep =m /proc/config.gz
- Если вы видите строки, связанные с
CONFIG_USB_SERIAL_CH341
,CONFIG_USB_SERIAL_CP210X
и другими, попробуйте загрузить модуль с помощью:sudo modprobe ch341 sudo modprobe usbserial sudo modprobe cp210x sudo modprobe ftdi_sio
- После этого проверьте, отображаются ли ваши устройства с помощью:
ls /dev/ttyUSB*
- На момент примерно середины 2022 года, в WSL2 были добавлены предустановленные модули для популярных USB-to-Serial адаптеров, таких как CH340, CP210X и FTDI. Вы можете проверить, включены ли необходимые модули, с помощью команды:
-
Компиляция собственного ядра WSL:
-
Если вы не нашли нужных модулей, можно скомпилировать собственное ядро WSL. Для этого выполните следующие шаги:
Установка зависимостей:
sudo apt install build-essential flex bison libssl-dev libelf-dev dwarves libncurses-dev
Клонирование репозитория WSL2:
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git cd WSL2-Linux-Kernel
Изменение конфигурации ядра:
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
В меню перейдите в раздел
Device Drivers -> USB Support -> USB Serial Converter support
, и включите нужные драйвера.Сборка ядра:
После выход из меню сохраните конфигурацию:
make KCONFIG_CONFIG=Microsoft/config-wsl
Это может занять некоторое время. Для ускорения сборки можно использовать:
make -j4 KCONFIG_CONFIG=Microsoft/config-wsl
Копирование и настройка конфигурации:
После завершения сборки скопируйте полученное ядро:
cp arch/x86/boot/bzImage /mnt/c/Users/<ваше-имя-пользователя>/wsl_kernel
Создайте файл
.wslconfig
в вашей домашней директории Windows:[wsl2] kernel = C:\\Users\\<ваше-имя-пользователя>\\wsl_kernel
Затем завершите работу WSL:
wsl --shutdown
-
-
Проверка конфигурации:
- Убедитесь, что вы правильно настроили файл
.wslconfig
. Некоторые текстовые редакторы могут вводить скрытые символы или проблемы форматирования. Если WSL не обновляется после редактирования, попробуйте удалить и заново создать файл.wslconfig
с использованием редактора Vi или Nano.
- Убедитесь, что вы правильно настроили файл
-
Использование WSL USB Manager:
- Для удобства работы с USB-устройствами в WSL очень рекомендую воспользоваться инструментом WSL USB Manager, который упрощает процедуру перенаправления USB-портов в WSL.
Заключение
Следуя указанным шагам, вы сможете настроить поддержку USB-сериалов в WSL, что позволит вашему Arduino Nano с чипом CH340 функционировать должным образом. На всякий случай, помните, что вы всегда можете обратиться к документации WSL и сообществу для получения дополнительной помощи и информации.
Если у вас возникли дополнительные вопросы или сложности, не стесняйтесь спрашивать!