BCM4702


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が入っていなくて、必要な場合は外付けしてたようです。

https://w.atwiki.jp/ddwrt_openwrt/pages/65.html

ブートローダーにはBroadcomが提供していたCFEを使ったものかpmonを使ったものがあったようです。

BCM4702にはネットワークインターフェースは2つ入っていて、一つをPHYにつないでWANにして一つをSWITCHに接続してLAN用にしているものが多かったようです。

http://www.tatsuyoshi.net/toyota/router/buffalo/wbrb11.html

BCM5325のCPUインターフェースはSPIでBCM4702からはGPIOのBitbangでコントロールしているようです。

後継のBCM4712にはuartが入りますが、ネットワークインターフェースは1つになりました。

BCM4702やBCM4710にはキャッシュのバグがあり、ワークアラウンドを行っていたようです。

製品ではgcc3を使ってビルドしてたようですが、こちらの方はgcc4でビルドしていました。

http://news.ozo.com/?post/2009/09/15/brcm47xx-goes-linux-2.6.31

メーカー製の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](https://qiita.com/yamori813/items/69384534571ebee98416#bcm4702--bcm5325--ac101)を使う方法があります。

BCM4712などではGPIOがCHIPCといわれるCOREに含まれているのですが、BCM4702ではEXTIFの方にあってレジスタのアドレスも違ったようです。001-bcm947xx.patchを解析してみるとレジスタはextifregs_tという構造体で定義されています。ここのgpio[0]がレジスタでこのオフセットが100でした。以下のように[Hello world!のコード](https://qiita.com/yamori813/items/9cd9188b8b416de812f9)を修正して[焼いて](https://qiita.com/yamori813/items/ea39b9e9e80b44410b44)みました。

```c:Main.c
#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への変換は以下のようにします。

```make:Makefile
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つきました。

![写真（2020-01-24 9.36）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8e6dcf9c-80c5-700a-0767-3c1c9305a8ec.jpeg)


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がない状態でのポートは効率が悪すぎます。

結局不用品の無料回収に出しました。