mbed officialのUSBHostライブラリを少し読んでみました。
デバイスの自動認識とか、接続・切断の仕組みは難関なので後回しにして、
webcamで使われているisochronous転送を組み込むとしたら、
USBHost::transferCompleted()でTDのアドレスを見てTDかITDを区別するのが安全かな。
TDをメモリープールか切り出しているので判断しやすいです。
これは初期のLifeCamで実現していた手法です。
ITDなら、例えばITD_PROCESSED_EVENTを作って、rtosのmailで割り込みから飛ばせば、
USBHost::usb_process()スレッドで受け取れるので、対応するエンドポイントを探して、
ep->call()すれば、エンドポイントにattachしていた処理がコールバックされるので、
webcamからのパケットが受信できると思う。ただし、usb_process()スレッドでは
デバイスの接続、切断処理や、バルク転送、インタラプト転送もしているので、
他の処理に時間がかかるとisochronous転送が止まります。専用のスレッドで回すか、
ユーザのイベントループで受ける方法もあると思う。
USBEndpoint::init()でITDに対応するか、ITD専用のエンドポイントクラスを作るか。
td_list_ でTDを2つ渡されているが、どこで転送用のエンドポイントを作られているのだろう。
USBHost::usb_process()のDEVICE_CONNECTED_EVENTではコントロール転送のエンドポイントが
作られているのがわかります。
各デバイスクラスでバルク転送・インタラプト転送のエンドポイントは、
USBHost::parseConfDescr()でエンドポイントディスクリプタがみつかるたびに作られエンドポイントの
リストに保管されます。
各クラスでは、例えばマウスクラスUSBHostMouse::connect()でdev->getEndPoint(,INTERRUPUT_ENDPINT, IN...)が
呼ばれいて、deviceConnected::getEndPoint()では既に作られたエンドポイントのリストから検索しているだけです。
USBHost::enumrate()から呼ばれているが、getConfigurationDescriptorが400バイト固定長で
取得しているのはwebcamではたぶん足りないでしょう。もっともisochronous転送のエンドポイントは
現状では作られない。
connect()のタイミングでisochronous転送のエンドポイントを自前で作って転送を開始すればいいと思う。
(2013/3/16)
---
2013年3月16日土曜日
2013年2月12日火曜日
Qcam Orbit AFのExtension Unit(2)
次のサイトを見ると Qcam Orbit のモータ制御のExtension UnitのUnitIDは9、パン・チルトのCSは1です。
BaseUsbHostのBaseUvc::Control(SET_CUR,1,9<<8, ...)でコントロールを送ってみたら動いた。 ありがとうございます。カメラのAE等の操作の方法もわかりました。
注意しなければならないのはVideo Controlはinterface=0になります。probe commitのVideo Streamはinterface=1です。
厳密にはコンフィグレーションディスクリプタを読み取って決定する必要があります。
カメラの起動直後、リセット直後にコントロールを送るとエラーになる時がある。エラーが返ってもモータ動作する時がある。
5秒くらい待てばよさそうだが、これが正しい回避策なのかはわからない。STALLから復帰出来るようにしたほうがいいのかもしれない。
(2013/2/12)
---
BaseUsbHostのBaseUvc::Control(SET_CUR,1,9<<8, ...)でコントロールを送ってみたら動いた。 ありがとうございます。カメラのAE等の操作の方法もわかりました。
注意しなければならないのはVideo Controlはinterface=0になります。probe commitのVideo Streamはinterface=1です。
厳密にはコンフィグレーションディスクリプタを読み取って決定する必要があります。
カメラの起動直後、リセット直後にコントロールを送るとエラーになる時がある。エラーが返ってもモータ動作する時がある。
5秒くらい待てばよさそうだが、これが正しい回避策なのかはわからない。STALLから復帰出来るようにしたほうがいいのかもしれない。
(2013/2/12)
---
2013年2月11日月曜日
Qcam Orbit AFのExtension Unit(1)
LogitechのUSBカメラのQcamOrbitAFのパンチルドやフォーカスを操作するには、
UVCの機能を使うのではなくて、Extension Unitを使うらしい。
/uvcdynctrl/data/046d/logitech.xml
Configuration Descriptor の中に Extension Unit Descriptor があるので、GUIDに対応するUnitIDを取得して、
Extension Unit Control Requests で パラメータの設定、取得が出来ると思っていたが、そもそも該当するGUIDが存在しない。
Extension Unit Descriptor の iExtension の文字列を見ればなにか手がかりがつかめるかもと、
ストリングディスクリプタを取得してみたが、なにも取得できなかった。
そもそもLogitechのカメラはiManufacturer,iProductさえストリングディスクリプタは取得できない。
(2013/2/11)
---
UVCの機能を使うのではなくて、Extension Unitを使うらしい。
/uvcdynctrl/data/046d/logitech.xml
Configuration Descriptor の中に Extension Unit Descriptor があるので、GUIDに対応するUnitIDを取得して、
Extension Unit Control Requests で パラメータの設定、取得が出来ると思っていたが、そもそも該当するGUIDが存在しない。
QcamOrbitAFのExtension Unit UnitID: 4 guidExtensionCode: 82066163-7050-ab49-b8cc-b3855e8d221e NumControls: 10 NrInPins: 1 SourceID(1): 2 ControlSize: 2 Control(0): 03 Control(1): 00 iExtension: 27 UnitID: 13 guidExtensionCode: 82066163-7050-ab49-b8cc-b3855e8d221f NumControls: 8 NrInPins: 1 SourceID(1): 2 ControlSize: 2 Control(0): 01 Control(1): 00 iExtension: 28 UnitID: 10 guidExtensionCode: 82066163-7050-ab49-b8cc-b3855e8d2252 NumControls: 24 NrInPins: 1 SourceID(1): 4 ControlSize: 3 Control(0): FF Control(1): FF Control(2): 00 iExtension: 9
Extension Unit Descriptor の iExtension の文字列を見ればなにか手がかりがつかめるかもと、
ストリングディスクリプタを取得してみたが、なにも取得できなかった。
そもそもLogitechのカメラはiManufacturer,iProductさえストリングディスクリプタは取得できない。
(2013/2/11)
---
2012年12月5日水曜日
mbedのUSBホストライブラリの作成
mbed用のUSBホストライブラリを作り直してみました。
まだまだ改良しなければならないらしいところはありますが,とりあえず動いているようなので公開します。
BaseUsbHost
UVCカメラにアイソクロナス転送、USBフラッシュメモリにバルク転送、マウスにインタラプト転送、
コントロール転送が使えます。USBハブが使えます。
実装での特徴としては、割り込みからのTDの通知にmbed-RTOSのqueueを使用。
ED,TD,ITD,HCCAの確保にposix_memalignを使用。
スレッドとは非同期に転送できるように、転送データのバッファはTD,ITDの末尾にも貼り付けれようにした。
アイソクロナス転送ではうまくいっているが、コントロール転送の連続コマンド送信はエラーになりやすいみたい。
使用例として以前のカラートラッキングのプログラムを動くようにしてみました。
UVCカメラはLogitechC270専用にしてコンフィグレーションディスクリプタを読み取るのを止めた。
SET_CONFIGURATION,SET_INTERFACE,UVCへのコントロールを送っいるだけです。
BaseUsbHost_example
下のキャプチャーはカメラからmbedにモーションJPEGをアイソクロナス転送したデータを
確認のためにパソコンのターミナルソフトで数値表示しているところです。
CCの行はITDのコントールのコンディションコード、
PSの行はITDの中のパケットステータスのコンディションコードの発生回数を表示しています。

(2012/12/4)
---
まだまだ改良しなければならないらしいところはありますが,とりあえず動いているようなので公開します。
BaseUsbHost
UVCカメラにアイソクロナス転送、USBフラッシュメモリにバルク転送、マウスにインタラプト転送、
コントロール転送が使えます。USBハブが使えます。
実装での特徴としては、割り込みからのTDの通知にmbed-RTOSのqueueを使用。
ED,TD,ITD,HCCAの確保にposix_memalignを使用。
スレッドとは非同期に転送できるように、転送データのバッファはTD,ITDの末尾にも貼り付けれようにした。
アイソクロナス転送ではうまくいっているが、コントロール転送の連続コマンド送信はエラーになりやすいみたい。
使用例として以前のカラートラッキングのプログラムを動くようにしてみました。
UVCカメラはLogitechC270専用にしてコンフィグレーションディスクリプタを読み取るのを止めた。
SET_CONFIGURATION,SET_INTERFACE,UVCへのコントロールを送っいるだけです。
BaseUsbHost_example
下のキャプチャーはカメラからmbedにモーションJPEGをアイソクロナス転送したデータを
確認のためにパソコンのターミナルソフトで数値表示しているところです。
CCの行はITDのコントールのコンディションコード、
PSの行はITDの中のパケットステータスのコンディションコードの発生回数を表示しています。

(2012/12/4)
---
2012年10月7日日曜日
USBカメラとmbedで簡易カラートラッキング

上の写真のようにUSBカメラで撮影したJPEGデータをリアルタイムでハフマン符号だけをデコードしながら、
MCU(16ドットx8ドット)のDC成分のCr赤色の色差から赤色の中心(重心)を計算しています。
example1_c270.cpp

デバッグのためにターミナルソフトに撮影データを数値表示しています。
赤色が数値が高いのがわかります。左下のred:(9,10)が中心の値です。
現在のプログラムではハフマン符号をシーケンシャルサーチしています。
HuffmanDecode.cpp
ワーストケースでデコードが間に合うのかテストしてないが、
ハフマン符号の出現確率によって、なんとか間に合っているのかもしれない。
ROM容量はぜんぜん余裕があるのでテーブルで引くようにした方がいいだろう。
(2012/10/7)
BaseJpegDecodeをライブラリ化する都合上、旧リポジトリを削除しました。
ライブラリ:BaseJpegDecode
使用例:BaseJpegDecode_example
(2012/10/22)
---
2012年8月25日土曜日
Logitech C270 HD Webcam
各国のamazonでポピュラーなLogitech C270 HD Webcamをmbedで試してみた。
MJPG(モーションJPEG)とYUY2(非圧縮)のフォーマットに対応していた。
---
MJPG(モーションJPEG)とYUY2(非圧縮)のフォーマットに対応していた。
---
2012年7月28日土曜日
BSW13K08Hのコンフィグレーション・ディスクリプタ
DeviceClass: EF Vender: 1E4E Product: 0103 Manufacture: Etron Technology, Inc. Product: USB2.0 Camera InterfaceClass: 0E
DESCRIPTOR_TYPE_CONFIGURATION NumInterfaces: 4 DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION FirstInterface: 0 InterfaceCount: 2 FunctionClass: 0E FunctionSubClass: 03 FunctionProtocol: 00 Function: 2 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 0 AlternateSetting: 0 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 01 InterfaceProtocol: 00 Interface: 2 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_HEADER UVC: 0100 TotalLength: 77 ClockFrequency: 30000000 InCollection: 1 aInterfaceNr(1): 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_INPUT_TERMINAL TerminalID: 1 TerminalType: 0201 AssocTerminal: 0 Terminal: 0 ControlSize: 3 Controls(0): 00 Controls(1): 00 Controls(2): 00 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_OUTPUT_TERMINAL TerminalID: 2 TerminalType: 0101 AssocTerminal: 0 SourceID: 4 Terminal: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_PROCESSING_UNIT UnitID: 3 SourceID: 1 MaxMultiplier: 0 ControlSize: 2 Controls(1): 7F Controls(2): 15 Processing: 0 VideoStanders: 1A DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_EXTENSION_UNIT UnitID: 4 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 83 Attributes: 03 MaxPacketSize: 64 Interval: 4 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 0 NumEndpoint: 0 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_INPUT_HEADER NumFormats: 1 TotalLength: 223 EndpointAddress: 81 Info: 00 TerminalLink: 2 StillCaptureMethod: 2 TriggerSupport: 1 TriggerUsage: 1 ControlSize: 1 Controls(1): 00 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FORMAT_UNCOMPRESSED FormatIndex: 1 NumFrameDescriptors: 5 GUID: YUY2 DefaultFrameIndex: 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_UNCOMPRESSED FrameIndex: 1 Capabilites: 0 Width: 320 Height: 240 MinBitRate: 4915200 MaxBitRate: 4915200 MaxVideoFrameBufferSize: 153600 DefaultFrameInterval: 2500000 FrameIntervalType: 1 FrameInterval(1): 2500000 (4.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_UNCOMPRESSED FrameIndex: 2 Capabilites: 0 Width: 640 Height: 480 MinBitRate: 4915200 MaxBitRate: 4915200 MaxVideoFrameBufferSize: 614400 DefaultFrameInterval: 10000000 FrameIntervalType: 1 FrameInterval(1): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_UNCOMPRESSED FrameIndex: 3 Capabilites: 0 Width: 352 Height: 288 MinBitRate: 4866048 MaxBitRate: 4866048 MaxVideoFrameBufferSize: 202752 DefaultFrameInterval: 3333333 FrameIntervalType: 1 FrameInterval(1): 3333333 (3.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_UNCOMPRESSED FrameIndex: 4 Capabilites: 0 Width: 176 Height: 144 MinBitRate: 3244032 MaxBitRate: 3244032 MaxVideoFrameBufferSize: 50688 DefaultFrameInterval: 1250000 FrameIntervalType: 1 FrameInterval(1): 1250000 (8.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_UNCOMPRESSED FrameIndex: 5 Capabilites: 0 Width: 160 Height: 120 MinBitRate: 4608000 MaxBitRate: 4608000 MaxVideoFrameBufferSize: 38400 DefaultFrameInterval: 666666 FrameIntervalType: 1 FrameInterval(1): 666666 (15.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_STILL_FRAME EndpointAdress: 00 NumImageSizePatterns: 5 Width(1): 320 Height(1): 240 Width(2): 640 Height(2): 480 Width(3): 352 Height(3): 288 Width(4): 176 Height(4): 144 Width(5): 160 Height(5): 120 NumCompressPtn: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_COLOR_FORMAT DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 1 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 192 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 2 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 256 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 3 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 768 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 4 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 780 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 5 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 812 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 6 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 976 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 7 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 1020 Interval: 1 DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION FirstInterface: 2 InterfaceCount: 2 FunctionClass: 01 FunctionSubClass: 02 FunctionProtocol: 00 Function: 3 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 2 AlternateSetting: 0 NumEndpoint: 0 InterfaceClass: 01 InterfaceSubClass: 01 InterfaceProtocol: 00 Interface: 3 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOCONTROL AC_HEADER ADC: 0100 TotalLength: 38 InCollection: 1 aInterfaceNr(1): 3 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOCONTROL AC_INPUT_TERMINAL TerminalID: 1 TerminalType: 0201 AssocTermianl: 0 NrChannels: 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOCONTROL AC_OUTPUT_TERMINAL TerminalID: 2 TerminalType: 0101 AssocTermianl: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOCONTROL AC_FEATURE_UNIT UnitID: 3 SourceID: 1 ControlSize: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 3 AlternateSetting: 0 NumEndpoint: 0 InterfaceClass: 01 InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 3 AlternateSetting: 1 NumEndpoint: 1 InterfaceClass: 01 InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOSTREAMING AS_GENERAL TerminalLink: 2 Delay: 1 FormatTag: 0001 DESCRIPTOR_TYPE_CS_INTERFACE CC_AUDIO SC_AUDIOSTREAMING AS_FORMAT_TYPE FormatType: 1 NrChannels: 1 SubFrameSize: 2 BitResolution: 16 SamFreqType: 1 SamFreq(1): 8000 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 82 Attributes: 05 MaxPacketSize: 16 Interval: 4---
LifeCam VX-700のコンフィグレーション・ディスクリプタ
DeviceClass: EF Vender: 045E Product: 074A Manufacture: Microsoft Product: Microsoft LifeCam
DESCRIPTOR_TYPE_CONFIGURATION NumInterfaces: 2 DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION FirstInterface: 0 InterfaceCount: 2 FunctionClass: 0E FunctionSubClass: 03 FunctionProtocol: 00 Function: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 0 AlternateSetting: 0 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 01 InterfaceProtocol: 00 Interface: 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_HEADER UVC: 0100 TotalLength: 103 ClockFrequency: 15000000 InCollection: 1 aInterfaceNr(1): 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_OUTPUT_TERMINAL TerminalID: 2 TerminalType: 0101 AssocTerminal: 0 SourceID: 5 Terminal: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_EXTENSION_UNIT UnitID: 4 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_EXTENSION_UNIT UnitID: 5 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_INPUT_TERMINAL TerminalID: 1 TerminalType: 0201 AssocTerminal: 0 Terminal: 0 ControlSize: 3 Controls(0): 00 Controls(1): 00 Controls(2): 00 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOCONTROL VC_PROCESSING_UNIT UnitID: 3 SourceID: 1 MaxMultiplier: 0 ControlSize: 2 Controls(1): 3F Controls(2): 05 Processing: 0 VideoStanders: 07 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 83 Attributes: 03 MaxPacketSize: 16 Interval: 6 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 0 NumEndpoint: 0 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_INPUT_HEADER NumFormats: 1 TotalLength: 308 EndpointAddress: 81 Info: 00 TerminalLink: 2 StillCaptureMethod: 2 TriggerSupport: 1 TriggerUsage: 0 ControlSize: 1 Controls(1): 00 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FORMAT_MJPEG FormatIndex: 1 NumFrameDescriptors: 5 Flags: 0 DefaultFrameIndex: 1 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_MJPEG FrameIndex: 1 Capabilites: 0 Width: 640 Height: 480 MinBitRate: 76800 MaxBitRate: 2304000 MaxVideoFrameBufferSize: 76800 DefaultFrameInterval: 333333 FrameIntervalType: 6 FrameInterval(1): 333333 (30.0 fps) FrameInterval(2): 500000 (20.0 fps) FrameInterval(3): 666666 (15.0 fps) FrameInterval(4): 1000000 (10.0 fps) FrameInterval(5): 2000000 (5.0 fps) FrameInterval(6): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_MJPEG FrameIndex: 2 Capabilites: 0 Width: 352 Height: 288 MinBitRate: 25344 MaxBitRate: 760320 MaxVideoFrameBufferSize: 25344 DefaultFrameInterval: 333333 FrameIntervalType: 6 FrameInterval(1): 333333 (30.0 fps) FrameInterval(2): 500000 (20.0 fps) FrameInterval(3): 666666 (15.0 fps) FrameInterval(4): 1000000 (10.0 fps) FrameInterval(5): 2000000 (5.0 fps) FrameInterval(6): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_MJPEG FrameIndex: 3 Capabilites: 0 Width: 320 Height: 240 MinBitRate: 19200 MaxBitRate: 576000 MaxVideoFrameBufferSize: 19200 DefaultFrameInterval: 333333 FrameIntervalType: 6 FrameInterval(1): 333333 (30.0 fps) FrameInterval(2): 500000 (20.0 fps) FrameInterval(3): 666666 (15.0 fps) FrameInterval(4): 1000000 (10.0 fps) FrameInterval(5): 2000000 (5.0 fps) FrameInterval(6): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_MJPEG FrameIndex: 4 Capabilites: 0 Width: 176 Height: 144 MinBitRate: 6336 MaxBitRate: 190080 MaxVideoFrameBufferSize: 6336 DefaultFrameInterval: 333333 FrameIntervalType: 6 FrameInterval(1): 333333 (30.0 fps) FrameInterval(2): 500000 (20.0 fps) FrameInterval(3): 666666 (15.0 fps) FrameInterval(4): 1000000 (10.0 fps) FrameInterval(5): 2000000 (5.0 fps) FrameInterval(6): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FRAME_MJPEG FrameIndex: 5 Capabilites: 0 Width: 160 Height: 120 MinBitRate: 4800 MaxBitRate: 144000 MaxVideoFrameBufferSize: 4800 DefaultFrameInterval: 333333 FrameIntervalType: 6 FrameInterval(1): 333333 (30.0 fps) FrameInterval(2): 500000 (20.0 fps) FrameInterval(3): 666666 (15.0 fps) FrameInterval(4): 1000000 (10.0 fps) FrameInterval(5): 2000000 (5.0 fps) FrameInterval(6): 10000000 (1.0 fps) DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_STILL_FRAME EndpointAdress: 00 NumImageSizePatterns: 5 Width(1): 640 Height(1): 480 Width(2): 352 Height(2): 288 Width(3): 320 Height(3): 240 Width(4): 176 Height(4): 144 Width(5): 160 Height(5): 120 NumCompressPtn: 1 Compress(1): 0 DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_COLOR_FORMAT DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 1 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 128 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 2 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 256 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 3 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 512 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 4 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 600 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 5 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 800 Interval: 1 DESCRIPTOR_TYPE_INTERFACE InterfaceNumber: 1 AlternateSetting: 6 NumEndpoint: 1 InterfaceClass: 0E InterfaceSubClass: 02 InterfaceProtocol: 00 Interface: 0 DESCRIPTOR_TYPE_ENDPOINT EndpointAddress: 81 Attributes: 05 MaxPacketSize: 956 Interval: 1---
2012年7月27日金曜日
mbedでWEBカメラ(BSW13K08H)のテスト
UVC対応なのだがペイロードはYUY2だけだった。モーションJPEGはありません。
フレームレートは画像サイズが決まると、他のは選べないみたい。
320 x 240 4.0fps
640 x 480 1.0fps
352 x 288 3.0fps
176 x 144 8.0fps
160 x 120 15.0fps
rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, param, sizeof(param));
がエラーになってしまうのでuvcini.cppを修正。
パケットサイズは下記のとおり。
MaxPacketSize:
192 256 768 780 812 976 1020
YUY2のテストプログラム、先頭2ピクセルのデータを表示します。
example4_yuy2.cpp
(7月30日追加)
rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, param, sizeof(param));
を外したら、他のUSBカメラが動かなくなってしまったので元にもどす。
VS_COMMIT_CONTROLの先頭8バイト以外も更新しないといけないのか。
そもそも VS_COMMIT_CONTROLとVS_PROBE_CONTROLの違いを理解していない。
BSW13K08Hはパケットサイズを変更すると動作が変わってくるので転送速度が間に合ってないのかも。
先頭2ピクセルを読み取っているのは間違いかもしれない。
---
フレームレートは画像サイズが決まると、他のは選べないみたい。
320 x 240 4.0fps
640 x 480 1.0fps
352 x 288 3.0fps
176 x 144 8.0fps
160 x 120 15.0fps
rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, param, sizeof(param));
がエラーになってしまうのでuvcini.cppを修正。
パケットサイズは下記のとおり。
MaxPacketSize:
192 256 768 780 812 976 1020
YUY2のテストプログラム、先頭2ピクセルのデータを表示します。
example4_yuy2.cpp
Vender: 1E4E Product: 0103 Manufacture: Etron Technology, Inc. Product: USB2.0 Camera DESCRIPTOR_TYPE_CS_INTERFACE CC_VIDEO SC_VIDEOSTREAMING VS_FORMAT_UNCOMPRESSED FormatIndex: 1 NumFrameDescriptors: 5 GUID: YUY2 DefaultFrameIndex: 1
(7月30日追加)
rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, param, sizeof(param));
を外したら、他のUSBカメラが動かなくなってしまったので元にもどす。
VS_COMMIT_CONTROLの先頭8バイト以外も更新しないといけないのか。
そもそも VS_COMMIT_CONTROLとVS_PROBE_CONTROLの違いを理解していない。
BSW13K08Hはパケットサイズを変更すると動作が変わってくるので転送速度が間に合ってないのかも。
先頭2ピクセルを読み取っているのは間違いかもしれない。
---
2012年7月3日火曜日
BTstackをmbedで動かす(3)
BTstackをmbedで動かす(2)の続き。
パソコンでリアルタイムに撮影した画像が見たかったので初めてC#でプログラムを書いてみた。
パソコン: camviewer
mbed: spp_camera.cpp
撮影している様子と撮影した画像の表示。
しかし、転送速度は遅い。
UVCカメラから送られてくるフレームをSレコードにしてSPPで送っている。
短いフレームを大量に送っているのが原因なのかもしれない。
追加7月4日
int rfcomm_send_internal(uint16_t rfcomm_cid, uint8_t *data, uint16_t len)
で送れるのは252バイトまでだった。長くてもエラーは帰ってこないので注意、ハングアップします。
---
パソコンでリアルタイムに撮影した画像が見たかったので初めてC#でプログラムを書いてみた。
パソコン: camviewer
mbed: spp_camera.cpp
撮影している様子と撮影した画像の表示。
しかし、転送速度は遅い。
UVCカメラから送られてくるフレームをSレコードにしてSPPで送っている。
短いフレームを大量に送っているのが原因なのかもしれない。
追加7月4日
int rfcomm_send_internal(uint16_t rfcomm_cid, uint8_t *data, uint16_t len)
で送れるのは252バイトまでだった。長くてもエラーは帰ってこないので注意、ハングアップします。
---
2012年6月28日木曜日
BTstackをmbedで動かす(2)

超低速ではあるがUSBカメラで撮影した画像をBluetoothのSPPでパソコンに送ってみた。
spp_camera.cpp
BTstack
spp_counter.cppを改造すれば簡単にできるかと思っていたが、フロー制御をしないといけないみたいで、
短時間に大量のデータを送るとエラー(RFCOMM_NO_OUTGOING_CREDITS)になってしまう。
仕方ないので送信キュー(queue<string> send_queue;)を作って、
メインループ(cam_process_ds)でエラーにならないように送るようにしてみた。
デバッグしやすいように、撮影した画像は16進数テキストに変換して送っています。
ターミナルソフトでSPPのポートを開くとデータが5秒間隔で流れ込んで来ます。
動作確認としてパソコン側のソフトはPython2.7+PySerial2.5(pyserial-2.5.win32.exe)で作りました。
バイナリーに変換してJPEGファイルとして保存しているだけ。上の画像は保存した画像です。
spp.py
---
2012年6月3日日曜日
YUV422の動作テスト
Qcam Orbit AFはモーションJPEGの他に非圧縮のYUV422のフォーマットもあります。
mbedがYouTubeの動画をWebカメラ(Qcam Orbit AF)で撮影(YUV422,160x120,10fps)しながらグラフィック有機ELモジュール100x16に表示するテストです。
---
2012年5月16日水曜日
USBカメラをmbedに繋げてみた(3)
USBバブに繋いだUSBカメラも認識するようにした。
プログラム動作中にハブやデバイスが接続されたり切り離される事はないとして、ハブからのイベントをインタラプト転送で受け取らずに、初期設定時に各ポートをGET_STATUSでポーリングして確認するようにした。
他の多くのUSBデバイスがSET_CONFIGURATIONを送らなくてもだいたい動くが、ハブの場合はSET_CONFIGURATIONを送らないといけないようです。
ポートリセット後に直ちに接続したデバイスにリクエストを送っても返答が無かったが、400msくらい待つようにしたら応答するようになった。
5月17日追加
USBメモリーも使えるようにmass storage classを追加する。
ブロック数(セクター数)を取得するためにReadCapacityくらいだけを実装すればいいかと思っていたがときどき受信エラーになる。
USBHostLiteを参考にして初期化時にTestUnitReadyのステータスをリトライで確認するようにする。
5月21日追加
ITDを拡張して複数のアイソクロナス転送ができるように改良した。
同時に複数のWebカメラを扱えるようになります。
5月23日追加
qcam orbit afのモーションJPEGがパソコンで表示できない理由が少しずつわかってきました。
モーションJPEGの形式がJFIFではなくAVI1になってます。APP0セグメントで確認できます。
DHTセグメントがありません。
6月13日追加
DHTセグメントが無いJPEGはgoogle chromeなら表示できます。
LifeCam UVC(USB Video Class) host alpha version
参考文献
組み込み機器へのUSBホスト実装技法―パソコン用USB周辺機器を組み込みマイコンから自在に使いこなす (TECH I BUS Interface)
第12章 USB ハブ・クラス・ドライバの実装と制御手順
第14章 USBメモリやHDDを制御するための実装と制御手順
---
プログラム動作中にハブやデバイスが接続されたり切り離される事はないとして、ハブからのイベントをインタラプト転送で受け取らずに、初期設定時に各ポートをGET_STATUSでポーリングして確認するようにした。
他の多くのUSBデバイスがSET_CONFIGURATIONを送らなくてもだいたい動くが、ハブの場合はSET_CONFIGURATIONを送らないといけないようです。
ポートリセット後に直ちに接続したデバイスにリクエストを送っても返答が無かったが、400msくらい待つようにしたら応答するようになった。
5月17日追加
USBメモリーも使えるようにmass storage classを追加する。
ブロック数(セクター数)を取得するためにReadCapacityくらいだけを実装すればいいかと思っていたがときどき受信エラーになる。
USBHostLiteを参考にして初期化時にTestUnitReadyのステータスをリトライで確認するようにする。
5月21日追加
ITDを拡張して複数のアイソクロナス転送ができるように改良した。
同時に複数のWebカメラを扱えるようになります。
5月23日追加
qcam orbit afのモーションJPEGがパソコンで表示できない理由が少しずつわかってきました。
モーションJPEGの形式がJFIFではなくAVI1になってます。APP0セグメントで確認できます。
DHTセグメントがありません。
6月13日追加
DHTセグメントが無いJPEGはgoogle chromeなら表示できます。
LifeCam UVC(USB Video Class) host alpha version
参考文献
組み込み機器へのUSBホスト実装技法―パソコン用USB周辺機器を組み込みマイコンから自在に使いこなす (TECH I BUS Interface)
第12章 USB ハブ・クラス・ドライバの実装と制御手順
第14章 USBメモリやHDDを制御するための実装と制御手順
---
2012年5月12日土曜日
USBカメラをmbedに繋げてみた(2)
ITDを割り込みで受け取るように変更した。すこしは安定するようになってきた。
いままでは微妙なタイミングでなんとか動いていたのであろう。
WriteBackDoneHead割り込みで受け取る時の面倒なところはDoneキューに繋がっているTD,ITDから、
それらを発行したエンドポイントを処理しているクラスインスタンスを探さないといけないところです。
USBHostLiteの場合は発行した時にTDのリスト作っておいて、そこから検索しています。
USBHostShellの場合はクラスインスタンスの中にTDを内蔵しているのでTDのポインタ(アドレス)が
わかればインスタンスのアドレスが自動でわかるように作ってあります。TDをひとつしか使わないので
あればこれはうまい方法です。
今回の実装方法はTDとITDは別々の領域から切り出しているので、Doneキューに繋がっているTD、ITDの
アドレスから区別できるので、ITDの場合は無条件にアイソクロナス転送のエンドポイント処理をします。
アイソクロナス転送はいまのところひとつしか無いのでこの方法で動いています。
LifeCam UVC(USB Video Class) host alpha version
5月13日
・プログラムを更新。
---
いままでは微妙なタイミングでなんとか動いていたのであろう。
WriteBackDoneHead割り込みで受け取る時の面倒なところはDoneキューに繋がっているTD,ITDから、
それらを発行したエンドポイントを処理しているクラスインスタンスを探さないといけないところです。
USBHostLiteの場合は発行した時にTDのリスト作っておいて、そこから検索しています。
USBHostShellの場合はクラスインスタンスの中にTDを内蔵しているのでTDのポインタ(アドレス)が
わかればインスタンスのアドレスが自動でわかるように作ってあります。TDをひとつしか使わないので
あればこれはうまい方法です。
今回の実装方法はTDとITDは別々の領域から切り出しているので、Doneキューに繋がっているTD、ITDの
アドレスから区別できるので、ITDの場合は無条件にアイソクロナス転送のエンドポイント処理をします。
アイソクロナス転送はいまのところひとつしか無いのでこの方法で動いています。
LifeCam UVC(USB Video Class) host alpha version
5月13日
・プログラムを更新。
---
2012年5月8日火曜日
USBカメラをmbedに繋げてみた(1)
USBのアイソクロナス転送を理解するためにmbedにUVCのUSBカメラVX-700を繋げてみた。
USBホスト機能はNetServicesSourceに含まれていたUSBホストのプログラムにアイソクロナス転送を追加しました。
本来は転送完了を割り込みで検出するのだろうけど、アイソクロナス・トランスファ・ディスクリプタ(ITD)のコンディションコード(Condition Code)をポーリングしていてNOT ACCESSEDでなくなったら転送完了、つまりカメラからデータが来ているだろうとしています。
まだ全然安定してませんがなんとか撮れるようになったのでプログラムはmbedサイトに上げました。
LifeCam UVC(USB Video Class) host
mbedで撮影した画像です。mbedのRAM容量の都合で画像サイズは160x120です。
サイズを2Kバイト以内に抑えているので欠けているところもあります。
USBエリアを活用すればもう少し大きい、画質の良い画像が撮れるかもしれない。
使用例:
USBホスト機能はNetServicesSourceに含まれていたUSBホストのプログラムにアイソクロナス転送を追加しました。
本来は転送完了を割り込みで検出するのだろうけど、アイソクロナス・トランスファ・ディスクリプタ(ITD)のコンディションコード(Condition Code)をポーリングしていてNOT ACCESSEDでなくなったら転送完了、つまりカメラからデータが来ているだろうとしています。
まだ全然安定してませんがなんとか撮れるようになったのでプログラムはmbedサイトに上げました。
LifeCam UVC(USB Video Class) host
mbedで撮影した画像です。mbedのRAM容量の都合で画像サイズは160x120です。
サイズを2Kバイト以内に抑えているので欠けているところもあります。
USBエリアを活用すればもう少し大きい、画質の良い画像が撮れるかもしれない。
使用例:
#include "mbed.h" #include "uvc.h" Serial pc(USBTX, USBRX); LocalFileSystem local("local"); int main() { pc.baud(460800); uvc* lifecam = new uvc; lifecam->setup(); uint8_t buf[2048]; for(int n = 0; n <= 9; n++) { int len = lifecam->get_jpeg(buf, sizeof(buf)); char path[24]; snprintf(path, sizeof(path), "/local/usbcam%02d.jpg", n); printf("%s %d\n", path, len); if (len > 0) { FILE *fp = fopen(path, "wb"); for(int i = 0; i < len; i++) { fprintf(fp, "%c", buf[i]); } fclose(fp); } } exit(1); }---
登録:
投稿 (Atom)