Android USB Host API: размер буфера массовой передачи

Я пишу программное обеспечение для связи между планшетом(Motorola Xoom с версией Android 4.0.3 и ядром версии 2.6.39.4) и периферийным устройством с использованием USB Host API предоставлено Android. Я использую только два типа связи:

  • control: controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
  • bulk: bulkTransfer(конечная точка UsbEndpoint, byte[] буфер, длина int, тайм-аут int)

Передача управления работает нормально, но у меня проблема с массовой передачей. Я могу использовать только 32768 в качестве размера буфера для функции bulkTransfer.Невозможно использовать меньше или больше. Я знаю, что не могу использовать больше из-за ограничения буферного канала (размер: 32769 байт).

Это периферийное устройство передает данные, которые неправильно считываются функцией bulkTransfer. Я предполагаю, что некоторые данные потеряны.

Я нахожу это:В Linux Если процесс пытается читать из пустого канала (буфера), то read(2) блокируется до тех пор, пока данные не будут доступны. Если процесс пытается записать в полный канал, то write(2) блокируется до тех пор, пока из канала не будет прочитано достаточно данных для завершения записи.

Исходя из этого, мое объяснение проблемы состоит в том, что некоторые данные не записываются в канал (буфер) из-за флага блокировки, установленного функцией write(2). Я прав? Если это правда, я мог бы изменить буфер канала.

  1. Мое первое решение этой проблемы — увеличенный буфер. Для ядро >= 2.6.35, вы можете изменить размер канала с помощью fcntl(fd, F_SETPIPE_SZ, size) , но как мне найти fd(дескриптор файла) для USB трубы?
  2. Второй вариант — использовать ulimit -p SIZE, но параметр pдля моего ядра не для канала, а для процесса.

Кто-нибудь сталкивался с такой же проблемой, есть решения?

13
задан syntagma 4 March 2018 в 23:28
поделиться