とりあえず fork したソレからこっち側に clone して中身確認。今は以下なカンジ。
$ ls
base gpio README.md
gpio の中が以下で
$ ls gpio/
main.c memmap README.md vp_gpio.c vp_typedef.h
Makefile raspi.cfg vector.s vp_gpio.h
base の中が以下。
$ ls base/
base.c Makefile memmap raspi.cfg README.md vector.s
とりあえず base の中から確認を。
Makefile から見るか、って以下な記述を発見。
# YAGARTOパス
YAGARTO = C:/winapp/yagarto/yagarto-20121222
YAGARTO って何でしたっけ。って思ったら以下な記述あり。
# YAGARTO実行ファイルのパスとプレフィックス
ARMGNU = $(YAGARTO)/bin/arm-none-eabi
これはまずい。でもこれって configure で、とかな話になるのかなぁ。あれ、あまり使いたくないなぁ。とりあえずシェルの変数で置きかえる形にして頂けまいかという Issue を投げさせて頂く方向で。
確認してみるに
# YAGARTOパス
YAGARTO = C:/winapp/yagarto/yagarto-20121222
ここをシェル変数で置き換えできれば
# YAGARTO実行ファイルのパスとプレフィックス
ARMGNU = $(YAGARTO)/bin/arm-none-eabi
ここは手元の cross なソレで大丈夫なんですが、以下がアレ。
# ライブラリ
LIB = -L $(YAGARTO)/lib/gcc/arm-none-eabi/4.7.2 -L $(YAGARTO)/arm-none-eabi/lib
ここは可変にしないとマズいかも。当座は手動で置換するか branch して差分を merge する方式にするかどっちかですね。で、Makefile によれば
- base.c
- vector.s
がソースファイルな模様。base/raspi.cfg は今度確認させて頂きます。memmap はリンカスクリプトになってますね。
そして gpio なディレクトリについては
- memmap
- raspi.cfg
- vector.s
は差分なし。
- vp_gpio.c
- vp_gpio.h
- vp_typedef.h
と {main, base}.c が違う模様。なんとなく某電子書籍からのフィードバックができるのかどうなのか。
むむむと言いつつ
upstream 追加して fetch したら更新されてるな。
$ git remote add upstream http://github.com/mgwsuzuki/v6pi
$ git fetch upstream
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), done.
From http://github.com/mgwsuzuki/v6pi
* [new branch] master -> upstream/master
README.md が更新されているらしい。何だろ、と思って確認してみるに諸々の記録が。
そして
色々な意味でここから main が動きはじめるまでが最初のハードルなのかな。とりあえず bcm2835 な諸々のルールというか仕様を確認しないと、なのかどうか。
とは言えとりあえず
- JTAG で云々
- UART で云々
あたりなのかどうか。でも gpio/vector.s を読まねば、です。
gpio/vector.s
凄い。勉強になります。手続き先頭 (ということは 0x8000) でベクターテーブルを作っておいてその 64byte を 0x0 番地に順にコピーしています。
そして cpsr に CPU モード (superviser mode) と割り込み無し、を設定してスタックポインタも設定してます。0x10000000 番地。
あと、テキストセグメントの後ろ部分に ro な data が居てそれを .data に、ってヤッてますね。このあたりも自分でやんなきゃ、なんですね。知らなんだ。
で、最後に BSS を初期化して main にジャンプしてます。確認必要な事項を以下に列挙。
- 割り込みベクターテーブルの位置
- cpsr のフラグの確認
- てきとうなプログラムをコンパイルしてみて readelf してみるか
ベクタテーブル
0x00000000 って baremetal 本に書いてありますね。テーブルの並びは
- リセット
- 未定義
- スーパバイザ
- プリフェッチアボート
- データアボート
- 予約
- IRQ
- FIQ
とあります。資料は以下を見れ、って出てますね。確認します。
ちょっとこれ、読んでみる方向にて。