Пользовательский режим USB изохронная передача с устройства на хост - PullRequest
11 голосов
/ 01 ноября 2011

В настоящее время я пытаюсь подключиться к аудиоустройству USB из земли пользователя. В настоящее время устройство полностью перечислено, и я установил интерфейс и установил альтернативный интерфейс для интерфейса с альтернативным интерфейсом без нулевой полосы пропускания.

Во-первых, я должен сказать, что не могу использовать что-либо вроде libusb. Я должен сделать это через файловую систему USB-устройства Linux.

Итак, насколько я могу судить, я готов начать получать изохронные данные. Однако я могу найти очень мало информации о том, как сделать изохронную передачу.

Из того, что я могу сказать, мне нужно заполнить структуру usbdevfs_urb, но я совершенно не уверен, как именно заполнить эту структуру.

Кроме того, как только я заполнил эту структуру, я правильно понял, что мне нужно вызвать следующее:

int retSubmit   = ioctl( fd, USBDEVFS_SUBMITURB, &usbRequest );

, а затем после отправки я могу дождаться завершения запроса, используя

USBDEVFS_REAPURBNDELAY

В случае REAPURBNDELAY, какой именно параметр мне нужно передать?

Я даже лаю на правильное дерево?

Любая информация будет высоко оценена.

Заранее спасибо!

Edit:

Я пытаюсь выполнить изохронную передачу следующим образом:

usbdevfs_urb&   urbRequest      = *(usbdevfs_urb*)malloc( 384 );
urbRequest.type                 = USBDEVFS_URB_TYPE_ISO;
urbRequest.endpoint             = mpEndpoint->GetEndpointAddress();//mpEndpoint->GetEndpointIndex();
urbRequest.status               = 0;
urbRequest.flags                = USBDEVFS_URB_ISO_ASAP;
urbRequest.buffer               = pData;
urbRequest.buffer_length        = 0;
urbRequest.actual_length        = 0;
urbRequest.start_frame          = 0;
urbRequest.number_of_packets    = 1;
urbRequest.error_count          = 0;
urbRequest.signr                = 0;
urbRequest.usercontext          = pData;

usbdevfs_iso_packet_desc* pIsoPacketDesc    = &urbRequest.iso_frame_desc[0];
pIsoPacketDesc->length          = 384;
pIsoPacketDesc->actual_length   = 0;
pIsoPacketDesc->status          = 0;

К сожалению, это дает мне ошибку -28 (ENOSPC).

<7>[ 3184.243163] usb 1-1: usbfs: usb_submit_urb returned -28

Я не могу понять, почему не хватит пропускной способности шины USB. Есть только 1 порт USB, и мое устройство является единственным подключенным к нему устройством.

Есть мысли?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

Хорошо, так что получается, что проблема связана с тем, что ОС Android поместила HID-драйвер для обработки HID-элементов управления. Это, кажется, блокирует пропускную способность. Отсоединение этих драйверов от интерфейсов HID освобождает полосу пропускания, позволяя продолжить изохронную передачу.

Вы отключаете драйвер ядра, выполняя следующие действия:

usbdevfs_ioctl command;
command.ifno        = mpInterface->GetInterfaceNumber();
command.ioctl_code  = USBDEVFS_DISCONNECT;
command.data        = NULL;

int ret = ioctl( fd, USBDEVFS_IOCTL, &command );

В остальном то, что я сделал, правильно.

3 голосов
/ 06 ноября 2011

Я понимаю, что единственная причина, по которой вы не используете libusb, заключается в том, что вы не можете открыть USB-устройство самостоятельно, но у вас есть файловый дескриптор, указывающий на него.

Если это все правильно, почему вы пытаетесь повторно реализовать все, что есть в libusb, вместо того, чтобы просто заново реализовать функцию usb_open (), которая бы принимала файловый дескриптор в качестве аргумента и вашу структуру usb_device *. Вы можете взять большую часть кода из исходного кода libusb usb_open () и использовать libusb для остальных.

1 голос
/ 30 января 2015

Я написал класс Java для пользовательского режима USB-изохронной передачи: UsbIso

Он использует JNA для доступа к USBFS API черезIOCTL звонит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...