ラベル UVC の投稿を表示しています。 すべての投稿を表示
ラベル UVC の投稿を表示しています。 すべての投稿を表示

2013年3月16日土曜日

USBHostライブラリを少し読んでみた。

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年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)
---

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が存在しない。
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)
---

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(非圧縮)のフォーマットに対応していた。
---

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

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バイトまでだった。長くてもエラーは帰ってこないので注意、ハングアップします。
---

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を制御するための実装と制御手順
---

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日
・プログラムを更新。
---

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エリアを活用すればもう少し大きい、画質の良い画像が撮れるかもしれない。

使用例:
#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);
}
---