/var/log/messages

May 7, 2014 - 3 minute read - Comments - programming

v6pi の中身確認とか

とりあえず 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

とあります。資料は以下を見れ、って出てますね。確認します。

ちょっとこれ、読んでみる方向にて。

U-Boot を RPi で動かす ベクタテーブル

comments powered by Disqus