ルーターのUSB

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のコネクタ付近に未実装なパターンがあります。

![写真（2019-11-08 7.07）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/71d31a71-6ecd-975b-8417-dc71dd21da72.jpeg)

D6,D7,D11は保護用のダイオードでL8はフィルターのようです。L8のパターンはつながっていて、部品を実装しても効かない様な気もするのですが、他の機種でも同じ様なパターンが見かけられたので、おそらくそういうものなのでしょう。これらはなくても普通は動作するはずです。

コネクタの前のパターンはこんな風になってます。

![写真（2019-11-09 12.51）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bd1df6da-87eb-0284-48f4-0c87ed4b8080.jpeg)

右から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くらいなので接続はされている様です。

![スクリーンショット 2019-11-11 9.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/078d53bc-98b7-5a61-d1fe-61cba59bfe6f.png)

|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からコントロールしているようです。

![写真（2019-12-01 18.17）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/13387aaa-9ad4-4156-3c90-983efebf11c3.jpeg)

ルーターUSBは使えてもあまりパフォーマンスが良くないケースもあるようです。

NetBSDでehciドライバーを試しても使えません。ログを吐かせてみたところ以下の部分が正常なSHEEVAPLUGと違います。

```:Comcerto
[   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
```

```:SHEEVAPLUG
[   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が返ります。

[NetBSDで使えるようになりました。](https://qiita.com/yamori813/items/52273bee35b7c75585ab)

USBのパワーコントロールのチップでGlobal Mixed-mode Technology Inc.のG528(SOP8) USB High-Side Power Switch Advance Informationというものもあるようです。

同じ会社のG526は二系統の制御が可能なようです。