2011-11-01 2 views
11

사용자 토지의 USB 오디오 장치와 인터페이스하려고합니다. 현재 장치가 완전히 열거되어 있고 인터페이스를 설정하고 0이 아닌 대역폭 대체 인터페이스에 대체 인터페이스를 설정했습니다.사용자 모드 장치 간 USB 등시 전송

먼저 libusb와 같은 것을 사용할 수 없다고 말해야합니다. 필자는 Linux의 USB 장치 파일 시스템을 통해이 작업을 수행했습니다.

그래서 등시성 데이터를 수신 할 준비가되었음을 알 수 있습니다. 그러나 등시 전송을 수행하는 방법에 대한 정보는 거의 찾을 수 없습니다.

내가 말할 수있는 것은 내가 usbdevfs_urb 구조체를 채울 필요가 있지만이 구조체를 정확히 채우는 방법을 정확히 알지 못합니다. 나는이 구조를 작성 일단 또한

, 내가 바로 생각에 나는 다음과 같은 호출해야 이니 일단 내가 사용 완료 요청을 기다릴 수 제출 후

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

USBDEVFS_REAPURBNDELAY 

REAPURBNDELAY의 경우 정확히 전달해야하는 매개 변수는 무엇입니까?

내가 올바른 나무를 짖고 있습니까?

모든 정보는 크게 감사하겠습니다.

미리 감사드립니다.

편집 :

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; 

Unfgortunately이 나에게 -28 (ENOSPC)의 오류를 제공 다음과 같이

내가 등시성 전송을 시도합니다.

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

왜 나는 USB 버스 대역폭이 충분하지 않은지 이해할 수 없습니다. USB 포트는 1 개 뿐이며 내 장치가 유일한 장치입니다.

의견이 있으십니까?

+0

왜 libusb를 사용할 수 없습니까? –

+0

@ 짐 클레이 문제의 특정 플랫폼이 안드로이드이고 오픈 파일 디스크립터가 이미 있는데 권한으로 인해 libusb를 사용하여 장치를 열 수 없습니다 ... – Goz

+0

안녕하세요, 현재 Goz를 해결하려고합니다. 같은 문제 - 안드로이드에서의 등시성 전송의 문제, libusb 피하기. 작업 코드 샘플을 게시하는 방법이 있습니까? 내 고집 포인트는 현재 struct 정의와 요청 값입니다. 너 어디서 소싱하는거야? 미리 감사드립니다. – Gusdor

답변

5

좋아, 문제는 안드로이드 OS가 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

libusb를 사용하지 않는 유일한 이유는 사용자가 직접 USB 장치를 열 수는 없지만 가리키는 파일 설명자가 있다는 것입니다.

이것이 모두 올바른 경우, 파일 설명자를 인수로 취하고 struct usb_device *를 사용하는 usb_open() 함수를 다시 구현하는 대신 libusb에있는 모든 것을 다시 구현하려고하는 이유는 무엇입니까? libusb usb_open() 소스 코드에서 대부분의 코드를 가져 와서 나머지는 libusb를 사용할 수 있습니다.

+0

그렇다면 LGPL 라이센스를 파기합니다 ... – Goz

+2

LGPL에 대한 귀하의 문제를 이해할 수 없으며, 독점 소프트웨어를 개발하고 있습니까? 이 경우에도 GPL 라이브러리가 아닌 LGPL 라이브러리와 링크 할 수 있습니다. 내가 올바르게 기억한다면, 당신이 가진 유일한 의무는 다른 도서관과 연결하는 방법을 제공하는 것입니다. 동적으로 링크 된 바이너리를 배포하는 경우 아무런 문제가 없습니다. 정적으로 링크 된 바이너리를 제공하는 경우 바이너리의 객체 파일을 제공해야 사람들이 다른 것과 쉽게 다시 연결할 수 있습니다. –

+0

아아아 나는 그 선택을하지 못한다. – Goz

1

나는 사용자 모드 USB 등시성 전송을위한 자바 클래스를 작성했습니다 : UsbIso

이 IOCTL 호출을 통해 USBFS API에 액세스 할 수 JNA를 사용합니다.

+0

멋진 북마크 됨 :) – Goz