CFEもビルドしてみた。


たまたま転がり込んで来た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