Форум: Техническая поддержка

Тема: L-Card E14-140M подключение к Андроиду

Вы не вошли.

 Поиск | Регистрация | Вход 

28.07.2021 23:36:50
#1

Участник
Здесь с 28.07.2021
Сообщений: 8

L-Card E14-140M подключение к Андроиду

Здравствуйте.

Нужно подключить L-CardE14-140M к Андроиду через USB.
Тему 2015 года видел - https://www.lcard.ru/forums/viewtopic.p … 451#p59451

Просьба подсказать, как можно сделать такое подключение?

Правильно ли я понял, что для подключения к Андроиду нужно реализовать lusbapi в нужном объёме с использованием Android SDK?
Предположительно вот этой секции SDK https://developer.android.com/guide/top … html?hl=ru

Не нашел, где скачать исходники lusbapi?

28.07.2021 23:55:16
#2

Участник
Здесь с 28.07.2021
Сообщений: 1

Re: L-Card E14-140M подключение к Андроиду

Привет по моему вот ссылка с архивом
https://www.lcard.ru/download/modulesviewer13.exe

29.07.2021 14:04:36
#3

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,473

Re: L-Card E14-140M подключение к Андроиду

Самораспаковывающийся архив  библиотеки Lusbapi v.3.4 с исходными текстами, примерами и и т.д.

08.08.2021 00:55:48
#4

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

Получилось сделать несколько шагов. Устройство успешно находится из кодов на андроиде (java). Получаем информацию об устройстве, получаем точки IN и OUT, получаем доступ к устройству (открытие устройства успешно выполняется).

Но не получается обменяться данными с устройством.

По аналогии кодов из Lusbapi пытают отработать команды:
                V_GET_USB_SPEED         = 6
                V_GET_MODULE_NAME      = 11

Формирую 8-байтную команду в JAVA так:
       byte[] data = new byte[8];
       byte v = 0x06; // V_GET_USB_SPEED

       data[0] = 0x00;
       data[1] = 0x01;

       data[2] = v;       
       data[3] = 0x00;

       data[4] = 0x00;
       data[5] = 0x00;

       data[6] = 0x00;
       data[7] = 0x00;

и передаю в устройство через UsbEndpoint типа USB_DIR_OUT таким вызовом:
        int bytesWritten = mConnection.bulkTransfer(mEndpointWrite, Arrays.copyOfRange(data, 0, 8), 8, getWriteTimeout());

Функция успешно отрабатывает. Возвращается, что 8 байта записано.
После выполняется попытка чтения из устройства через UsbEndpoint типа USB_DIR_IN:
        int res = mConnection.bulkTransfer(mEndpointRead, data, 1, getReadTimeout());

Ни одного байта не удалось прочитать.

Может возникнут какие-нибудь идеи, почему не работает обмен данными с устройством?
Нужны ли какие-нибудь инициализирующие команды для начала обмена данными с устройством?

Ещё некоторые нюансы:
- команды формировал как показано выше и с обратной последовательностью байт и с обратной последовательностью слов - не помогает. Вот все варианты:
  10600000
  00006010
  01060000
  00000601
- запись/чтение выполняются в отдельном потоке (как и прописано в документации)
- UsbPoint могут быть следующих типов
   USB_ENDPOINT_XFER_CONTROL (endpoint zero)
   USB_ENDPOINT_XFER_ISOC (isochronous endpoint)
   USB_ENDPOINT_XFER_BULK (bulk endpoint)
   USB_ENDPOINT_XFER_INT (interrupt endpoint)
   Для точек устройства возвращается тип USB_ENDPOINT_XFER_BULK, поэтому пытаемся читать/писать через bulkTransfer.
   Но, возможно, с устройством нужно работать в другом режиме?
- для справки, как формируется 4-батная команда в Lusbapi:
   WORD InBuf[4] = { 0x01, V_GET_USB_SPEED, 0x00, 0x00 };

08.08.2021 14:43:49
#5

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

Правильно ли я понимаю, что LUsbApi взаимодействует с драйвером устройства? Исходя из документации это Ldevusbu.sys.

Если это так, тогда не получится написать взаимодействие с устройством на Андроиде без знаний, что делает драйвер с командами и с ответами?

09.08.2021 09:53:51
#6

Участник
Здесь с 20.10.2020
Сообщений: 32

Re: L-Card E14-140M подключение к Андроиду

LUsbApi работает через драйвер ldevusbu.sys. принцип там такой. через ControlPipe передаются медленные  команды это DiviceIoControl и там пакет InBuf[4] и возврат данных массивом (см GetArray PutArray), а когда сконфигурирован потоковый ввод или вывод, то используется ReadFile WriteFile для откачки данных и это уже по BulkPipe.

09.08.2021 09:57:49
#7

Участник
Здесь с 20.10.2020
Сообщений: 32

Re: L-Card E14-140M подключение к Андроиду

те надо не bulkTransfer, а controlTransfer я думаю.

09.08.2021 20:58:21
#8

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

PoulCh пишет:

те надо не bulkTransfer, а controlTransfer я думаю.

Спасибо!

12.08.2021 01:23:46
#9

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

Через mConnection.controlTransfer(...) успешно вызываем и получаем корректный ответ на стандартные USB запросы:
GET_STATUS (0x00) и GET_DESCRIPTOR (0x06)
https://www.beyondlogic.org/usbnutshell … etupPacket

Параметры заполнялись так:

GET_STATUS
    bmRequestType = 128  = b1000 0000 (Direction 1 = Device to Host, Type 0 = Standard, Recipient 0 = Device)
    bRequest = 0
    wValue = 0
    wIndex = 0

сам вызов

int transferred = mConnection.controlTransfer(128, 0, 0, 0, ....)

  - возвращает 2 байта, как и положено

GET_DESCRIPTOR
    bmRequestType =128  = b1000 0000 (Direction 1 = Device to Host, Type 0 = Standard, Recipient 0 = Device)
    bRequest = 6 
    wValue = 256  (wValueH = 01, wValueL=00, итого: 0x0100 = 256) The descriptor type is device (values defined in USB spec).
    wIndex = 0

сам вызов

 int transferred = mConnection.controlTransfer(128, 6, 256, 0, ....) 

- возвращает 18 байт с данными, как и положено


Сейчас пытаюсь отработать вендорную команду:

V_GET_MODULE_NAME = 11

В LUsbLib она объявлена так:

// номера доступных пользовательских запросов для USB устройств (vendor request)
enum {
  ...
  V_GET_MODULE_NAME = 11
};

При вызове V_GET_MODULE_NAME в LUsbApi используется ещё вот эта константа:

#define DIOC_SEND_COMMAND \
		CTL_CODE(FILE_DEVICE_UNKNOWN, 15, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

Сам вызов, если минимизировать:

WORD InBuf[4] = { 0x01, V_GET_MODULE_NAME, 0x00, 0x00 };
DeviceIoControl(hDevice, DIOC_SEND_COMMAND, InBuf, ...)

Пока не получается воспроизвести V_GET_MODULE_NAME через controlTransfer(...). Перебрал много вариантов с найденными константами, но ответа от устройства не удалось получить. Не понятно, какую константу в какой параметр нужно передать? Подскажите, пожалуйста
    Параметры: bmRequestType, bRequest, wValue, wIndex
    Константы: V_GET_MODULE_NAME, FILE_DEVICE_UNKNOWN, 15, METHOD_OUT_DIRECT, FILE_ANY_ACCESS, 0x01.
    Плюс константы для bmRequestType из документации: https://www.beyondlogic.org/usbnutshell … etupPacket

Скрытый текст

D7 Data Phase Transfer Direction
0 = Host to Device
1 = Device to Host
D6..5 Type
0 = Standard
1 = Class
2 = Vendor
3 = Reserved
D4..0 Recipient
0 = Device
1 = Interface
2 = Endpoint
3 = Other
4..31 = Reserved

12.08.2021 12:32:40
#10

Участник
Здесь с 20.10.2020
Сообщений: 32

Re: L-Card E14-140M подключение к Андроиду

DeviceIoControl так пакет формирует для DIOC_SEND_COMMAND

      WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(
                                                &Packet,
                                                (((PUSHORT)inBuf)[0] ?  BmRequestDeviceToHost : BmRequestHostToDevice ),
                                                BmRequestToDevice,
                                                (BYTE)(((PUSHORT)inBuf)[1]),  // cmd
                                                ((PUSHORT)inBuf)[2],          // addr value     
                                                ((PUSHORT)inBuf)[3]           // index len
                                               );

14.08.2021 01:42:53
#11

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

PoulCh пишет:

DeviceIoControl так пакет формирует для DIOC_SEND_COMMAND

Спасибо!

Команда V_GET_MODULE_NAME успешно отработала и вернула "E140".
Много всего пришлось поставить под Виндовс, чтобы запустить WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR )

Изучаю Lusbapi.h, Lusbapi.cpp, E140.h, E140.cpp
Следующее, что буду делать - хочу прочесть и расшифровать TLE140::MODULE_DESCRIPTOR или MODULE_DESCRIPTION_E140.
Всё для этого нашел в исходниках.

29.08.2021 00:38:47
#12

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

PoulCh пишет:

DeviceIoControl так пакет формирует для DIOC_SEND_COMMAND
...

Пожалуйста, подскажите как в драйвере формируются пакеты для остальных запросов?

DIOC_GET_PARAMS
DIOC_RESET_PIPE1
DIOC_RESET_PIPE3
DIOC_ABORT_PIPE1
DIOC_ABORT_PIPE3
31.08.2021 17:15:22
#13

Участник
Здесь с 20.10.2020
Сообщений: 32

Re: L-Card E14-140M подключение к Андроиду

первый запрос с usb не общается, можно не реализовывать. reset и abort вроде не имеют прямых аналогов в Android API
https://stackoverflow.com/questions/957 … -host-apis

03.10.2021 22:18:54
#14

Участник
Здесь с 03.10.2021
Сообщений: 1

Re: L-Card E14-140M подключение к Андроиду

Anatoliy2 пишет:

Здравствуйте.

Нужно подключить L-CardE14-140M к Андроиду через USB.
Тему 2015 года видел - https://www.lcard.ru/forums/viewtopic.p … 451#p59451

Просьба подсказать, как можно сделать такое подключение?

Правильно ли я понял, что для подключения к Андроиду нужно реализовать lusbapi в нужном объёме с использованием Android SDK?
Предположительно вот этой секции SDK https://developer.android.com/guide/top … html?hl=ru

Не нашел, где скачать исходники lusbapi?


Здравствуйте. Подскажите пожалуйста получилось ли у вас что-нибудь в итоге? Есть ли подвижки?

18.10.2021 14:15:44
#15

Участник
Здесь с 28.07.2021
Сообщений: 8

Re: L-Card E14-140M подключение к Андроиду

k0de пишет:

Здравствуйте. Подскажите пожалуйста получилось ли у вас что-нибудь в итоге? Есть ли подвижки?

Да, удалось практически всё, что было нужно - чтение и установка параметров, чтение данных.
В итоге, какие-то данные со входов получили, вывели на экран. Следующим шагом должна была стать проверка их правильности.
Возможно, ещё нужно было корректировать полученные данные с использованием калибровочных коэффициентов.

На этом этапе проект остановился из-за человеческого фактора )))

Все нужные части исходников библиотеки lcard были портированы как есть с переориентированием на свою прослойку для работы с USB устройством на андроиде:
- e140.h, e140.cpp
- lusbbase.h, lusbbase.cpp
- lusbapitypes.h, lusbapi_ext.h, lusbapi.h, ioctl.h, ErrorBaseIds.h

Единственное, за ненадобностью не реализовывали функцию:
    virtual BOOL WriteData(IO_REQUEST_LUSBAPI * const WriteRequest); // потоковая передача данных ЦАП в модуль

Спасибо @PoulCh за ответы на вопросы.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск