2012-12-21 2 views
7

나는 안드로이드 개발에 상당히 익숙하며 최근에 Usb 호스트를 탐구 해왔다.Android 개발 USB 전송

대량 전송을 사용하여 내게 외부 카메라가 보는 것을 볼 수 있지만 내 태블릿에 표시하는 방법은 누구에게 말해 줄 수 있습니까?

카메라 : 캐논 파워 샷 A1300 태블릿 : ICONIA의 A200

내가 스택 오버 플로우 및 다른 포럼 둘러 보았다했지만 아직 대량 전송을 사용하는 또는 어떤 상수를 사용하는 방법에 대한 좋은 설명을 찾을 수 없어 특정 데이터를 검색하기위한 매개 변수로 사용됩니다.

엔드 포인트를보고 외부 카메라와의 연결을 설정할 수 있지만 여기에서 어디로 가야할지 잘 모릅니다.

도움을 주시면 감사하겠습니다.

답변

14

안드로이드의 USB 호스트 API는 상당히 얇기 때문에 일단 인터페이스/끝점을 열거하고 연결을 만드는 것을 넘어 서면 도움을 줄 수 있습니다. 그런 다음 원시 USB 데이터 전송과 통신하는 영역에 있으며이 형식은 카메라가 나타내는 장치 클래스에 따라 다릅니다. 귀하의 요청은 다소 웜이 될 수 있으므로 유용한 리소스를 제공하기 위해 최선을 다할 것입니다.

불행히도 저장 장치 및 미디어 장치는 해석 할 수있는 가장 간단한 장치 클래스가 아니므로 일반적으로 USB를 사용하는 경우 어려울 수 있습니다. 내가 제공 할 수있는 가장 좋은 조언은 카메라가보고하는 인터페이스 클래스 (대부분 대용량 저장 장치 또는 MTP)에 대한 장치 클래스 사양을 살펴 보는 것입니다. 여기에는 http://www.usb.org/developers/devclass_docs

이 나열되어 있습니다. 장치와 통신하는 데 사용해야하는 명령 또한 USB 요청을 체크 아웃하는 것이 좋습니다.이 작업은 USB 요청이 어떻게 생성되는지를 잘 보여 주며, 이는 사양 문서에 표시되는 내용을 UsbDeviceConnection의 메서드에있는 매개 변수에 매핑하는 데 도움이 될 수 있습니다. http://www.beyondlogic.org/usbnutshell/usb1.shtml

처음에는 카메라를 설정하기 위해 "끝점 0"에 보내는 제어 명령이 많으며 나머지 전송은 대량 끝점에서 발생할 수 있습니다.

Android 용어로 제어 요청은 UsbDeviceConnection.controlTransfer()을 사용하여 동 기적으로 만 전송 될 수 있습니다. 이는 전송이 완료 될 때까지이 방법이 차단됨을 의미합니다. 이 메소드에서 채우는 매개 변수는 디바이스 클래스의 스펙 문서에 있습니다.

대량 엔드 포인트에 대한 요청은 UsbRequest 인스턴스를 사용하여 UsbDeviceConnection.bulkTransfer()을 통해 동 기적으로 또는 비동기 적으로 전송할 수 있습니다. UsbRequest을 사용하면 전송을 대기열에 넣은 다음 나중에 결과를 확인 (UsbDeviceConnection.requestWait() 경유) 할 수 있습니다.

내 Github 페이지에서 호스트 API를 사용하여 몇 가지 기본적인 인터럽트 및 제어 전송을 수행하여 장치 설명자와 같은 정보를 얻을 수있는 몇 가지 예가 있습니다. 아마도 그 중 일부는뿐만 아니라 당신에게 도움이 될 것입니다 :의 USB 예제 코드에 대한 질문에 관해서 https://github.com/devunwired/accessory-samples


:

이 코드에서 만든 요청을 그냥 일반적인 "GET 구성 설명자"입니다 모든 USB 장치가 응답해야한다는 요청 (클래스 명령이 아닌 핵심 명령).사실, Android API가 인터페이스 및 끝점에 대해 쿼리 할 수있는 정보를 얻는 요청입니다. 필드 값은 코어 USB 사양 (이 명령은 특히 3.0 스펙의 9.4.3 및 9.6.3 절에 정의되어 있습니다) : http://www.usb.org/developers/docs/ 또는 좀 더 자세한 정보가있는 USB에서보다 유용한 설명을 찾을 수 있습니다 토론 : http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors

길이는 다소 임의적입니다.이 값은 드라이버에게 읽거나 쓸 바이트 수를 알려줍니다. 대부분의 USB 호스트 드라이버는 먼저 장치가 지원하는 최대 패킷 크기를 호스트에 알리는 필드를 포함하는 장치 설명자를 쿼리 한 다음 해당 크기를 이후 요청의 길이로 사용합니다. 모든 기능을 갖춘 드라이버가이 명령을 작성한 다음 길이가 가장 큰 바이트 (먼저 설명자의 wTotalLength 필드)를 검사하여 버퍼가 충분히 큰지 확인하고 그렇지 않은 경우 수정/다시 전송하십시오. 이 예에서 프로토콜이 지원 가능한 것으로 정의하는 "최대"최대 패킷 크기이기 때문에 단순성을 위해 64를 선택했습니다.

다시 말해, 기기가 제공해야하는 특정 데이터에 대한 요청을하는 경우 해당 명령은 핵심 사양이 아닌 특정 클래스 문서에서 찾을 수 있습니다.

+0

나는 이전에 퍼진 로직 사이트를 둘러 보았고 많은 것을 해석하는 데 약간의 어려움을 겪었으며 그것의 안드로이드 부분과의 관계를 찾을 수 없었다. 해당 장치가있는 것으로 확인되었습니다. public static final int USB_CLASS_STILL_IMAGE 이제 spec을 pdf로 파고 찾아 볼 수 있습니다. 다시 한번 감사 드리겠습니다. (잘하면 고생하지 않을 것입니다!) –

+0

표준 장치 요청의 유용성을 찾는 데 어려움을 겪고 있습니다. 모든 장치에 메타 데이터를 제공하는 것처럼 보이기 때문입니다. 내가 이것을 잘못 읽고 있니? 클래스, 하위 클래스 및 프로토콜 코드와 각각의 끝점 데이터를 기록했지만 카메라가 장치에 보내는 내용을 전송하기위한 관련 명령을 아직 발견하지 못했습니다. –

+0

이 정보는 디바이스 클래스 스펙 문서에 포함되어 있습니다. 스틸 이미지는 내가 링크 된 사이트에 나열되어 있거나 여기에 해당 클래스 문서에 대한 직접 링크가 있습니다. 특히 섹션 7에서는 이미지 캡처 작업을위한 워크 플로에 대해 설명합니다. http://www.usb.org/developers/devclass_docs/usb_still_img10.pdf – Devunwired