× К оглавлению На главную Об авторе

Дата и время публикации:    
Дата и время модификации:

Проблема и решение

1. Суть проблемы

Заключается в пробросе последовательного порта в эмуляторе Qemu, запускаемого в окружении сборочной машины Yocto-poky:

Механизм проброса последовательного порта USB хозяйской машины для пользователя эмулятора Qemu достаточно прозрачен и сводится к программной симуляции микросхемы FTDI FT232BM, которая стала доступной с версии ядра Linux-3.0.

Кроме того, также будет показана возможность перенаправление консоли гостевой операционной системы, запущенной на ВМ эмулятора Qemu, на последовательный порт USB хозяйской машины (Host machine), на которой развернут гипервизор KVM c эмулятором Qemu сборочной машины Yocto-poky .

2. Пути решения

В листинг 2.1 показано объявление программной симуляции эмулятором Qemu устройства последовательного порта USB.

Листинг 2.1. Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf

...
qb_opt_append = ... -chardev serial,path=/dev/ttyUSB1,id=extusbserial -device usb-serial,chardev=extusbserial
...

Как показано в листинге 2.1, к переменной qb_opt_append, используемую механизмом загрузки эмулятора Qemu Boot (QB) сборочной машины Yocto-poky [3.3], последовательно добавляются опции -chardev и -device . В первой, опции -chardev, указывается путь, path=/dev/ttyUSB2, к последовательному порту USB на хозяйской машине (host machine), на которой запущен гипервизор KVM/Qemu, а во второй, опции -device, — сам механизм проброса usb-serial, и идентификатор chardev=extusbserial, реализуемый с помощью программной симуляции микросхемы FTDI FT232BM

В результате , как показано в дампе 2.2, утилита lsusb должна показать наличие драйвера FTDI FT232BM

Дамп 2.2. Выполнение команды lsusb на гостевой ОС

root@qemuarmv5:~# lsusb
Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd 
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Далее, проверяем вывод ядра Linux в момент конфигурации, который должен содержать что-то похоже, показанное в дампе 2.3

Дамп 2.3. Фрагмент вывода команды dmesg на гостевой ОС

root@qemuarmv5:~# dmesg | more 
...
[    7.696751] ftdi_sio 1-2:1.0: FTDI USB Serial Device converter detected
[    7.701975] usb 1-2: Detected FT232BM
[    7.712988] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0
...

В случае, если ничего подобного не будет найдено предлагаю проверить и при необходимости выполнить процедуру настройки конфигурации ядра в сборочной машины Yocto-poky, которая отличается от той, что описывал для версии Linux-5.0 дистрибутива Debian

Дамп 2.4. Вывода всех доступных устройств последовательных портов

root@qemuarmv5:~# ls -l /dev |  grep "ttyA\|ttyS\|ttyU"
crw-------    1 root     tty       204,  64 Oct 14 09:08 ttyAMA0
crw--w----    1 root     root      204,  65 Oct 14 09:06 ttyAMA1
crw-rw----    1 root     dialout   204,  66 Oct 14 09:06 ttyAMA2
crw-rw----    1 root     dialout   204,  67 Oct 14 09:06 ttyAMA3
crw-rw----    1 root     dialout   188,   0 Oct 14 09:06 ttyUSB0

В качестве бонуса — привожу проброс последовательного порта USB консоли гостевой операционной системы, который дает больше информации чем сама консоль управления эмулятора Qemu и выполняется с использованием двух опций -chardev и -serial, как показано в дампе 2.5

Листинг 2.5 Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf

 
...
qb_opt_append = ... -chardev serial,path=/dev/ttyUSB0,id=usbhostserial -serial chardev:usbhostserial ...
...

При запуске Qemu от обычного пользователя (qemu:///session), а не суперпользователя (qemu:///system), может возникнуть ошибка, связанная с правами доступа к специальному файлу устройства /dev/ttyUSB0, как показано в дампе 2.6

Дамп 2.5. Фрагмент вывода ошибки с нарушением прав доступа к ttyUSB0

 
$ runqemu
...
runqemu - ERROR - Failed to run qemu: qemu-system-arm: -chardev serial,path=/dev/ttyUSB0,id=usbhostserial: Could not open '/dev/ttyUSB0': Permission denied

runqemu - INFO - subnet: "192.168.7", tap0
runqemu - INFO - Cleaning up
Set 'tap0' nonpersistent

На гостевой ОС создал файл правил /etc/udev/rules.d/01-ttyusb.rules и добавил в него следуюшее правило `KERNEL=="ttyUSB[0-9]*", OWNER="user" GROUP="dialup"`.

В Qemu поддерживается возможность перенаправления I/O консоли с использованием сетевых технологий — протокола telnet

Листинг 2.1. Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf

...
QB_OPT_APPEND += "-chardev socket,id=netserial,host=192.168.7.2,port=32123,server,telnet -serial chardev:netserial"
... 

В QEMU, на стороне центрального узла, на котором запущена гостевая ОС, с ip:192.168.7.2 и номером сетевого порта 32123 будет поднят сервер, который устанавливает соединения по протоколу telnet и перенаправляет на него весь ввод/вывод с консоли гостевой ОС. При этом, сначала нужно создать бэкенд абстракции "chardev" с id=netserial на центральном узле, которое будет ожидать подключение клиентов со стороны центрального узла по протоколу telnet, а затем фронтентед, в роли которой вытупает последовательный порт "serial" на гостевой ОС.[3.5]

3. Библиография

3.1 QEMU. USB emulation

3.2 FTDI.Virtual COM Port Drivers

3.3 MetaLayer openembedded-core::qemuboot.bbclass

3.4 Technical Note TN_132 Adding FTDI Devices VCP Driver Support to Android[PDF]

3.5 Is it possible to access -chardev without going via -serial in qemu?

Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

Об авторе можно прочитать здесь.

Copyright © 2015-2019 Андрей Ржавсков