c2kのUSB

USB2とUSB3のポートがあります。

```
[    1.263404] ## xhci_plat_probe
[    1.266473] ### comcerto_start_xhci
[    1.270006] USB3.0 clock selected: internal
[    1.277388] xhci-hcd xhci-hcd: xHCI Host Controller
[    1.282446] xhci-hcd xhci-hcd: new USB bus registered, assigned bus number 1
[    1.289700] xhci-hcd xhci-hcd: irq 54, io mem 0x9f000000
[    1.295123] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    1.301956] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.309213] usb usb1: Product: xHCI Host Controller
[    1.314107] usb usb1: Manufacturer: Linux 3.2.26 xhci-hcd
[    1.319532] usb usb1: SerialNumber: xhci-hcd
[    1.324501] hub 1-0:1.0: USB hub found
[    1.328304] hub 1-0:1.0: 1 port detected
[    1.332690] xhci-hcd xhci-hcd: xHCI Host Controller
[    1.337617] xhci-hcd xhci-hcd: new USB bus registered, assigned bus number 2
[    1.344819] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003
[    1.351648] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.358905] usb usb2: Product: xHCI Host Controller
[    1.363799] usb usb2: Manufacturer: Linux 3.2.26 xhci-hcd
[    1.369224] usb usb2: SerialNumber: xhci-hcd
[    1.374151] hub 2-0:1.0: USB hub found
[    1.377937] hub 2-0:1.0: 1 port detected
[    1.382465] [usb_overcurrent_init]: Foxconn USB port (1-1, xhci) over-current detect function init!! 
[    1.391739] dwc_otg: version 2.94a 27-OCT-2011
[    1.595576] Core Release: 2.81a
[    1.595587] Setting default values for core params
[    1.794984] Using Buffer DMA mode
[    1.798323] Periodic Transfer Interrupt Enhancement - disabled
[    1.804174] Multiprocessor Interrupt Enhancement - disabled
[    1.809777] OTG VER PARAM: 0, OTG VER FLAG: 0
[    1.814191] dwc_otg dwc_otg.0: DWC OTG Controller
[    1.818973] dwc_otg dwc_otg.0: new USB bus registered, assigned bus number 3
[    1.826068] dwc_otg dwc_otg.0: irq 53, io mem 0x00000000
[    1.831482] Init: Port Power? op_state=1
[    1.835418] Init: Power Port (0)
[    1.838747] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002
[    1.845560] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.852819] usb usb3: Product: DWC OTG Controller
[    1.857540] usb usb3: Manufacturer: Linux 3.2.26 dwc_otg
[    1.862879] usb usb3: SerialNumber: dwc_otg.0
[    1.867928] hub 3-0:1.0: USB hub found
[    1.871728] hub 3-0:1.0: 1 port detected
```

c1kはUSB2だけでEHCIでしたが、c2kはUSB3はXHCIでUSB2はOTGです。

OTGはホストにもデバイスにもなれるインターフェースです。

OTGはMentor Graphicsという会社の作ったものと、Synopsysという会社が作ったものがよく使われています。SynopsysのものはDWC(DesignWare Core) OGTとよばれています。

この二つはまったくレジスタセットが違っていて、互換はありません。

DWCはrev1,2,3がありc2kはrev2のようです。

Synopsysが提供していた、オープンソースのlinuxドライバは最初はdwc_otgというもので、その後dwc2というものになった模様。

NetBSDにはMentor Graphicsに対応したコードがdev/usb/mogt.cとしてあり、DWCに対応したコードはexternal/bsd/dwc2にあります。DWCのコードは本家が作ったlinux用のコードからのポートのようでlinuxのサブシステムが必要になります。

ARMのTIやSUNXIのSOCはMentor Graphicsの仕様で作られていて、MIPSのRalink RT3050やBroadcomやamlogicのARM socなどはDWCで作られています。

10年以上前にrayの書いたFreeBSDのDWC OTGのコードをNetBSDにポートしたものがありました。

https://github.com/adegroote/dwc_otg

Headでコンパイルしようとしたら、いろいろ変わっていて無理でした。

NetBSDのUSBドライバーはattachしたときにusbd_bus_methodsの構造体をセットして、この構造体のopenでそれぞれのusbd_pipe_methods構造体をセットして処理を行ってるようです。

motgではDMAは使わずfifoでデータの送受信を行っています。

c2kでdwc2を使えるようにしました。

ターゲットのXHCIはコネクタが2.0のものなので、2.0でしか使えないようです。