Interfejs API hosta USB systemu Android: rozmiar bufora przesyłania masowego

Piszę oprogramowanie dokomunikować się między tabletem (Motorola Xoom z Androidem w wersji 4.0.3 i Kernel w wersji 2.6.39.4)oraz urządzenie peryferyjne z interfejsem API hosta USB dostarczone przez Android. Używam tylko dwóch rodzajów komunikacji:

kontrola: controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)objętość: bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

Transfer kontroli działa dobrze, ale mamproblem z przesyłaniem zbiorczym. Mogę użyć tylko 32768 jako wielkości bufora dla funkcji bulkTransfer. Nie można użyć mniej lub więcej. Wiem, że nie mogę użyć więcej z powodu ograniczenia rury buforowej (rozmiar: 32769 bajtów).

To urządzenie peryferyjne przesyła dane, które nie są poprawnie odczytywane przez funkcję bulkTranfer. Przypuszczam, że niektóre dane zostaną utracone.

Znajduję to:W Linuksie Jeśli proces próbuje odczytać z pustej rury (bufora), to read (2) zablokuje się, dopóki dane nie będą dostępne. Jeśli proces próbuje zapisać do pełnej potoku, napisz (2) bloki, dopóki nie zostaną odczytane wystarczające dane z potoku, aby umożliwić zakończenie zapisu.

I na tej podstawie moje wyjaśnienie problemu polega na tym, że niektóre dane nie są zapisywane w potoku (buforze) z powodu flagi blokującej utworzonej przez funkcję write (2). Mam rację? Jeśli to prawda, mogę zmienić bufor rury.

Moim pierwszym rozwiązaniem tego problemu jest większy bufor.Dla jądra> = 2.6.35 możesz zmienić rozmiar potokufcntl(fd, F_SETPIPE_SZ, size) ale jak mogę znaleźćfd (deskryptor pliku) dla rur USB?Druga opcja to użycieulimit -p SIZE ale parametrp moje jądro nie jest przeznaczone dla potoku, ale dla procesu.

Czy ktoś napotkał ten sam problem, jakieś rozwiązania?

questionAnswers(5)

yourAnswerToTheQuestion