touch MAX

получи максимум — личный блог "тыж программиста"

Ошибка: FAILED: CMakeFiles/flash при попытке прошить ESP32 через idf.py в WSL Windows

Убил два вечера, пытаясь прошить ESP32 на виртуальной машине Ubuntu (wsl) в Windows. Оказалось в итоге, что wsl версии 2 не поддерживает подключенные USB устройства внутри виртуальной машины.

При попытке прошить платку командой ( где ttyS3 соответствует номеру COM3 порта в виндовс)

idf.py flash -p /dev/ttyS3 -b 921600

Получал ошибку Input/output error, вот полный лог:

Executing action: flash
Running ninja in directory /mnt/d/projects/git/esp32-ble2mqtt/build
Executing "ninja flash"…
[2/8] cd /mnt/d/projects/git/esp32-ble2mqtt/build/esp-idf/esptool_py && /root/.espressif/python_env/i…2mqtt/build/partition_table/partition-table.bin /mnt/d/projects/git/esp32-ble2mqtt/build/ble2mqtt.bi
ble2mqtt.bin binary size 0x148bd0 bytes. Smallest app partition is 0x180000 bytes. 0x37430 bytes (14%) free.
[5/8] Performing build step for 'bootloader'
[1/1] cd /mnt/d/projects/git/esp32-ble2mqtt/build/bootloader/esp-idf/esptool_py && /root/.espressif/python_env/idf4.4_py3.8_env/bin/python /root/esp/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /mnt/d/projects/git/esp32-ble2mqtt/build/bootloader/bootloader.bin
Bootloader binary size 0x6350 bytes. 0xcb0 bytes (11%) free.
[5/6] cd /root/esp/esp-idf/components/esptool_py && /usr/bin/cmake -D IDF_PATH="/root/esp/esp-idf" -D…d/projects/git/esp32-ble2mqtt/build" -P /root/esp/esp-idf/components/esptool_py/run_serial_tool.cmak
esptool.py esp32 -p /dev/ttyS3 -b 921600 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 bootloader/bootloader.bin 0x10000 ble2mqtt.bin 0x8000 partition_table/partition-table.bin 0xd000 ota_data_initial.bin 0x310000 fs_0.bin 0x350000 fs_1.bin
esptool.py v3.2-dev
Serial port /dev/ttyS3
Traceback (most recent call last):
File "/root/.espressif/python_env/idf4.4_py3.8_env/lib/python3.8/site-packages/serial/serialposix.py", line 398, in _reconfigure_port
orig_attr = termios.tcgetattr(self.fd)
termios.error: (5, 'Input/output error')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/root/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 4930, in
_main()
File "/root/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 4923, in _main
main()
File "/root/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 4370, in main
esp = esp or get_default_connected_device(ser_list, port=args.port, connect_attempts=args.connect_attempts,
File "/root/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 122, in get_default_connected_device
_esp = chip_class(each_port, initial_baud, trace)
File "/root/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 326, in init
self._port = serial.serial_for_url(port)
File "/root/.espressif/python_env/idf4.4_py3.8_env/lib/python3.8/site-packages/serial/init.py", line 90, in serial_for_url
instance.open()
File "/root/.espressif/python_env/idf4.4_py3.8_env/lib/python3.8/site-packages/serial/serialposix.py", line 332, in open
self._reconfigure_port(force_update=True)
File "/root/.espressif/python_env/idf4.4_py3.8_env/lib/python3.8/site-packages/serial/serialposix.py", line 401, in _reconfigure_port
raise SerialException("Could not configure port: {}".format(msg))
serial.serialutil.SerialException: Could not configure port: (5, 'Input/output error')
CMake Error at run_serial_tool.cmake:56 (message):
/root/.espressif/python_env/idf4.4_py3.8_env/bin/python
/root/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32
failed
FAILED: CMakeFiles/flash
cd /root/esp/esp-idf/components/esptool_py && /usr/bin/cmake -D IDF_PATH="/root/esp/esp-idf" -D SERIAL_TOOL="/root/.espressif/python_env/idf4.4_py3.8_env/bin/python /root/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32" -D SERIAL_TOOL_ARGS="--before=default_reset --after=hard_reset write_flash @flash_args" -D WORKING_DIRECTORY="/mnt/d/projects/git/esp32-ble2mqtt/build" -P /root/esp/esp-idf/components/esptool_py/run_serial_tool.cmake
ninja: build stopped: subcommand failed.
ninja failed with exit code 1

Что я только не делал и обновлял виртуальную машину, и менял скорости порта, и по всякому нажимал на кнопки BOOT и EN на ESP32. Оказалось в итоге, что wsl версии 2 не поддерживает подключенные USB устройства внутри виртуальной машины. Проверить это можно в PowerShell командой

wsl -l -v

Для того чтобы «пробросить» COM порт с хостовой машины (windows) в виртуальную (ubuntu), нужно скачать бесплатную утилиту hub4com. Утилита запускается из командой строки и пробрасывает все данные через протокол TCP, нужно скачать и запустить BAT файл командой

com2tcp-rfc2217.bat COM3 5555

где COM3 это порт к которому подключен ESP32, а 5555 любой свободный порт на хостовой машине.

Для прошивки внутри виртуальной машине Linux теперь нужно будет соединяться с новым проброшенным виртуальным портом:

idf.py flash -p rfc2217://192.168.1.68:5555 -b 921600

где 192.168.1.68 это IP адрес хостовой машины

После этого прошивка успешно завершается!

,