Raspberry Pi 3の64bitモード、ベアメタルに関する情報を書き溜めておく

# Raspberry Pi 3で64bitモード（AArch64）のベアメタル動作を目指す
参考となる情報をまとめておく

# ブートプロセスの概略

## SoCのブート

（準備）Raspberry PiのSDカードにbootcode.bin、start.elf、config.txt、プログラム本体を置いておく 

1. Raspberry Piに電源を入れるとまずGPUが起動する  
ARMのプロセッサはoff、SDRAMも無効な状態になっている  
1. GPUはブートローダーを実行開始する  
このブートローダーはROMにマスクされている  
SDカードから2段目のブートローダー（bootcode.bin）をキャッシュに読み込む  
1. GPUは2段目ブートローダー（bootcode.bin）を実行をする  
SDRAMを有効にする  
SDカードからファームウェア(start.elf)を読み込む  
1. GPUはstart.elfを実行する  
SDカードからconfig.txt、プログラム本体を読み込む  
config.txtの内容に沿ってCPUのブート設定が行われる  
つまり、ユーザはconfig.txtの内容を変更することでCPU起動パラメータをいじることができる  
プログラム本体はデフォルトでSDRAMのアドレス0x8000に配置される  
config.txtの設定によっては0x0番地に配置することもできる  
start.elfはARMプロセッサをリセットする  
1. ARMプロセッサがSDRAMに置かれたプログラム本体を実行開始する  

## ARMプロセッサのブート
後述のconfig.txtで64bitモード起動を指定すると、
ARMプロセッサは以下のような状態でブートを開始する

- config.txtの内容に従って0x8000番地 or 0x0番地から実行開始
- Exception LevelはEL3 Secureの状態
- キャッシュ、MMUはoff
- JTAG機能はoff（JTAGを使う場合はレジスタ設定が必要）

# 用意するファイル
Raspberry Piをベアメタル動作するには、FAT32フォーマットしたSDカードに以下を置く。
- bootcode.bin
- start.elf
- config.txt
- my_program.bin（プログラム本体、名前は何でも良い）

bootcode.bin、start.elfは以下からDLする。
https://github.com/raspberrypi/firmware/tree/master/boot

config.txtは自分で記述する。

my_program.binはプログラム本体で、自分で作成する。
バイナリ形式である。elf形式ではない。

## config.txtの記述
通常は以下のような内容のconfig.txtを用意する

```text:config.txt
kernel=my_program.bin
arm_control=0x200
kernel_old=1
disable_commandline_tags=1
```

- `kernel=my_program.bin`  
動作させたいプログラム本体の名前を指定する。  
指定しない場合、デフォルトでkernel.imgだったりkernel7.imgだったりをロードする。  
- `arm_control=0x200`  
これでARMコアがAArch64で起動する。  
`arm_control=0x0`とするとAArch32で起動する。指定しなくてもAArch32になる。  
- kernel_old=1  
0x0番地からプログラムを実行する。  
これを指定しないと0x8000番地からプログラムを実行する。  
u-bootは0x8000番地にプログラムを展開する前提で作られているらしく、  
u-bootを使わないならkernel_old=1を指定するのが良い？  
- disable_commandline_tags=1  
これを指定しないと、boot loaderがATAGSというタグ情報を0x100番地に上書きしてしまうらしい？  

## プログラム本体（my_program.bin）の用意
バイナリ形式のプログラム本体を作成する。
コンパイラは、以下のLinaroのAArch64 Bare-Metal用GCCが使える。
https://www.linaro.org/downloads/

プログラム本体のサンプルプログラムは後日投稿する。

# Raspberry Piの起動
上記で用意した以下4つのファイルをFAT32フォーマットしたSDカードに以下を置く。
- bootcode.bin
- start.elf
- config.txt
- my_program.bin（ファイル名はconfig.txtで指定）

Raspberry Piに電源を接続して起動する



# 参考情報

1. SoCの仕様
 - Raspberry Pi 3の仕様  
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2837/README.md
 - Raspberry Pi 2 Model Bの仕様  
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/README.md
 - Raspberry Pi Model A, B, B+, Zeroの仕様  
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/README.md
1. Raspberry Piのピン配置  
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md  
https://i1.wp.com/www.pighixxx.com/test/wp-content/uploads/2015/06/raspberry.png
1. config.txtのオプション  
https://www.raspberrypi.org/documentation/configuration/config-txt/README.md
http://elinux.org/RPiconfig
1. Raspberry PiのブートFW  
https://github.com/raspberrypi/firmware/tree/master/boot
1. LinaroのAArch32/AArch64用コンパイラ  
https://www.linaro.org/downloads/
1. Raspberry Pi 3をAArch64で動かす方法に関するやり取り  
https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=137963&hilit=aarch64
1. Raspberry Pi 3 AArch64 JTAG用のOpenOCD  
https://github.com/daniel-k/rpi3-aarch64-jtag  
1. Raspberry Pi、ベアメタル、AArch64関連の投稿    
http://d.hatena.ne.jp/cupnes/20160529/1464513206  
http://blog.livedoor.jp/suoyimi/archives/53217019.html  
http://domisan.sakura.ne.jp/article/rp_toppers/rp_toppers.html  
http://tanehp.ec-net.jp/heppoko-lab/prog/qemu_arm/qemu-arm64.html  
http://asmichi.hatenablog.com/entry/2014/08/15/203057  
1. EclipseとOpenOCDの連携  
http://www48.atpages.jp/~cent22/Electronics/STM32/DevelopEnv_DebuggerEclipse/DevelopEnv_DebuggerEclipse.html