BCM2711について

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](https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=244479&sid=3752ded6249ea465c13b398289b2464b#p1491246)

# BCM2711のDevice Tree
デバイスツリーを読むとBCM2711に搭載されているペリフェラルと接続が分かります。

- [bcm2711-rpi-4-b.dts](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2711-rpi-4-b.dts)
    - [bcm2711.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2711.dtsi)
        - [bcm2838.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2838.dtsi)
            - [bcm283x.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm283x.dtsi)
        - [bcm270x.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm270x.dtsi)
    - [bcm2711-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2711-rpi.dtsi)
        - [bcm2708-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2708-rpi.dtsi)
            - [bcm2835-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2835-rpi.dtsi)
        - [bcm2838-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2838-rpi.dtsi)
    - [bcm283x-rpi-csi1-2lane.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi)

こちらのデバイスツリーは何に使うのか不明です。（bcm2838を使った開発ボードかな。）

- [bcm2838-rpi-4-b.dts](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2838-rpi-4-b.dts)
    - [bcm2838.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2838.dtsi)
    - [bcm2835-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2835-rpi.dtsi)
    - [bcm2838-rpi.dtsi](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/arch/arm/boot/dts/bcm2838-rpi.dtsi)

# BCM2711のブート
* BCM2711はVPU(VC6)でROMにあるコードを起動する。
* その次にVPU(VC6)でSPI接続されたEEPROMにあるコードを実行する。
* SD cardにbootcode.binがある場合はEEPROMにあるコードの代わりにbootcode.binを実行する。
* bootcode.binは署名が必要です。
* その後にARMを起動する。ARMの起動する冒頭部分のみソースコードが公開されている。
* [armstubs: Add BCM2711 support](https://github.com/raspberrypi/tools/commit/7f4a937e1bacbc111a22552169bc890b4bb26a94)
    *  [/armstubs/armstub7.S](https://github.com/raspberrypi/tools/blob/master/armstubs/armstub7.S)
    *  [/armstubs/armstub8.S](https://github.com/raspberrypi/tools/blob/master/armstubs/armstub8.S)


# CPU
* ARM Cortex A72 1.5GHz x 4

# GPU
* VideoCore 6
    * [Pi 4 - full specification of VideoCore 6](https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=244519)
* Linuxドライバ [/drivers/gpu/drm/v3d](https://github.com/raspberrypi/linux/commits/rpi-5.1.y/drivers/gpu/drm/v3d)
* Ideinのpy-videocore6
    * https://github.com/Idein/py-videocore6

# 割り込みコントローラ
* BCM2835由来の独自割り込みコントローラ は見当たらない。
* BCM2836由来の独自割り込みコントローラ は載ってるっぽい。(0x40000000)
* ARM製割り込みコントローラ GIC400 (0x40041000)が載ってる。
* どういうルーティングなのか分からん。
* legacy interrupt controller を使うか、GICを使うかはconfig.txtで設定できる。
    * [Document enable_gic in config.txt](https://github.com/raspberrypi/documentation/commit/94224654ad3c92674493f3a6c29bf8169c8e230f)
* GICの初期化コードは armstubsに含まれている。
    *  [/armstubs/armstub7.S](https://github.com/raspberrypi/tools/blob/master/armstubs/armstub7.S)
    *  [/armstubs/armstub8.S](https://github.com/raspberrypi/tools/blob/master/armstubs/armstub8.S)
 
```
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](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/drivers/pci/controller/pcie-brcmstb.c)

# Ethernet
* 内部バス接続 (0x7d580000)
* PHYとはRGMIIで接続
* Linxドライバ [drivers/net/ethernet/broadcom/genet/brcmgenet.c](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/drivers/net/ethernet/broadcom/genet/bcmgenet.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](https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=255322&sid=db1245c1023daa66476b6655f549a87c)

# 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の出力までサポート
    * [bcm2835-pcm.c: Support multichannel audio](https://github.com/raspberrypi/linux/commit/ed0615ec08744fc127b9cb39f24bf5f36e042ff3)


# H264 decoder, HEVC(H265) decoder, VP9 decoder
* 内部バス接続
* Argon DesignのIPを使用
* レジスタにアクセスするだけのLinux ドライバ [/drivesr/char/broadcom/argon-mem.c](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/drivers/char/broadcom/argon-mem.c)
* ffmpegのからデコーダーのレジスタにアクセスする方式。
* BCM2711用のffmpegの開発は→ [https://github.com/popcornmix/FFmpeg/tree/2711](https://github.com/popcornmix/FFmpeg/tree/2711)
* ffmpegのhevc decoder用コード [libavcodec/rpi_hevc.c](https://github.com/popcornmix/FFmpeg/blob/2711/libavcodec/rpi_hevc.c)

# RNG
* 内部バス接続 (0x7e104000)
* RNGのIPが追加
* Linux ドライバ [drivers/char/hw_random/iproc-rng200.c](https://github.com/raspberrypi/linux/blob/rpi-5.1.y/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

また更新する予定です。