Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 18.10.2021 14:15:44

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 за ответы на вопросы.

#2 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 29.08.2021 00:38:47

PoulCh пишет:

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

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

DIOC_GET_PARAMS
DIOC_RESET_PIPE1
DIOC_RESET_PIPE3
DIOC_ABORT_PIPE1
DIOC_ABORT_PIPE3

#3 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 14.08.2021 01:42:53

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.
Всё для этого нашел в исходниках.

#4 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 12.08.2021 01:23:46

Через 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

#6 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 08.08.2021 14:43:49

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

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

#7 Re: Техническая поддержка » L-Card E14-140M подключение к Андроиду » 08.08.2021 00:55:48

Получилось сделать несколько шагов. Устройство успешно находится из кодов на андроиде (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 };

#8 Техническая поддержка » L-Card E14-140M подключение к Андроиду » 28.07.2021 23:36:50

Anatoliy2
Ответов: 14

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

Нужно подключить 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?

Контакты

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

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

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

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