Comcerto 1000なモジュール(F社製)のためにEHCIなドライバーを書いてみたのですが、使えなくて調べたことを書き残しです。
Comcerto 100は2系統のUSBがありましたが1000では1系統になっています。また2000はUSB 3.0のサポートが入ってXHCIになったようです。
FreeBSDのEHCIな処理は共通化されていて、GENERICなドライバーもありますが、若干のカスタマイズのために独自のコードを作っているケースもあります。適当なファイルを探して、関数名などを置換して、機種独自のカスタマイズコードを削除してコンパイルしたら2,3度の修正でビルドがとおりました。FDTで作っているのでdtsiにも追加が必要です。
コピーしたコードは結構綺麗に書かれていたのですが、リソースの数の処理が間違っていました。問題はエラーケースなので表面化しないとは思いますが、おそらくdtsの記述を変えた時にソースを不完全に修正したのが原因な気がします。
bootしてみて、ドライバは認識されるのですが、デバイスが認識されません。
USBのコネクタ付近に未実装なパターンがあります。
D6,D7,D11は保護用のダイオードでL8はフィルターのようです。L8のパターンはつながっていて、部品を実装しても効かない様な気もするのですが、他の機種でも同じ様なパターンが見かけられたので、おそらくそういうものなのでしょう。これらはなくても普通は動作するはずです。
コネクタの前のパターンはこんな風になってます。
右からUARTのTX,RXでUSBのPowerの制御用(OUT)と、過電流検出(IN)のためのGPIOの線と、USBのD+,D-です。USB Power制御用のチップ(SOT-23 5Pin "ZN A09"?)は裏面に実装されています。
GPIOを試したところPowerの制御はGPIO_16でできました。
D+,D-のパターンはSOCの右上のUSBのピンの部分に直接つながっています。D+,D-のGNDとの抵抗を調べると8Mくらいなので接続はされている様です。
Pin | Name | Dir |
---|---|---|
J1 | USB_DP | B |
H1 | USB_DM | B |
H3 | USB_REF | B |
G1 | USB_VBUS_STAT | I |
いろいろ調べてみると、この機種の後継のモジュールはUSBが二口になっていて、おそらく同じSOCを使っていてUSB HUBのチップが入っているのではないかと思われます。またこのモージュールにはUSBと表示があります。 後継の機種はComcerto 2000を使っていてUSB2とUSB 3で二口にしていました。
このモジュールは意図的にUSBを使えなくしたのではなく、意図せず機能しなくて、納期が迫っていてデバッグもできなく、またサポートの必要もなかったのでUSBの表示を入れずに出荷したのではないでしょうか。また後継のモジュールはこの問題の対応のためにUSB HUBのチップを入れた可能性が高い気がします。
オリジナルのファームを立ち上げたところ、USBのPowerがOffの状態でした。セルフパワーのHUBをつないだところ、認識されたのでUSBは使えるようです。。。
comcerto-ehci comcerto-ehci.1: comcerto EHCI
comcerto-ehci comcerto-ehci.1: new USB bus registered, assigned bus number 1
comcerto-ehci comcerto-ehci.1: irq 5, io mem 0x0f000000
tdi_reset: set Streaming disable mode
comcerto-ehci comcerto-ehci.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
foxSyslogDispatch() - Entering
foxSyslogDispatch() - Going to loop, gSystemDispatchMsgKey=65538
usb 1-1: new high speed USB device using comcerto-ehci and address 2
ctnetlink v0.93: registering with nfnetlink.
usb 1-1: configuration #1 chosen from 1 choice
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
PowerのコントロールのGPIOはOffになっているケースが多くUSB自体が使えるかどうかはセルフパワーのデバイスで試すのが良いです。
上記のようにEnableとOver-Currentを接続しているケースもありますが、Enableだけのケースもあります。
下記は左側のSOP8のIT7652MというDC/DC Converterで5Vを作りUSBの電源としていて、EnableだけSOCからコントロールしているようです。
ルーターUSBは使えてもあまりパフォーマンスが良くないケースもあるようです。
NetBSDでehciドライバーを試しても使えません。ログを吐かせてみたところ以下の部分が正常なSHEEVAPLUGと違います。
[ 3.5744599] 000003.578262 ehci_open#4@0: called!
[ 3.6365204] 000003.644348 ehci_open#4@0: pipe=0xc13acf80, addr=1, endpt=129 (1)
[ 3.7109933] 000003.713105 ehci_roothub_ctrl_locked#14@0: called!
[ 3.7730541] 000003.780526 ehci_roothub_ctrl_locked#14@0: type=0x23 request=03
[ 3.8475277] 000003.849068 ehci_roothub_ctrl_locked#14@0: portsc=0x1c000004
[ 3.9095874] 000003.917351 ehci_roothub_ctrl_locked#14@0: set port power 1 (has PPC = 16)
[ 3.9840602] 000003.986842 ehci_roothub_ctrl_locked#14@0: returning 0
[ 4.9699395] 000004.970484 ehci_open#4@0: called!
[ 5.0699392] 000005.074945 ehci_open#4@0: pipe=0xc2eb14c0, addr=1, endpt=129 (1)
[ 5.1799398] 000005.182159 ehci_roothub_ctrl_locked#14@0: called!
[ 5.2799393] 000005.288018 ehci_roothub_ctrl_locked#14@0: type=0x23 request=03
[ 5.3899396] 000005.395013 ehci_roothub_ctrl_locked#14@0: portsc=0x0c000800
[ 5.4999394] 000005.501745 ehci_roothub_ctrl_locked#14@0: set port power 1 (has PPC = 16)
[ 5.5999393] 000005.609699 000005.612075 ehci_intr#1@0: called!
[ 5.7099397] 000005.715386 ehci_intr1#1@0: called!
[ 5.7099397] 000005.819938 ehci_intr1#1@0: sc=0xc2b20000 intrs=0xc(0xc08c) eintrs=0x4
[ 5.7099397] ehci_roothub_ctrl_locked#14@0: returning 0
EHCIからの割り込みがあがらないことが原因のようです。なんでかな。。
ComcertoのUSBはOHCIなどの1.0のインターフェースは持たずTransaction Translator(TT)を入れて2.0のEHCIだけでサポートしているようです。TTとはHUBやHOSTで1.0の通信を2.0に変換する機能です。
OHCIなどが有る場合はcompanion controllerとしてEHCIと連携するようです。companion controllerがあるかどうかはレジスタでわかり、Comcertoは0が返ります。
USBのパワーコントロールのチップでGlobal Mixed-mode Technology Inc.のG528(SOP8) USB High-Side Power Switch Advance Informationというものもあるようです。
同じ会社のG526は二系統の制御が可能なようです。