ixp425にはUSBが入っているのですが1.0なのでターゲットのモジュールにはPCIにUSB 2.0にチップがぶら下がっています。
PICバスはリトルエンディアンでixp425はビッグエンディアンなので変換する必要があります。
変換用のbusアクセスをarm/xscale/ixp425_pci_asm.Sで用意しています。この中では__ARMEB__が定義されている場合は変換して処理して、そうでない場合はそのまま処理するようになっています。
ところがixp425にも変換機能があります。
これをevbarm/ixdp425/ixdp425_pci.cで設定します。
PCI_CSR_WRITE_4(sc, PCI_CSR, CSR_IC | CSR_ABE | CSR_PDS);
なぜかCSR_ADSが抜けています。
おそらく変換を意図しているので、反対の反対なので、変換しない状態、すなわちリトルエンディアンになり、正しく処理されないようなきがします。
またEHCIなデバイスはプローブできてattachな処理が行われるのですが、レジスタが正しく見えません。
EHCIの先頭からバイトでダンプしたところです。
10 00 95 00 04 22 00 00 02 00 00 00 00
3バイト目(オフセット2)は2バイトのHCIVERSIONになりますが、なんだか変な値です。正しくは01,00です。エンディアンが逆であっても変です。
なんでかな。。。
関係ないですが、初期のチップ(ステップA0)にはバグがあって、arm/xscale/ixp425_pci.cでPCI_NP_HAVE_BUGが定義されていて、ワークアラウンドが入っています。
割り込み4本とリセットとクロックはGPIOを使っています。
NSLU2は同じようにPCIバスのUSB 2.0チップのNEC uPD720101が使われていて、動作していたようなのだが、なんで動かないかな。。。
自分の手元にあるターゲットは、SOCのGPIOのCLKを使わず、水晶発信器のクロックを使っているようだ。