uvc.cの動作

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
user_3987996
Level 3
Level 3
25 replies posted 10 replies posted 5 replies posted

本件の目的から説明させて頂きます。

<本件の目的>

日ケミのカメラモジュール「NCM03-V」からの映像をPCに表示させたい。

<回路構成>

[日ケミカメラ:NCM03-V]→[サイプレスマイコン:CYUSB3014]→[USB3.0HUB]⇒PC

[日ケミカメラ:NCM03-V]→[サイプレスマイコン:CYUSB3014]]↑

[日ケミカメラ:NCM03-V]→[サイプレスマイコン:CYUSB3014]]↑

※3パラになっています。

<使用するカメラのスペック>

型式::NCM03-V

フォーマット:YUV422

解像度:640(H) x 480(V)

フレーム周期:Max 30fps

<作成した回路と参考回路差異>

差はU3RXVDDQ, U3TXVDDQピンのパスコン(現在はジャンパーで追加)

PCLKピンのダンピング抵抗(現状無くても信号は確認できている)

MCLKをCYUSB3014から入れるようにしている。

<現状と課題>

カメラからICまではPCLK,HSYNC,VSYNCという信号が確認できている。

MCLKはCYPRESSのICから27.5MHzを入れている。

USB3.0からビデオ信号が出力されていない。

<ダウンロードしたサンプルソフト>

CYPRESSからAN75779をダウンロード

<すでにご教示いただいた変更箇所>

コミュニティで教えて頂き

  1. Senser.cのI2Cでカメラモジュールの設定部分を修正

    RESET信号処理

  1. Uvc.cのMCLK(27.5MHz)出力設定

    STDBY信号をLOW固定で設定

  1. Cyfxuvcdscr.cの解像度部分を修正

<現状判っているソフトんも動き>

  1. Uvc.cのあるイベントセットが上手く動作していない。

なので、何もしない状態で無限ループになっている。

なぜ、イベントセットが上手くできないのか不明(知識不足)

waitOption Timeout時間を長くして動作は変わりませんでした。

ブレークポイントでuvc.cのline1643を確認しましたが、実行されていません。

PCLK等の信号波形は確認できているのに、イメージセンサの初期化に問題とは

どういう事でしょうか?

0 件の賞賛
1 解決策

情報展開していただきありがとうございます。

1.

かしこまりました。お願い致します。

同様に気になるのが、イメージセンサーのフォーマットです。

NCM03-Vのドキュメントを見る限りは、4:2:2 format with 16 bits per pixel だと "Cb Y Cr Y", "Cr Y Cb Y", "Y Cb Y Cr", "Y Cr Y Cb"のいずれかのフォーマットで出力ができるようです。

NCM03-Vの0x4E Registerを変えることでフォーマットが変わるようですが、これを変えたときには変化はございますか?

VS format descriptorにおいてデフォルトはYUY2に設定されております(いただいた最新のdescriptorでもYUY2に設定されていました)ので、フォーマットは "Y Cb Y Cr (YUYV)"が設定されるべきかと存じます。

2.

承知しました。ご説明ありがとうございます。

ホストアプリケーションに依存していないことがわかりました。

3.

"USB sniffer"で検索をかけると様々なツールが見つかります。

USBTrace - USB Protocol Analyzer Software for Windows

USBlyzer - USB Protocol Analyzer and USB Traffic Sniffer for Windows

などなど...

WiresharkでUSBパケットをキャプチャする方法も、日本語の記事が多くあるのでご参照いただけます。

WiresharkでUSBメモリのパケットキャプチャしてみた! | 無線&ネットワーク完全攻略

WiresharkでUSBデータをキャプチャする方法 | しまねこ電子工房製作日記

RatatoskrによるUSBキャプチャ - Qiita

4.

bit rateとframe sizeを以下のようにして再度試してみていただけますでしょうか?(640x480対応)

        /* Class specific Uncompressed VS frame descriptor */

        0x80,0x02,                      /* Width in pixel  640 */

        0xE0,0x01,                      /* Height in pixel 480*/

        0x00,0x00,0xCA,0x08,            /* Min bit rate bits/s. 640x480x30x2x8 */

        0x00,0x00,0xCA,0x08,            /* Max bit rate bits/s. 640x480x30x2x8 */

        0x00,0x60,0x09,0x00,            /* Maximum video or still frame size in bytes(Deprecated) 640x480x2*/

以上、よろしくお願い致します。

Hirotaka Takayama

元の投稿で解決策を見る

0 件の賞賛
7 返答(返信)
lock attach
Attachments are accessible only for community members.
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

情報を纏めていただきありがとうございます。

イメージセンサ初期化が問題かもしれない、というのはあくまで一つの推測で申し上げました。

AN75779のuvc.cのフローをドキュメント化しましたので、ご確認いただけますか。

これを元にFirmwareをご理解いただき、どこまで処理がされていてどこからされていないのか、問題を見つけていっていただければと思います。

(文書内にも書いてありますが、社内で他のエンジニアに精査してもらう時間が無かったため、誤字脱字等あるかと存じますがご容赦ください。)

よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛
lock attach
Attachments are accessible only for community members.

cyfxuvcdscr.cの

844行目を0x00, 0x05,  → 0x80,0x02に修正

845行目を0xD0, 0x02, → 0xE0,0x01に修正

する事により、PCのカメラアプリから画像が出るようになりましたが、

下記2個の問題があります。

①色がおかしい。

 画像データを添付します。

②途中でABORT PIPEになって画像が止まる。

 ディスクリプタのログを添付します。

色がおかしくなる原因は何が考えられますでしょうか?

また、ABORT PIPEになる要因をお教え下さい。

!

0 件の賞賛

ログを添付いただきありがとうございます。

1フレーム終了した段階でPIPEがABORTされているようです。

以前のスレッド(cyfxuvcdscr.cの編集 )にて、Number of bits per pixel を0x08に変更されたようですが、使用されているイメージセンサの出力がYUV422であれば、1ピクセル辺りの情報量は16bitになると思われます。そのため、この値は変更せずに0x10で良いと思われますが、いかがでしょうか。

これを修正し、どのように変化するかご確認いただけますか?

FYI:

ログにおいて、IN transferで送信されたバイト数:614400 = 16368 bytes × 37回 + 8784 bytes

1ピクセル辺り16bit with 解像度640 × 480で転送されるデータサイズ (byte):614400 =  640 × 480 × 2

よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛

Number of bits per pixelは現在0x10になっていて現在の状態です。

16368 = 16380 - 12

8784 = 8796 -12

という考え方でしょうか?

12byteは何のデータでしょうか?

1フレーム 614400byteという事でしょうか?

PIPEがABORTになるまでに、数秒から数分まで色々あります。

お送りした画像も色がおかしいですが、数秒写っています。

PIPEがABORTになる要因はハード的な事でしょうか?

0 件の賞賛

URB_FUNCTION_ABORT_PIPEがホスト側より発行されているようですが、

URB_FUNCTION_ABORT_PIPEは、パイプに対する未処理のリクエストを全て取り消す必要があることを示します。

このgeneral-purposeリクエストにより、clientは指定されたパイプに対するpending中の転送を取り消すことができます。

詳細:_URB_HEADER (usb.h) - Windows drivers | Microsoft Docs

今回、STALL_PIDがDownstreamデバイス(FX3)より発行されており、STALL_PIDは デバイスに定義されていないリクエスト または デバイスの設定に対して適切ではないリクエストがデバイスに送られた場合にリクエストエラーとしてデバイスからホストに発行されます。(USB 2.0 Spec 9.2.7 Request Errorより)

STALLとはエンドポイントが停止している(送信または受信できない状態)か、コントロールパイプリクエストがサポートされていない状態を指します。(USB 2.0 Spec 8.4.5 Handshake Packetsより)

色がおかしくなる点含め根本原因としては現状ではまだわかりません。

問題を解決していくために、4点お願いがございます。

1. AN75779の”3.1.1  GPIF II インターフェース要件”を満たしているかご確認ください。

2. UVCデバイスからのビデオ表示/キャプチャをするためのホストアプリケーションは何を使用されていますか?(VLC Media Player, AMCap, VirtualDubなど)現在使用しているホストアプリケーション以外のアプリケーションを試してみていただけますか?

3. いただいたログのテキストを元に深く原因を解析するのは難しいです。USBプロトコルアナライザがなくても、例えばWireSharkでトランザクションはキャプチャできます。デバイス動作時のUSBトランザクションをキャプチャしていただけませんか?

4. Class specific Uncompressed VS format descriptorとClass specific Uncompressed VS frame descriptorの内容だけで良いので、最新の状態を提示していただけませんか?

FYI:

640 pixel x 480 pixelのデータを送信していて、1 pixel辺り2 byte(16 bit)であれば、1フレーム辺りのデータは640 x 480 x 2 = 614400 bytes になります。desc.cのNumber of bits per pixelのサイズ設定が違っていると思ったので説明に用いただけです。混乱させてしまい申し訳ございません。最新のcyfxuvcdscr.cをいただければ幸いです。

12バイトは各USB バルク転送に追加されるヘッダーです。

以下、AN75779(日本語版)の”2.3.4  UVC ビデオ データ ヘッダー”からの抜粋です。

”UVC クラスは非圧縮ビデオ ペイロード用に12バイトヘッダーを必要とします。ヘッダーは転送されるイメージデータの特性を記述します。例えば、イメージ センサー コントローラー (FX3) がフレーム毎にトグルする「new frame」ビットを含んでいます。FX3 コードはヘッダー内でエラー ビットをセットして、現行フレームのストリームに問題が発生したことを示すこともできます。このUVC データ ヘッダーはすべてのUSB転送に必要です。”

よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛
lock attach
Attachments are accessible only for community members.

下記回答します。

1. AN75779の”3.1.1  GPIF II インターフェース要件”を満たしているかご確認ください。

 私どもが上流会社から頂いている資料では、Hsync.VsyncとDataのタイミングチャートが無く、

 上流会社からメーカーへ確認して頂くようにお願いしました。

2. UVCデバイスからのビデオ表示/キャプチャをするためのホストアプリケーションは何を使用されていますか?(VLC Media Player, AMCap, VirtualDubなど)現在使用しているホストアプリケーション以外のアプリケーションを試してみていただけますか?

 現在まで使用したのは、Windows10のカメラアプリ、Skypeの映像アプリ、エンドユーザーが作成されたカメラアプリです。

 どのアプリでも現象は同じでした。

 

3. いただいたログのテキストを元に深く原因を解析するのは難しいです。USBプロトコルアナライザがなくても、例えばWireSharkでトランザクションはキャプチャできます。デバイス動作時のUSBトランザクションをキャプチャしていただけませんか?

 WireSharkをインストールしてみましたが、キャプチャーインタフェースにUSB関連がでません。

 何か設定があるのでしょうか?

 その他のソフトはありませんでしょうか?

4. Class specific Uncompressed VS format descriptorとClass specific Uncompressed VS frame descriptorの内容だけで良いので、最新の状態を提示していただけませんか?

最新のcyfxuvcdscr.cを添付します。

0 件の賞賛

情報展開していただきありがとうございます。

1.

かしこまりました。お願い致します。

同様に気になるのが、イメージセンサーのフォーマットです。

NCM03-Vのドキュメントを見る限りは、4:2:2 format with 16 bits per pixel だと "Cb Y Cr Y", "Cr Y Cb Y", "Y Cb Y Cr", "Y Cr Y Cb"のいずれかのフォーマットで出力ができるようです。

NCM03-Vの0x4E Registerを変えることでフォーマットが変わるようですが、これを変えたときには変化はございますか?

VS format descriptorにおいてデフォルトはYUY2に設定されております(いただいた最新のdescriptorでもYUY2に設定されていました)ので、フォーマットは "Y Cb Y Cr (YUYV)"が設定されるべきかと存じます。

2.

承知しました。ご説明ありがとうございます。

ホストアプリケーションに依存していないことがわかりました。

3.

"USB sniffer"で検索をかけると様々なツールが見つかります。

USBTrace - USB Protocol Analyzer Software for Windows

USBlyzer - USB Protocol Analyzer and USB Traffic Sniffer for Windows

などなど...

WiresharkでUSBパケットをキャプチャする方法も、日本語の記事が多くあるのでご参照いただけます。

WiresharkでUSBメモリのパケットキャプチャしてみた! | 無線&ネットワーク完全攻略

WiresharkでUSBデータをキャプチャする方法 | しまねこ電子工房製作日記

RatatoskrによるUSBキャプチャ - Qiita

4.

bit rateとframe sizeを以下のようにして再度試してみていただけますでしょうか?(640x480対応)

        /* Class specific Uncompressed VS frame descriptor */

        0x80,0x02,                      /* Width in pixel  640 */

        0xE0,0x01,                      /* Height in pixel 480*/

        0x00,0x00,0xCA,0x08,            /* Min bit rate bits/s. 640x480x30x2x8 */

        0x00,0x00,0xCA,0x08,            /* Max bit rate bits/s. 640x480x30x2x8 */

        0x00,0x60,0x09,0x00,            /* Maximum video or still frame size in bytes(Deprecated) 640x480x2*/

以上、よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛