2012-12-21 21 views
7

私はAndroid開発にはかなり新しく、最近私はUsbホストを探求しています。Android開発USB転送

バルク転送の使い方を教えてもらえますか?外部のカメラが見るものを見ることができますが、代わりにタブレットに表示します。

カメラ:キヤノンのPowerShot A1300 タブレット:ICONIA A200

私はスタックオーバーフローといくつかの他のフォーラムを中心に見てきましたが、まだバルク転送を使用するか、どのような定数を使用する方法についての良い説明を見つけることができませんでした特定のデータを検索するためのパラメータとして使用します。

エンドポイントを確認して外部カメラとの接続を確立できましたが、ここからどこに行くのかはわかりません。

ご協力いただきありがとうございます。

答えて

14

AndroidのUSBホストAPIは非常に薄いため、インターフェース/エンドポイントを列挙して接続を作成することができれば、それ以上のことはできません。あなたは生のUSBデータ転送と通信することになります。フォーマットはカメラのデバイスクラスに依存します。あなたのリクエストは多少ワームの可能性があるので、私は有益なリソースを提供するために最善を尽くします。

残念なことに、ストレージデバイスとメディアデバイスは、最も簡単なデバイスクラスではありません。そのため、一般的にはUSBを濡らすだけでは難しいかもしれません。私が与えることができる最良のアドバイスは、あなたのカメラが報告するインターフェイスクラスのデバイスクラス仕様(大部分はMass StorageかMTPのいずれか)を見てみることです。http://www.usb.org/developers/devclass_docs

specドキュメントでは、デバイスとの通信に使用するコマンド。私はまた、USBの要点をチェックすることをお勧めします。これは、USB要求がどのように構築されているかを指摘するうえで役に立ちます。具体的には、仕様文書に表示されているものをUsbDeviceConnectionのメソッドにあるパラメータにマップできます。 http://www.beyondlogic.org/usbnutshell/usb1.shtml

最初にカメラを設定するために「エンドポイント0」に送信する必要がある制御コマンドが数多くあり、残りの転送は大量のエンドポイントで行われる可能性があります。

Androidの制御要求は、UsbDeviceConnection.controlTransfer()を使用して同期的に送信することができます。これは、転送が完了するまでこのメソッドがブロックされることを意味します。このメソッドを満たすパラメータは、デバイスクラスのspecドキュメントにあります。

バルクエンドポイントのリクエストは、UsbRequestインスタンスを使用してUsbDeviceConnection.bulkTransfer()または非同期で同期して送信できます。 UsbRequestを使用すると、転送をキューに入れてから、後で(UsbDeviceConnection.requestWait()を介して)結果を確認することができます。

ホストAPIを使用して、デバイス記述子のような情報を取得するための基本的な割り込みと制御転送を行うGithubページの例がいくつかあります。おそらく、そのうちのいくつかは同様にあなたに役立つでしょう:USBのコード例についてのご質問に関してhttps://github.com/devunwired/accessory-samples


このコードで行われた要求は、単に一般的な「ゲットコンフィギュレーション・ディスクリプタ」でありますすべてのUSBデバイスが応答しなければならないことを要求します(クラス固有ではなく、コアコマンドです)。実際、Android APIがインターフェイスとエンドポイントについて問い合わせることができる情報を取得するリクエストです。フィールド値はCore USB Specification(このコマンドは具体的には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 私は仕様書を今すぐ掘り下げて見つけてください。 もう一度おねがいします(うまくいけば私は立ち往生しません) –

+0

標準のデバイスリクエストの有用性は、デバイスのメタデータを与えるだけなので、少し問題があります。私はこれを間違って読んでいますか? クラス、サブクラス、プロトコルコードとそれぞれのエンドポイントデータを書き留めましたが、カメラがデバイスに見えるものを送信するための関連するコマンドはまだ検出されていません。 –

+0

この情報は、デバイスクラス仕様書に記載されています。静止画像は、リンク先のサイトに掲載されています。または、ここにそのクラス文書への直接リンクがあります。具体的には、第7章では画像キャプチャを使用するワークフローについて説明します。http://www.usb.org/developers/devclass_docs/usb_still_img10.pdf – Devunwired

関連する問題