たまたま転がり込んで来たBCM3380というSOCをいじってみました。BCM3380はBroadcomの最後の頃のmips SOCで珍しい4Kcのマルチコアです。
ターゲットはこれです。
CATVのケーブルモデム用のSOCでJ:COMで使われているNetgearの製品にも入っているようです。
BCM33xxはCATV用でBCM63xxはADSL用で提供されていました。CPUなどは共通のものが使われていてBCM3380はBCM6328に近いと思われます。BCM6328とBCM6318が同じ世代でその前はBCM6368はBCM6358と同じ世代になり、その前の世代はBCM6338とBCM6348がありました。BCM6348はBCM3348と同等と考えられます。63系は68の次に18になりましたが33系はリニアに数字が大きくなったようです。
SPI SOP 16PなFlashなのではがして、DIPなソケットを付けてみました。
ちょっと高くなりすぎてシールドにあたってしまうので、今度もう少し低い変換を作ります。^ ^;
オリジナルのまま起動してみるとブートとファームが一体化していて、ブートで止めたりコマンドオペーレションをする事が出来ないようです。
これはおそらくeCosを使っていてRedBoot入れずにeCosから直接ファームを起動しているのではないかと想像されます。
しかたがないので、とりあえずブートを作るところからです。
u-bootを移植した人がいるようです。
最近のu-bootはLinuxへの依存が強くなっていて、FreeBSDのLinuxエミュレーションではビルドできなさそうなので、これを使う事はあきらめました。
GPLで提供されているBCM3380のソースにeCosなソースがありましたが、これはRedBootではないので、こちらもあきらめました。
上のu-bootのpatchを見るとBCM6348などをベースに修正している事が分かります。
BCM63xxなブートを探してみたところcfe_bcm63xxというコードがありました。これをBCM33xx用に修正する事にしました、
BCM3380に一番近いと思われるBCM6358をベースにします。
レジスタのアドレスが下記のファイルにあるのでUARTなどのアドレスを書き換えます。
shared/broadcom/include/bcm963xx/6358_common.h
ビルドは以下のディレクトリでgmakeで実行します。gccなどのLinux用のtoolchainはアーカイブに入っていて、いくつかのMakefileをいじったところバイナリは出来ました。
cfe/build/broadcom/bcm63xx_rom
ところがバイナリが極端に小さいのです。Flashに焼いて実行しても何も起きません。
コードをおってみたところ、このディレクトリでビルドできるものは、プリブートローダーで、以下のディレクトリでビルドしたものが実際のCFEのブートローダーのようです。
cfe/build/broadcom/bcm63xx_ram
このディレクトリでビルドするとバイナリが出来て、それをromのディレクトリにflashimg.Sというファイルでダンプして入れ込むようです。
そのダンプ用のツールのhostTools/cmplzmaがなぜかlzmaの圧縮がうまくできないため、デバッグするのも面倒なのでZRouterのoldlzmaを使ってあらかじめ圧縮して、ダンプだけのコマンドに修正しました。
これでそれっぽいバイナリが出来たのですが、やはり起動しません。
コードを読みなおしてCFG_MULTI_CPUSという定義があったので、下記のファイルの定義を0から1にしてみました。
cfe/cfe/arch/mips/board/bcm63xx_ram/include/bsp_config.h
ところがramでビルドするとエラーで通りません。しかたがないので、とりあえずramの時は0でromの時に1にしてビルドしました。
焼いてみたところ、UARTから文字が出力される事が確認できました。
HELO
DRAM
SETLEDS('H','E','L','O')のようなマクロで、4文字をUARTに出力するようになっています。
UARTがつかえるようなればもうこちらのものです。
と思ったのですが、メモリコントローラーの初期化など結構ハードル高かったです。長期戦になりそうです。
https://oldwiki.archive.openwrt.org/doc/hardware/soc/soc.broadcom.bcm33xx
https://oldwiki.archive.openwrt.org/doc/hardware/soc/soc.broadcom.bcm63xx
https://wikidevi.com/wiki/Broadcom