LINUX.ORG.RU

Работа с USB-serial в нативной программе

 , ,


0

1

Возникла мысль использовать дешевый Android-планшет для управления самодельным прибором (если ставить на планшет Linux это может быть сложно или будут проблемы с драйверами, особенно графическими).

У FTDI есть некие преобразователи с поддержкой Android, там упоминается Java. Но вот вопрос: а я смогу это использовать через QSerialPort в программе Qt 5 на Android? У кого есть опыт?

P.S. Пока что рабочий вариант это процессорный модуль с тач-LCD от Starterkit.

У FTDI есть некие преобразователи с поддержкой Android

Предположу, что речь о стандартных FT232 & Co.

Но вот вопрос: а я смогу это использовать через QSerialPort в программе Qt 5 на Android? У кого есть опыт?

Через Qt опыта нет. Но теоретически есть минимум два необходимых условия: ядро должно быть собрано с CONFIG_USB_SERIAL_FTDI_SIO=m. И после загрузки должны быть выставлены правильные права. Тогда для QSerialPort этот виртуальный последовательный порт не будет отличаться от настоящего, и почему бы ему не работать?

дешевый Android-планшет

Т.е. на нём есть root? Тогда можно сделать всё что угодно, почти.

gag ★★★★★ ()
Ответ на: комментарий от gag

Вот с драйвером как раз неясно. Ихнее Java-четотам не предполагает драйвер, нужен просто порт USB-OTG или host. А дальше оно магически работает и так.

Вероятно, мне проще взять эту жабную штуку и как-то скрестить ее со своей Qt-программой, тем более проект Qt для Android как раз при сборке состоит еще и из жабных частей, допускающих взаимодействие.

А в ядре всегда можно включить поддержку FTDI, только мне кажется я помру в попытках его пересобрать, запихнуть, да еще дать устройству нужные права...

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Вот с драйвером как раз неясно. Ихнее Java-четотам не предполагает драйвер, нужен просто порт USB-OTG или host. А дальше оно магически работает и так.

Так же как libusb, который можно найти работающий на андроиде без рута. Т.е. с небольшой помощью андроидной джавы.

Вероятно, мне проще взять эту жабную штуку

А, может, она регистрируется как сервис? Тогда это самый простой путь.

gag ★★★★★ ()
Ответ на: комментарий от ncuxer

Что дает этот проект? Почитал и не понял.

т.е. я могу рутануть планшет и засунуть туда libusb, и потом работать из своей программы на Qt 5? Мне этот вариант подходит тоже, если я хочу устройство не с протоколом FTDI а со своим собственным.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Ну, если рут - это не проблема, то можно использовать и QSP (я пробовал на Android x86). Только нужно проверить, что девайс /dev/ttyUSB* создается при втыкании любого FTDI-шного шнурка. Или, по крайней мере, что ядро его опознает (установить на планшет какую нить консольку и через нее посмотреть). Можно где-нить «стыбзить» готовый модуль *.ko для ARMv7 и попробовать его подгрузить на девайсе (хз, поможет или нет)...

Но, обычно, как я знаю (вроде как) с любыми USB девайсами можно работать из Java в режиме OTG. В андройде (> 3.0) есть вроде нужное API, нужно просто знать спеку на конкретный чип чтобы читать/писать в нужные эндпойнты и прочее (это по идее то-же самое что и использовать LibUSB).

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

tldr; да, по идее можешь.

В общем про проект: Это небольшой враппер над libusb для работы с лазерным проектором, рут не требуется.

Если тебе нужно только для себя и ты можешь поставить рут, то ты по идее можешь использовать libusb_get_device_list.

Если без рута, то смотри *_android.cpp файл, там целая цепочка - сначала через jni, потом через новый вызов из пропатченной версии libusb libusb_get_device2 берем ссылку на девайс.

Еще libusb_claim_interface и libusb_set_interface_alt_setting без рута не работают и делается в андроидной версии через jni.

Также проверь, чтобы OTG в дешевом планшете работал. У меня на некоторых устройствах OTG работал только через отдельную док-станцию.

ncuxer ()
Ответ на: комментарий от ncuxer

сначала через jni, потом через новый вызов из пропатченной версии libusb libusb_get_device2 берем ссылку на девайс.

Вот так я и делал. Годы прошли, а этот маленький патчик всё ещё не принят в libusb. «libusb_get_device2» да «libusb_open2» - это, конечно, не очень элегантно, но стоковый андроид не оставляет выбора. Вот так вот тупо игнорировать нерутованные андроиды, коих большинство, - дикость.

gag ★★★★★ ()
Ответ на: комментарий от gag

Пусть будет рут, это не пользовательский планшет, а как часть прибора.

Грусть по поводу невключения поддержки нерутованных планшетов разделяю, но для моей задачи не проблема, т.к. прибор не должен полагаться на наличие планшета у пользователя (составная часть образно говоря).

Это рабочий вариант? т.е. тупо libusb на рутованый планшет, а дальше из нативного кода (например Qt5) просто дергать функции? Как раз вот думаем, взять usb-uart или всё же USB на самом МК поднять (есть надежда на помощь в этом вопросе)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

А у меня как раз был фокус в том, чтобы промышленную железку можно было подключить к обычному смартфону пользователя, и оно просто работало.

Если рут есть, то тогда можно попробовать обойтись вообще без патча и возни с intent'ами в джава, а воспользоваться официальной инструкцией. Тогда отличий в дёргании функций от дистрибутива линукса быть не должно.

usb-uart

Тогда надо будет ещё собирать libftdi (там всего два файла, можно самому Makefile написать).

gag ★★★★★ ()
Последнее исправление: gag (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Ну а при втыкании, сам девайс /dev/ttyUSB(ACM)* или что-то там появляется? Может и не нужны будут всякие libusb?

kuzulis ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.