Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Здравствуйте. Подскажите пожалуйста получилось ли у вас что-нибудь в итоге? Есть ли подвижки?
Да, удалось практически всё, что было нужно - чтение и установка параметров, чтение данных.
В итоге, какие-то данные со входов получили, вывели на экран. Следующим шагом должна была стать проверка их правильности.
Возможно, ещё нужно было корректировать полученные данные с использованием калибровочных коэффициентов.
На этом этапе проект остановился из-за человеческого фактора )))
Все нужные части исходников библиотеки 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 за ответы на вопросы.
DeviceIoControl так пакет формирует для DIOC_SEND_COMMAND
...
Пожалуйста, подскажите как в драйвере формируются пакеты для остальных запросов?
DIOC_GET_PARAMS
DIOC_RESET_PIPE1
DIOC_RESET_PIPE3
DIOC_ABORT_PIPE1
DIOC_ABORT_PIPE3
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.
Всё для этого нашел в исходниках.
Через 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
те надо не bulkTransfer, а controlTransfer я думаю.
Спасибо!
Правильно ли я понимаю, что LUsbApi взаимодействует с драйвером устройства? Исходя из документации это Ldevusbu.sys.
Если это так, тогда не получится написать взаимодействие с устройством на Андроиде без знаний, что делает драйвер с командами и с ответами?
Получилось сделать несколько шагов. Устройство успешно находится из кодов на андроиде (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 };
Здравствуйте.
Нужно подключить 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?
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск