2015年04月15日

Raspberry Pi2をEWARM使ってBare Metalで動かす(11+)

またまた番外編です。

EWARMを使ってBare MetalでRaspberry Pi2を動かしている人は他にもいました。


皆さんも挑戦してみましょう!!



posted by EWRL78JP at 00:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月14日

Raspberry Pi2をEWARM使ってBare Metalで動かす(11)

Cortex-A7を搭載したRaspberry Pi2 Model Bがリリースされています。
今回は、色々困難がある状況の中、Bare Metalでどこまで動かすことができるか、チャレンジしています。

とうとうRaspberry Pi2にICEをつなげることに成功しました!
Quad coreのデバッグもできます。
それから、全然できなかったLチカもできるようになりました!

ヒントは、前回の「おまけblog」にあります。
BCM2836は、設定が少しでも間違っていると止まってしまう傾向があるように感じられます。
ICEがつながらなかったり、Lチカが動かなかったのは、これが原因のようでした。

まず、うまくいった設定は、GPIO22,24〜27をALT4に設定してICE接続用端子にした場合です。

               ALT4          接続先        JTAG
GPIO22    ARM_TRST  J8のpin15  TRST
//GPIO23 ARM_RTCK  J8のpin16  RTCK
GPIO24    ARM_TDO   J8のpin18  TDO
GPIO25    ARM_TCK    J8のpin22  TCK
GPIO26    ARM_TDI    J8のpin37   TDI
GPIO27    ARM_TMS   P1のpin13  TMS

今までは、初代Raspberry Piの流れで、TDIはGPIO4をALT5に設定して使っていました。

            ALT5          接続先       JTAG
GPIO4   ARM_TDI    P1のpin7   TDI

でも、いくつか前のblogで述べたように、Raspberry Pi2のICE接続成功例は、GPIO22〜27を使っているようでした。
そこで、思い切ってTDIの配線を変えました。

ここで注意として、「GPIO23だけはALT4にすると止まってしまう」ようです。
RTCKの配線有無によらず、レジスタ設定でGPIO23をALT5にすると動かなくなってしまいます
GPIO23を除く「GPIO22,24〜27をALT4に設定」したときのみ、ICEがつながりました。

 
今まで、GPIO4をALT5に設定していたのも、おそらく止まる原因になっていたと思われます。
Lチカプログラムは、ICEの設定とセットになっており、ICEの設定で止まっていたので、Lチカも動かなかったようです。

それから、LEDとつながっているGPIOのポート番号は、初代Raspberry Pi typeB以前の16番ではなく47番でした。

ICEがつながったということで、I-jet経由でEmuDiagでコアの情報を表示させた結果です。

WS000427.JPG

EWARMでQuad coreと接続しているときのデバッグログの様子です。
どのコアも同じアドレスにいるので、もしかしたらまだ何か設定が足りていないのかもしれませんが。

WS000428.JPG

デバッガが立ち上がると、こんな感じです。

WS000432.JPG

上の方、クローズアップすると、このように4つのコアの状況が表示されています。

WS000433.JPG

コアの1つを実行開始させると、

WS000434.JPG

このように動き出します。

WS000435.JPG

ちなみに、デバッガ画面で単にコアの数を4に指定しただけでは、マルチコアデバッグはできません。
デバイスファイルを設定しないと、Quad coreだとは認識しません。

FreescaleのiMXのQuad coreデバイスの設定を参考に、Broadcomのデバイスファイルを作成しました。
デバイス選択ではこの通り、

WS000439.JPG

Broadcomを選択できるようにしています。

WS000438.JPG

マルチコアデバッグ可能にするのに、本当に必要なのは、ProbeConfigの拡張子の付いたファイルで、

 "A7_0" "Cortex-A7"
+"A7_1" "Cortex-A7"
+"A7_2" "Cortex-A7"
+"A7_3" "Cortex-A7"

のように記述して、Quad coreだということを示します。
iMXの例では、各記述の後に、別々のアドレスを指定するようなのですが、うまく指定できないので、とりあえず省略しています。

全体の接続はこんな感じ。

WS000440.JPG

ここまでくると、本当のSMPのデバッグがしたくなりますね。

PeterLemonのGitHubに、"SMP test demo" というのがあります。
アセンブラの形式が違うので、このままではEWARMでアセンブルできませんが、勉強しながら、C言語に焼きなおしてみたいと思います。

ICEがうまくつながったプロジェクトを添付します。
EWARMは v7.40.2 を使っていますので、これ以降のバージョンで読み込んでください。


posted by EWRL78JP at 12:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

Raspberry Pi2をEWARM使ってBare Metalで動かす(10+)

おまけです。
PeterLemonがGitHubで公開しているサンプルをC言語に書き直していて、ちょっとはまりました。

    mov r3,r3,lsr 2 ; Convert 16bit To 14bit
16bitデータを14bitにするため2bitシフトします。
"lsr"命令の頭のLを見て "LEFT shift register?" と早合点、C言語で「左シフト」してしまいました。

      *PWM_FIF1 = (*snd_p++)<<2;

実は、lsr命令="logical shift RIGHT" です。
コメントにも "16bit To 14bit" とある通り、16bitデータを「右シフト」して14bitに丸めるのが正解でした。

でも、間違ったままでも、数値が大きなだけで、何か音は出てもよさそうです。

ところが、実行してみると、全く音は出ませんでした。
ノイズならまだしも、全く出ないのです。

BCM2835のデータシートを見ると、FIFOレジスタは32bit丸々使えます。
でも、PWM_RNG1レジスタで14bitであると指定しているので、この14bitを上回るデータ値が入ると処理を止めてしまうようです。

今回は、逆アセンブル結果と、もとのアセンブラソースとの比較で、違いに気づきましたが、音が出ないと問題を切り分けづらいですね。
posted by EWRL78JP at 00:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月13日

Raspberry Pi2をEWARM使ってBare Metalで動かす(10)

Cortex-A7を搭載したRaspberry Pi2 Model Bがリリースされています。
今回は、色々困難がある状況の中、Bare Metalでどこまで動かすことができるか、チャレンジしています。

PeterLemonがGitHubで公開しているアセンブラで書かれたサンプルをC言語に移植してます。
対象は音楽(14bit/44100Hz/Mono)を再生するサンプルです。
ソースコードは整ったので、EWARMの設定です。
オプション設定を順次行っていきましょう。

(1)コアの選択

Raspberry Pi2に搭載されているデバイスBCM2836のコアはCortex-A7なので、ここで指定します。
「FPU」の欄で、FPUやNEON命令を使う指定ができるのですが、今回は使わないので「無し」にします。

WS000410.JPG

(2)出力するコードの選択

Cortexマイコンは、ARM命令とThumb命令の2種類のコードが使えます。
EWARMではどちらを使うか選択できます。
どっちを使うかですが、PeterLemonのGitHubにはアセンブル後のバイナリファイルkernel7.imgが置かれています。
調べてみるとARM命令でしたので、同じようにARM命令を指定します。

WS000411.JPG

(3)出力形式としてバイナリを指定

Raspberry Pi2では、SDカードにkernel7.imgという名前でバイナリを置くと、ブートローダが0x8000にロードして動かしてくれます。
バイナリ形式で出力するための設定が下記です。

WS000412.JPG

(4)starup処理をスキップする

通常、組み込みでは、main関数を実行するためのstartup処理がその前に必要です。
でも、Raspberry Pi2はブートローダが先に立ち上がっているので、startup処理は(ほとんど)不要です。
下記のように、プログラムエントリにmainを指定することでmainから実行が始まるようにでき、startup処理スキップさせることができます。

WS000413.JPG

(5)デバッガの設定

コンパイルした結果が、PeterLemonのアセンブラソースと同じになっているか、シミュレータの逆アセンブリ画面で確認する予定です。

WS000414.JPG

ちなみに、EWARMのデバッガの設定には、下記のように「対称型マルチコア」の欄に「コアの数」が指定できます。
Raspberry Pi2にICEがつながるようになったら、Quad coreのデバッグができそうですね。

WS000416.JPG
 

  
これで設定完了、コンパイルしてシミュレータで生成されたコードを確認してみます。

WS000422.JPG

上にあるボタン、「混在モードへの切り替え」を押すと、C言語のソースが消えて、もとのアセンブラソースと比較しやすくなります。

WS000423.JPG

レジスタが違ったりするので、完全に同じではないですが、大体よさそうです。
コンパイルしたバイナリkernel7.imgをマイクロSDカードにコピーして、Raspberry Pi2で実行してみましょう。

こんな感じでスピーカーをつなげて再生してみました。
みごと、音が鳴りました!

WS000425.JPG

 
ようやく、Raspberry Pi2をEWARMを使ってBareMetalで動かすことができました。
作成したプロジェクト一式を下記に貼り付けます。
EWARMは v7.40.2 を使っていますので、これ以降のバージョンで読み込んでください。

音声ファイルは著作権が気になるので添付していません。
PeterLemonのGitHubから入手してください。

posted by EWRL78JP at 12:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月12日

Raspberry Pi2をEWARM使ってBare Metalで動かす(9)

Cortex-A7を搭載したRaspberry Pi2 Model Bがリリースされています。
今回は、色々困難がある状況の中、Bare Metalでどこまで動かすことができるか、チャレンジしています。
PeterLemonがGitHubで公開しているアセンブラで書かれたサンプルをC言語に移植してます。
対象は音楽(14bit/44100Hz/Mono)を再生するサンプルです。

前回で、レジスタ設定の書き換えができました。
残るのは、音楽データを読み取るしかけと、EWARMでコンパイルするための各種設定です。
音楽データは、上記GitHubにあるSample.binを使います。
Raspberry Pi2へどうやって読み込ませるかですが、EWARMにはバイナリデータをリンクする機能があるので、これを使ってみます。

準備として、用意した音楽データSample.binは、プロジェクトフォルダに置きます。

(1)バイナリデータの読み込み指定

下記設定画面で、下に「ローバイナリイメージ」とあるのがその機能です。
WS000409.JPG

「ファイル」の欄には、、$PROJ_DIR$\Sample.bin と記述します。
$PROJ_DIR$というのはEWARMの環境変数で、現在使っているプロジェクトフォルダのパスに置き換えられます。

「シンボル」の欄は、配置したバイナリイメージに付ける名前で、ここでは簡単にSとしました。

EWARMのリンカは、mainから参照されていないオブジェクトを積極的に削ります。
ですので、バイナリイメージが消されないよう、同じシンボル名を上の欄にも記載して、キープさせます。

「セクション」の欄は、リンカ設定ファイルで配置先アドレスを指定するときに使うセクション名です。
ここではsndとしました。

「アラインメント」の欄は、バイナリの配置のアライメントです。
ここでは、8を指定して、8バイトアライメントにしました。

(2)バイナリデータの配置

リンカ設定ファイルにバイナリデータの配置先を指定する必要があります。
m.icfというファイルを新たに作り、オプションに指定しました。

WS000415.JPG

m.icfの記述は、次の3行だけでOKです。

define memory mem with size = 4G;
place at address 0x8000  { readonly };
place at address 0x8200 { section snd };

3行目で、先ほど指定したセクション名sndを使っています。
これで、バイナリイメージは、0x8200番地以降に配置されます。

(3)ソースコード中に読み出しアドレスを指定

バイナリイメージは0x3200番地から配置されるので、ソースコードに直接この番地を記述すればよいのですが、リンカ設定を変えた場合に、毎回ソースコードをケアしなければならず不便です。
そこで、
  unsigned short * snd_sta_p;
  unsigned short * snd_end_p;

  snd_sta_p = (unsigned short *)__section_begin("snd");
  snd_end_p = (unsigned short *)__section_end("snd");

としました。
__section_begin(), __section_end()を使うことで、バイナリイメージの開始アドレス、終了アドレスがリンク時に設定されます。


さて次回はEWARMの設定をし、コンパイルして、実際にRaspberry Pi2で動かしてみます。

 
posted by EWRL78JP at 12:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月11日

Raspberry Pi2をEWARM使ってBare Metalで動かす(8)

Cortex-A7を搭載したRaspberry Pi2 Model Bがリリースされています。
今回は、色々困難がある状況の中、Bare Metalでどこまで動かすことができるか、チャレンジしています。
色々調べてみましたが、Lチカを動かすまでに至りませんでした。
代わりのプランとして、他のペリフェラルを動かしてみることにします。
「Raspberry Pi2をEWARM使ってBare Metalで動かす(6)」で紹介したうち、PeterLemonがGitHubで公開しているアセンブラで書かれたサンプルをC言語に移植して動かすことにします。

このサンプルは、FASM(http://flatassembler.net/)というフリーのアセンブラをベースにしたARM用のアドオンFASMARM(http://arm.flatassembler.net/)でアセンブルできるものです。

アセンブラなので、見れば何をやっているか分かります。
C言語に移植して動かなかった場合、コンパイル後、逆アセンブルしてもとのアセンブラソースと比較することで、動かない原因を調べることができます。

PeterLemonのサンプルはいくつかありますが、Lチカのように簡単で、動いているかどうか確認しやすいものとして、Sound/PWMを選びました。

WS000404.JPG

PWM出力を使って音楽を再生するというものです。
動作確認は、Raspberry Pi2にスピーカーをつないでできます。
サンプルとして、エンコードのビット数やサンプリングレートの違うものが用意されていたので、下記の中で14bit/44100Hz/Monoを選びました。

WS000405.JPG

この中に含まれているファイルは下記です。
今回参考にするのは、kernl7.asmです。
また、再生する音楽ソースとして、Sample.binというのが置かれているので、これを使わせてもらいます。

WS000408.JPG

ちなみに、LIBの中にはインクルードファイルが入っています。
Raspberry Pi用のレジスタ定義や、レジスタアクセスを簡単にするマクロ定義などです。

WS000407.JPG

少しコードを追ってみると、比較的簡単にC言語に翻訳できそうです。

たとえば、最初の箇所、

; Set GPIO 40 & 45 (Phone Jack) To Alternate PWM Function 0
imm32 r0,PERIPHERAL_BASE + GPIO_BASE
imm32 r1,GPIO_FSEL0_ALT0 + GPIO_FSEL5_ALT0
str r1,[r0,GPIO_GPFSEL4]

ここは、GPIOピン40と45の機能を、ALT0に設定しています。

C言語にするには、各ベースアドレスや、オフセットアドレスを定義後、

#define PHY_PERI_ADDR(x) (0x3f000000 + (x))

#define GPIO_BASE     (0x00200000)
#define GPFSEL4          ((uint32_t *)PHY_PERI_ADDR(GPIO_BASE + 0x10))

マスク用のマクロを用意しました。

#define GPFSEL_MASK_ALT0(n)     (0x04 << ((n % 10) * 3))

これらを使ってC言語に書き直すと、3行のアセンブラは1行のC記述ですみます。

//; Set GPIO 40 & 45 (Phone Jack) To Alternate PWM Function 0
//imm32 r0,PERIPHERAL_BASE + GPIO_BASE
//imm32 r1,GPIO_FSEL0_ALT0 + GPIO_FSEL5_ALT0
//str r1,[r0,GPIO_GPFSEL4]

  *GPFSEL4 = GPFSEL_MASK_ALT0(0) + GPFSEL_MASK_ALT0(5);

まずはこんな感じで、レジスタアクセス箇所をC言語に書き換えていくことができます。

あと、残るのは、音楽データを読み取るしかけと、EWARMでコンパイルするための各種設定ですね。

長くなったので、続きは次回に。
posted by EWRL78JP at 12:00| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする