Raspberry Pi 4 Model Bに搭載されているBCM2711についてまとめてます。
主にベアメタルのプログラミングするときのため用です。
BCM2711のオフィシャルドキュメント
- 
https://github.com/raspberrypi/documentation/tree/master/hardware/raspberrypi/bcm2711
- BCM2711の簡単な説明
 
 - 
https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2711/rpi_DATA_2711_1p0_preliminary.pdf
- BCM2711の概要が載ってます。
 
 - 
https://github.com/raspberrypi/documentation/pull/1173
- 上記の最初のアップデート時のプルリクエスト その他ドキュメントが細かく変更されてるのが分かる。
 
 - 
https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_4b_4p0_reduced.pdf
- 回路図です。
 
 - ペリフェラルのスペックは数週間でリリースする予定。中の人のコメント Re: BCM2711B0
 
BCM2711のDevice Tree
デバイスツリーを読むとBCM2711に搭載されているペリフェラルと接続が分かります。
こちらのデバイスツリーは何に使うのか不明です。(bcm2838を使った開発ボードかな。)
BCM2711のブート
- BCM2711はVPU(VC6)でROMにあるコードを起動する。
 - その次にVPU(VC6)でSPI接続されたEEPROMにあるコードを実行する。
 - SD cardにbootcode.binがある場合はEEPROMにあるコードの代わりにbootcode.binを実行する。
 - bootcode.binは署名が必要です。
 - その後にARMを起動する。ARMの起動する冒頭部分のみソースコードが公開されている。
 - armstubs: Add BCM2711 support
 
CPU
- ARM Cortex A72 1.5GHz x 4
 
GPU
- VideoCore 6
 - Linuxドライバ /drivers/gpu/drm/v3d
 - Ideinのpy-videocore6
 
割り込みコントローラ
- BCM2835由来の独自割り込みコントローラ は見当たらない。
 - BCM2836由来の独自割り込みコントローラ は載ってるっぽい。(0x40000000)
 - ARM製割り込みコントローラ GIC400 (0x40041000)が載ってる。
 - どういうルーティングなのか分からん。
 - legacy interrupt controller を使うか、GICを使うかはconfig.txtで設定できる。
 - GICの初期化コードは armstubsに含まれている。
 
ARM_GICD_BASE 0xFF841000
ARM_GICC_BASE 0xFF842000
ARM_GIC_END   0xFF847FFF
- PPI はコアごとの割り込み Generic Timerなど
 - SPI はコア共有の割り込み DMA, UARTなど
 
PCI Express
- PCIeホストコントローラ (0x7d500000)
 - Linuxドライバ drivers/pci/controller/pcie-brcmstb.c
 
Ethernet
- 内部バス接続 (0x7d580000)
 - PHYとはRGMIIで接続
 - Linxドライバ drivers/net/ethernet/broadcom/genet/brcmgenet.c
 
内蔵USBホスト
- 内部バス接続 (0x7e980000)
 - RPI2と同じ synopsys designwareのUSBホストコントローラ (0x7e980000)
 - 電源供給用のUSB Type Cのポートにつながっている。 Deviceとしても動く。
 - BCM2711にもUSB3ホストコントローラ(xhci)を搭載しているっぽいが使っていない。
 
外付けUSBホスト
- PCIeで外部のUSB3 Host controller VIA VL805に接続。xhci準拠。
 - VL805はPHYを4port分内蔵している。
 - Linuxで動くシンプルな初期化コード xHCI on RPi4
 
MMC/SD
- emmc2, mmcnr, sdhostの3つを搭載
 - microsdスロットはemmc2に接続
 - Linuxドライバ drivers/mmc/host/sdhci-iproc.c
 - wlanはmmcnrに接続 nrはnon removeの意味
 - Linuxドライバ drivers/mmc/host/sdhci-iproc.c
 - sdhostは使っていない。拡張端子に割り当て可
 
I2S
- サンプリングレート192KHzの出力までサポート
 
H264 decoder, HEVC(H265) decoder, VP9 decoder
- 内部バス接続
 - Argon DesignのIPを使用
 - レジスタにアクセスするだけのLinux ドライバ /drivesr/char/broadcom/argon-mem.c
 - ffmpegのからデコーダーのレジスタにアクセスする方式。
 - BCM2711用のffmpegの開発は→ https://github.com/popcornmix/FFmpeg/tree/2711
 - ffmpegのhevc decoder用コード libavcodec/rpi_hevc.c
 
RNG
- 内部バス接続 (0x7e104000)
 - RNGのIPが追加
 - Linux ドライバ drivers/char/hw_random/iproc-rng200.c
 
UART
- uart2, uart3, uart4, uart5。PL011のUARTが4つ追加。
 
SPI
- spi3, spi4, spi5, spi6。SPIが4つ追加。
 
I2C
- i2c3, i2c4, i2c5, i2c6。I2Cが4つ追加。
 
GPIO
また更新する予定です。