2003年前後の初期のWiFiルーター(11Bや54Gの最初)にBCM4702というBroadcomのSOCが使われていました。このSOCはMIPSアーキテクチャのチップでEthernetやPCIバスやUSB(1.0)が組み込まれていました。WiFiルーターではPCIバスのWiFiモジュールを使っていました。BCM4702はBCM4710のローコスト版のようです。
このSOCを使った製品を出したのはLinksysとASUSと猛牛さんだったようです。1年くらいでBCM4712などに取って代わられたのであまり製品数は多くありません。
BroadcomのMIPS SOCはSiByteを買収して始まったようです。SiByteはハイスペックなSOCを作っていたようなのですが、Broadcomではコンシューマー向けのSOCを作るようになったようです。
猛牛さんのターゲットはGPLでLinuxのソースがダウンロードできるのですが、完全なものではなさそうです。今更クレームをつけてももうメーカーさんも無くしてると思うので、ネットに残っている他の情報を頼りにします。
githubなどにbcm4710.hというファイルがあり、これを見るとBCM4712などが定義されているbcm5836.hとは構成が違うようです。話がそれますがBCM5836はSwitch製品でSOCではありません。推測ですが、BCM5836とBCM4710からBCM5350が作られたので、bcm5836.hとしているのかもしれません。もしそうするとBCM4712よりもBCM5350の方が先に開発されていたのかもしれません。
OpenWRT系のリポジトリに以下のようなファイルありました。
001-bcm947xx.patch
002-flash-map.patch
003-bcm4710_cache_fixes.patch
004-b44_bcm47xx_support.patch
これはBCM4710や02やBCM4712をサポートしてた頃にBroadcomが公開したソースのようです。
BCM4702もBCM4712同様に内部的にSonics SiliconBackplaneを使っているようです。Sonics SiliconBackplaneではそれぞれの機能をCOREと呼んでいます。
なんとBCM4702やBCM4710にはuartが入っていなくて、必要な場合は外付けしてたようです。
ブートローダーにはBroadcomが提供していたCFEを使ったものかpmonを使ったものがあったようです。
BCM4702にはネットワークインターフェースは2つ入っていて、一つをPHYにつないでWANにして一つをSWITCHに接続してLAN用にしているものが多かったようです。
BCM5325のCPUインターフェースはSPIでBCM4702からはGPIOのBitbangでコントロールしているようです。
後継のBCM4712にはuartが入りますが、ネットワークインターフェースは1つになりました。
BCM4702やBCM4710にはキャッシュのバグがあり、ワークアラウンドを行っていたようです。
製品ではgcc3を使ってビルドしてたようですが、こちらの方はgcc4でビルドしていました。
メーカー製のTRXはなぜかoffsetが入ってません。
00000000 48 44 52 30 00 50 2f 00 d4 4d 6d 39 00 80 00 00 |HDR0.P/..Mm9....|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 1f 8b 08 08 |................|
00000020 e8 a5 a6 42 02 03 70 69 67 67 79 00 ec 7c 0d 74 |...B..piggy..|.t|
00000030 5c 67 79 e6 3b f7 8e a4 b1 ad c4 57 d2 d8 99 d8 |\gy.;......W....|
00000040 4a 3c 63 5d 8d 14 47 e1 8c 41 09 da 74 da de 8c |J<c]..G..A..t...|
00000050 e4 44 b0 3e 20 8c 60 5d ea d3 33 48 4e 2a 52 43 |.D.> .`]..3HN*RC|
00000060 9c d8 f4 a4 bb d9 c3 45 92 83 68 c7 33 62 f1 01 |.......E..h.3b..|
00000070 b5 eb d3 4e 65 c9 08 90 35 8a e3 b0 66 d7 6c 84 |...Ne...5...f.l.|
00000080 63 4c 80 b4 2b 20 6d bd 4b b6 a8 81 dd 98 6d 0a |cL..+ m.K.....m.|
00000090 2e 9b 2e 86 28 dc 7d 9e ef 7e 57 1a fd f8 87 f6 |....(.}..~W.....|
当初は上のリンクのページのように16550をつける方法を考えていたのですが、起動時にtftpでTRXを受け付けるようなので、焼いてみたのですがうんともすんとも言いません。ただ動かなくなるということは焼かれている証拠で、おそらくIOのアドレスが違うので、それを調整すれば動くのかもしれません。
uartがない機種のHackで動作を確認できる方法はGPIOにぶら下がったLEDを使う方法があります。
BCM4712などではGPIOがCHIPCといわれるCOREに含まれているのですが、BCM4702ではEXTIFの方にあってレジスタのアドレスも違ったようです。001-bcm947xx.patchを解析してみるとレジスタはextifregs_tという構造体で定義されています。ここのgpio[0]がレジスタでこのオフセットが100でした。以下のようにHello world!のコードを修正して焼いてみました。
#define BCM4710_REG_EXTIF 0xb8007000 /* External Interface core registers */
int main(void)
{
volatile char* out = (volatile char*)(BCM4710_REG_EXTIF + 100);
volatile char* outen = (volatile char*)(BCM4710_REG_EXTIF + 104);
*outen = 0xff;
*out = 0;
return 0;
}
ELFをTRXへの変換は以下のようにします。
trx:
$(CROSS)-objcopy -O binary Kernel.elf Kernel.bin
gzip -f --best Kernel.bin
../bcmbm-mruby/tools/asustrx -o Kernel.trx Kernel.bin.gz
Kernel.trxを焼いたところ、やっと赤いLEDつきました。
BCM4712でUARTやGPIOが独立したCOREではなくてCHIPCにあるのは元々EXTIFにあったものだからのようです。
Broadcomのmips SOCはBCM4710,02がWiFi無しの第一世代でBCM4704,BCM4705,BCM4712,BCM5350,52,54が第二世代、BCM4716,17,18,BCM5356,57,58が第三世代になるようです。
mrubyが動かせないか試してみましたが、難しそうです。uartがない状態でのポートは効率が悪すぎます。
結局不用品の無料回収に出しました。