NetBSD-10のBCM5301Xのコードをいじってブートしてみました。
NetBSD/armのARMv7はBCM5301X以外はFDTになっていてGENERICなカーネルです。
おそらくNetBSD-7くらいからメンテナンスされてなくて、修正したところは以下のようなところです。
-
なぜかメモリの物理アドレスが違っていて、変更しました
-
0x80000000からメモリがあるような設定になっていましたが、実機で見ると0x00000000と0x88000000からあります。BCMな各種DTSを見ても0x80000000なアドレスはありません。0x80000000からメモリがありそれが0x00000000から見えるようになっているようです。これはブートローダーなどの便宜のためではないかと思われます。 -
devmapの書き方が変わったので変更しました
-
明らかなバグも修正しました
今確認できてる問題点は以下になります。
-
ネットワークやUSB2が機能しない
-
USB3のコードがない
-
0x00000000からの128Mしかメモリが使えていない。0x88000000からのメモリが使えない
-
DMAのtagのコードに物理アドレスが指定されている
-
DIAGNOSTICを設定してカーネルを作るとccaでpanicする
-
Timerがおかしい
-
マルチプロセッサーのコードがない(おそらくDual-Coreと思われます)
まだいろいろいじらないとだめそうです。参考にできそうな情報は、
-
Linux方面のGPLなコード
-
DTSファイル
-
FreeBSDのBHDNのコード
猛牛さんのGPLアーカイブはぐちゃぐちゃなので、githubで探すのが良いです。
GPLアーカイブでBCM固有の処理は以下にあります。
arch/arm/mach-brcm-hnd/*
arch/arm/plat-brcm/*
arch/arm/plat-brcm/include/*
src/shared/*
BroadcomはMIPS SOCの初期のころはSiBaという仕様だったのを、後期にBCMAという仕様に変更しました。BCMAは移行のために複雑になっています。BCM5301XはこのBCMAを踏襲しています。
なんとQiitaにBCM5301Xを使っている人がいました。NetBSDではsysctlのmachdep.fpu_idでfpuの有り無しが分かります。
NetBSDのBroadcomサポートはBCM2系より先にBCM53系が実装されたようです。
FreeBSDにはBCM53のコードはありません。
このポートはU-Bootを使ったターゲットだったようで、BCM5301Xとしては特殊なものだったのかもしれません。
Broadcomはデーターシートを一切公開していないので、おそらくGPLなコードを解析して作られたのではないかと思われます。
ソースのCopyrightが2012で入っていて、チップのリリースも同時期なので、なにかの製品化に向けて開発して、データーシートも手元にあったのかもしれません。
githubにこんな定義がありました。BCM4707とBCM53010は同じものみたいです。BroadcomはMIPS SOCの頃からなぜか二つの呼び名がありました。
#define BCMA_CHIP_ID_BCM4707 53010
#define BCMA_CHIP_ID_BCM47094 53030
#define BCMA_CHIP_ID_BCM53018 53018
メモリマップ
* 0x0000_0000..0x07ff_ffff 128MB DDR2/3 DRAM Memory Region (dual map)
* 0x0800_0000..0x0fff_ffff 128MB PCIe 0 Address Match Region
* 0x1800_0000..0x180f_ffff 1MB Core Register Region
* 0x1810_0000..0x181f_ffff 1MB IDM Register Region
* 0x1900_0000..0x190f_ffff 1MB ARMcore (CORTEX-A9) Register Region
* 0x1c00_0000..0x1dff_ffff 1MB NAND Flash Region
* 0x1e00_0000..0x1dff_ffff 1MB Serial Flash Region
* 0x4000_0000..0x47ff_ffff 128MB PCIe 1 Address Match Region
* 0x4800_0000..0x4fff_ffff 128MB PCIe 2 Address Match Region
* 0x8000_0000..0xbfff_ffff 1024MB DDR2/3 DRAM Memory Region
* 0xfffd_0000..0xfffe_ffff 128KB Internal Boot ROM Region
* 0xffff_0000..0xffff_043f 1088B Internal SKU ROM Region
* 0xffff_1000..0xffff_1fff 4KB Enumeration ROM Register Region