RalinkとAtherosは非常に似た会社で、どちらも台湾の会社でWiFiのチップの会社でしたがMIPS 4KでSOCを作り始め24Kでシェアーを伸ばし、74Kを作って買収されました。
似たところもありますが、Ralinkはリトルエンディアンで、Atherosはビッグエンディアンでした。またRalinkは24KでDSP命令をサポートしましたがAtherosはサポートしなかったり対照的なところもありました。それぞれ独自のポリシーがあったのだと思います。
4K以前はNECなどたくさんの会社がMIPSベースのSOCを作っていましたが、4K以降はこの二社とBroadcomだけになりました。
ちょっと前にfreebsd-mipsのMLに投げたのですが、RalinkとAtherosのSPIドライバーを最後の頃のチップ向けにチューニングしてみました。
まず、Ralinkの方なのですが、元々バイト毎の処理だったのがMT7620には16バイトのFIFOが追加されていたので、これのサポートを書いて見ました。
ベンチマーク
v1
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.390855 secs (877156 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.389815 secs (877537 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.390076 secs (877442 bytes/sec)
v3
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.179504 secs (1777995 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.177890 secs (1780431 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.178753 secs (1779127 bytes/sec)
flashの読み込みの部分だけFIFOにしてありますが、そのうち他の部分もFIFOにしてみたいと思います。
MT7620はMediatekになってからのチップですが、おそらくこの機構はRalink時代のRT6855で開発されたものではないかと思われます。
FIFOといっしょにDMAのサポートも入ったようなのですが、DMAはメモリ処理が大変なので、FIFOの方が利便性が高いです。
NetBSDにこの修正の定義がヘッダーにありましたが、コードはなさそうでした。
Atherosの方はもともとビット毎の処理だったものが、AR934x以降では32Bitまとめて処理(SHIFT)できるようになっていたので、この対応を行いました。
Original
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.542662 secs (363374 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.325290 secs (370348 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.441786 secs (366578 bytes/sec)
SHIFT Version
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.129013 secs (1340456 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.100061 secs (1352975 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.104706 secs (1350950 bytes/sec)
アプローチは違いますが、SPIを高速化する試みは同じ発想だったのかもしれません。
スピードはだいたい
Atheros旧 > Ralink旧 > Atheros新 > Ralink新
で、いとしのRalinkの勝利のようです。とはいえ、改善率はAtherosの方が大きいです。
RalinkもAtherosも昨今の頭の悪い力技の半導体ビジネスに嫌気がさして手放したのではないでしょうか。
SPIの用途はflashがよく使われていて、後は補助信号が必要なモジュールもありますLCDなどで使われています。AD変換のチップもありますが、I2Cで使ったほうが複数つなげるし、あまりメリットが無いかもしれません。