PINE64をベアメタルで遊んでみる。
随分前にPine64+ 2GBというボードを買っていたのですが積み基板になっていました。
ちょっとARMで遊びたくなったのでベアメタルからのLチカしてみました。
ソース
とりあえずGithubで管理することにします。
github.com
調べたこと
Pine64のブートについて
パワーオンリセットにより、BROM 内のプログラムから動き始めます。
Pine64はいくつかのブート方法に対応しています。
SDカードからブートする場合はセクタ16(オフセット8KB)の位置から32KB分読み込み、実行します。
この時点ではARM32bit命令で動作するそうです。
※要するに、BROMがBIOSとして機能し、SDカードのセクタ16がブートセクタになります。
注意点として、BROMはブートセクタの内容が適切かどうか、マジックナンバーとかチェックサムによって識別しているようです。
なので単純にARMの機械語のイメージがブートセクタに配置されていても正常に起動しません。
このため、コンパイル後、バイナリファイルに対してmksunxiboot コマンドによりブートセクタ用の変換を書ける必要があります。
LEDについて
いろいろ探してみたのですが、PINE64+には、ユーザーが制御できるオンボードのLEDは実装されていないようです。
回路図やネットの情報を見ると、PL7がLEDに割り当てられているようですが、このPL7は基板上ではホールになっており、ユーザによるオプション用のようです。
Lチカを試すにあたって、最初PL7をトグルさせてLチカを試そうとしたのですが、どうもうまく動きませんでした。
単純にIOアドレスとON/OFFの書き込みが間違っている可能性がありますが、何回か試してみてうまくいかなかったので
出力ポートをPB2にしてみて、トグル出力で無事Lチカできることを確認しました。
Pine64+ でベアメタルLチカしてみた。
— simotin (@simotin13) 2018年2月26日
どうもBROMがスタックポインタとか設定してくれてるみたいで、アセンブラ書かなくても動いた。 pic.twitter.com/aAhVNYCTqN
続き
BROMのコードが気になったのでダンプして逆アセンブルしてみました。まぁ、ただそれだけですが。
mcommit.hatenadiary.com