1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BCM4702

Last updated at Posted at 2020-01-22

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!のコードを修正して焼いてみました。

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への変換は以下のようにします。

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

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?