[Armadillo:07633] Re: Armadillo500 でFullSpeedのUSBカメラ動作不良について

SiF 高木 email@hidden
2011年 10月 19日 (水) 16:57:15 JST


システムインフロンティアの高木です。

FullSpeedのUSBカメラを動作させることができまし。
十分な動作検証が必要とは思いますがひとまずご報告します。

原因はUSBドライバにおけるFullSpeed通信のスケジューリングでした。
使用したUSBカメラはデータ用にアイソクロナス転送、
ステータス用にインタラプト転送を使用します。

USBドライバにてスケジューリングのタイミングはマイクロフレーム単位で
管理されているのですが、両方の転送を0番目のマイクロフレーム位置に
配置しようとするために転送をスケジューリングできなくて
エラーとなっていました。(フレーム、マイクロフレームは※補足参照)

PC(Ubuntu10.04)にて本カメラを使用し、USBアナライザでパケットを解析したところ
アイソクロナス転送はフレームの先頭位置にスケジュールされ、
インタラプト転送はアイソクロナス転送が終了した後に
スケジュールされていることがわかりました。

そこでdrivers/usb/host/ehci-sched.cのqh_schedule()関数に以下の修正を加えました。
ちなみにkernel-2.6.35では修正後に相当するコードになっています。

修正前:for (uframe = 0; uframe < 8; uframe++) {
修正後:for (uframe = 7; uframe >= 0; uframe--) {


これによりFullSpeed接続のUSBカメラも動作することを確認しました。
しかしながらキャプチャした画像が乱れるという現象がでています。
画像の乱れについては別途調査中です。


※補足
FullSpeed接続の場合のUSB転送の1フレームは1msです。
1フレームは8個のマイクロフレームから構成されていますので
1マイクロフレームは125usとなります。
ドライバでは1フレーム中のマイクロフレームを0〜7番で管理しています。


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


> システムインフロンティアの高木です。
> 
> ドライバのエラー箇所について調査したところ
> 「drivers/usb/host/ehci-sched.c」の
> 「tt_no_collision関数」にて転送のスケジューリングが
> できないと判断されることがエラーのもとでした。
> 
> 試しにエラーを無視するようにソースコードを変更したところ
> カメラから画像データの取得できましたが、画面はグチャグチャでした。
> 
> スケジューリングさえ正しく処理できればカメラも正しく動作するように
> 思えるのですが・・・。
> 
> ちなみにカーネルオプションで
> 「Improved Transaction Translator scheduling (EXPERIMENTAL)」を
> 選択している場合は「tt_no_collision関数」ではなく
> 「tt_available関数」が呼び出されますが、
> 同様の判断がされエラーとなりました。
> 
> 
> またKernel-2.6.18+UVCドライバでも動作を試してみたいのですが
> Howtoの方法ではソースコードが取得できません。
> またUVCサイトにあるGitによる方法でソースコードを取得しましたが
> Kernel-2.6.18との組み合わせでは未定義のマクロや変数などが多くあり
> コンパイルエラーとなってしまました。
> 
> Kernel-2.6.18で動作させられるUVCドライバソースを入手する方法はないでしょうか。
> 
> 
> 以上、よろしくお願いします。
> 
> 
>> システムインフロンティアの高木です。
>>
>> 中村様、情報ありがとうございます。
>>
>> どの処理を実行した時に本エラーが起きているか調査したところ、
>> VIDIOC_STREAMONのioctlをであることがわかりました。
>> ただしioctl自体は正常終了を返しています。
>>
>> ドライバとしては drivers/usb/hcd.c に含まれる usb_hcd_submit_urb 関数で
>> 呼び出している hcd->driver->urb_enqueue というところまでわかりました。
>>
>> ただ hcd->driver->urb_enqueue の実体がどれなのかまでは調べられていません。
>> もう少し調査してみます。
>>
>>
>>
>>> 中村です。
>>>
>>> 解決策ではなく、別機種での情報ですが・・・
>>>
>>>> ちなみにLogicoolのC200(High/Full両対応のUVC)をFullSpeedポートに
>>>> 接続した場合も同様のエラーが発生して画像の取得ができませんでした。
>>>
>>> Armadillo-440のFullSpeedポート(上段)にLogicoolのQCAM-200R(Orbit AF)を
>>> 接続したときにも同じエラー
>>>      Failed to submit URB 0 (-28)
>>> が発生しています。
>>>
>>> 原因は同じようなところにあるのかもしれませんね。
>>>
>>
>> _______________________________________________
>> armadillo mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>
> 
> 



armadillo メーリングリストの案内