GENMAIボードでのブートについて2

Hiroです。

 

以前、シリアルフラッシュからのブート起動が出来ないことを質問させていただきました。

その時点では解決したのですが、また問題が発生しましたので質問します。

ブートファイルを書き換えるとシリアルフラッシュからの起動ができなくなります。

ブートファイルはICEで書き込んでいます。

シリアル通信によるPC画面上での確認では、一切動いてない状態です(メッセージが一切出力されません)。

一度NORフラッシュから(BOOT_MODE0で)起動を掛けると、それ以降はシリアルフラッシュから(BOOT_MODE3で)

の起動が可能となります。

ブートファイルの書き換え時に環境設定を消去したのではないかと考えたのですが、

データは残っていますし、Kernaelイメージをシリアルフラッシュに書き込んでいるのですが

NORフラッシュ起動時にもKernelイメージをシリアルフラッシュから読み込んでいるので

環境設定は残っているようです。

NORフラッシュからの起動以降は、シリアルフラッシュからの起動が可能になることから

ブート処理の中で何かを設定することで起動可能になっていると思いますが、

ブートファイルの書き換えでその設定を壊すとも考えづらいと思います。

ブートファイル書き換え後に、シリアルフラッシュから(BOOT_MODE3で)起動させるには

何をすればよいかをお教えください。

 

以上

  • わわいです
    おそらく、シリアルフラッシュのブートプログラムで、CPUの初期設定が抜けているものがあると思われます
    NORフラッシュで起動したときは、その初期設定が走っているため、起動できるようになる、ということですな
    ということで、シリアルフラッシュのブートプログラムを見直してみましょう。
    CPUのクロック設定、キャッシュ設定、(周辺)デバイスのクロック起動、デバイスの割り込み設定、などなど、抜けているものがないかを見てみてください
  • わわいさん。ご回答ありがとうございます。

    ブートプログラムを疑いはしていますが、CPUの初期設定で抜けていると初期値で動作するので、NORフラッシュで起動した後でもシリアルフラッシュからの起動はできないのではないかと考えています。
    よって、環境設定やブートローダーなどの設定が足りないのではないのではないかと思います。
    いかがでしょうか。
  • わわいです
    リセットで初期値に戻るレジスタもあれば、戻らないやつってのもあったりするし、周辺デバイスではなおさらそういうのがあったりなんかします
    また、RAMの初期化はリセットではやってくれませんので、そこら辺もチェックする必要があります
    #RZ/Aなんかでは特にMMUやらキャッシュマネージャとかもありますんで、そこら辺のメモリの初期設定もありますな。
    初期設定で抜けている、ものに加え、余計な初期設定をしているのでコケる事もあったりするし、ブートモードによってレジスタの初期設定値が変わるやつもいますので、リセットで初期設定に戻る、と思っていると痛い目にあうことになります。
    んで、ICEで書き込んでるということですが、ステップ実行とかして異常箇所は探れないんでしょうか。
    また、こういう場合はシリアルポートなどに出力するシンプルな関数を作っておいて、ログを出力させるというのも有効です。
  • Hiro さん

    > ブートファイルを書き換えるとシリアルフラッシュからの起動ができなくなります。
    > ブートファイルはICEで書き込んでいます。
    > シリアル通信によるPC画面上での確認では、一切動いてない状態です(メッセージが一切出力されません)。
    > 一度NORフラッシュから(BOOT_MODE0で)起動を掛けると、それ以降はシリアルフラッシュから(BOOT_MODE3で)
    > の起動が可能となります。

    最初に何点か確認させてください。
    (a) u-boot のソースを変更していますか?
    (b) NORフラッシュ用、シリアルフラッシュ用 u-bootは、リリースノートの記載に従って
        それぞれ別に作成し、正しく書き込みましたか?
    (c) フラッシュ書き込み用の ICE は、何を使用していますか?
        J-LINK、PARTNER-JET、ULINK-Ⅱ?
    (d) フラッシュメモリを書き換えた場合は、必ずボードの電源を一旦、切り、(必要なら、
        ディップスイッチの設定を変えて)電源を再投入していますか?
        電源を入れたまま、リセットボタンで済ませていませんね?

    もし、(d) の答えが No なら、(d) を実行してみると、どうなりますか?

    > ブートファイルの書き換え時に環境設定を消去したのではないかと考えたのですが、
    > データは残っていますし、Kernaelイメージをシリアルフラッシュに書き込んでいるのですが
    > NORフラッシュ起動時にもKernelイメージをシリアルフラッシュから読み込んでいるので
    > 環境設定は残っているようです。

    環境設定(u-boot の環境変数)は、関係ありません。仮に環境設定を消去したとしても、
    u-boot は、以前の質問に出てきた、
        *** Warning - bad CRC, using default environment
    というメッセージを出して、デフォルトの環境変数を使うだけです。

    一応、間違いを指摘しておきますと、
    NORフラッシュ用の u-boot は、環境変数を NOR フラッシュに、シリアルフラッシュ用の
    u-boot は、環境変数をシリアルフラッシュに、それぞれ保存します。
    ですから、ブートファイルの書き換えで、シリアルフラッシュの環境変数を壊しても、
    NORフラッシュ用の u-boot は、影響を受けません。逆も同じです。

    > NORフラッシュからの起動以降は、シリアルフラッシュからの起動が可能になることから
    > ブート処理の中で何かを設定することで起動可能になっていると思いますが、
    > ブートファイルの書き換えでその設定を壊すとも考えづらいと思います。
    > ブートファイル書き換え後に、シリアルフラッシュから(BOOT_MODE3で)起動させるには
    > 何をすればよいかをお教えください。

    可能であれば、デバッガを接続し、
    (1) シリアルフラッシュを書き換えた後、一旦、GENMAI の電源を落とし、再投入する。
    # ICE は接続して、電源を入れたまま、GENMAI の電源のみ ON/OFF すること。
    # ICE からターゲットのリセットを要求された場合、リセットは実行して構わないが、
    # デバッガの初期処理(PARTNER-Jet の init など)は、実行しないこと。
    # もし、ICE がターゲット電源の ON/OFF に対応していなければ、電源の ON/OFF は、
    # スキップしても構いません。もし、上の内容が良く解らなければ、Hiro さんがしたことを
    # そのまま教えてください。
    (2) 0x18000000 番地にハードウェアブレークポイント(ソフトウェアブレークポイントは
        不可)を設定し、ブートモード3で実行する。
    (3) ブレークせずに暴走したら、強制ブレークして、その時のレジスタの値を確認する。
    (4) 0x18000000 でブレークしたら、そこから継続実行する。
    (5) 十秒ほど実行し、暴走しているようなら、強制ブレークして、その時のレジスタの値を
        確認する。
    (6) 暴走せず、u-boot が動作したら、(1) からの手順を数回、繰り返してみる。

    確認するレジスタは、次のものです。
        PC(r15)、LR(r14)、CPSR、SPSR

     

  • わわいさん。ご回答ありがとうございます。
    ICEでのステップ実行ができない(LinuxのICEでのデバッグには制限が有りそうな情報を得ていましたので
    実行できない理由を詳しくは調査していません)ので異常個所が探れません。
    ブート直後のメッセージさえPCに表示されませんので、シリアル自体が動いていないと思います。
    もう一度、初期化の処理をまとめてみます。
  • ご回答ありがとうございます。以下にご質問の回答をします。
    >(a) u-boot のソースを変更していますか?
     ソースの変更はしていないはずです。この1ヶ月ほど色々なことを試したので、どこかのファイルを
     変更した可能性もなくはないのですが、最初(1ヶ月ほど前)に投稿した時は少なくとも変更はしておりません。
    >(b) NORフラッシュ用、シリアルフラッシュ用 u-bootは、リリースノートの記載に従って
    それぞれ別に作成し、正しく書き込みましたか?
     リリースノートの記載に従って作成しました。書き込みはICEのマニュアルを参考にして書き込みました。
    >(c) フラッシュ書き込み用の ICE は、何を使用していますか?
    J-LINK、PARTNER-JET、ULINK-Ⅱ?
     YOKOGAWAのadviceLUNAです。
    >(d) フラッシュメモリを書き換えた場合は、必ずボードの電源を一旦、切り、(必要なら、
    ディップスイッチの設定を変えて)電源を再投入していますか?
     必ずボードの電源を落としています。ディップスイッチは、モード3の状態で書き込んだ場合は
     そのままで電源を投入します。

    >NORフラッシュ用の u-boot は、環境変数を NOR フラッシュに、シリアルフラッシュ用の
    u-boot は、環境変数をシリアルフラッシュに、それぞれ保存します。
     NORフラッシュ、シリアルフラッシュそれぞれの環境変数を使用していることから、上記の内容を理解できました。

    >可能であれば、デバッガを接続し、
     最初の頃、ICEでデバッグができると思って操作したのですが、シリアルフラッシュからのブートをしたことが無いことから(今までは内蔵ROMでの起動)、勝手が違うのかデバッグが出来ないと思いICEによるデバッグはしていませんでした。そのような状態ですが、以下の事を試しました。
    >(1) シリアルフラッシュを書き換えた後、一旦、GENMAI の電源を落とし、再投入する。
     シリアルフラッシュ書込み後、GENMAI電源OFF。ICEの出力画面に"ターゲット電源OFF"表示
     GENMAI電源ON。ICEの出力画面に"ターゲット電源ON"表示

    >(2) 0x18000000 番地にハードウェアブレークポイント(ソフトウェアブレークポイントは
    不可)を設定し、ブートモード3で実行する。
     ハードウェアブレークはICEに拒否されたので、OCD(On Chip Debug)ブレークを使用しました。
     ブレーク時のレジスタは以下の通りです。
     PC:0x18000000、LR:0x00000000、CPSR:0x600001d3、SPSR:0x5b0d7f31
     
    >(5) 十秒ほど実行し、暴走しているようなら、強制ブレークして、その時のレジスタの値を
    確認する。
     (4)→(5)まで実行した結果のレジスタは以下の通りです。
     PC:0x18000004、LR:0x18000008、CPSR:0x600001db、SPSR:0x600001db

    GENMAIボードを2枚用意して2枚ともですので、故障ではないと思っております。

    以上
  • Hiro さん

    > ご回答ありがとうございます。以下にご質問の回答をします。
    初心者フォーラムとは思えない適切な回答、有難うございます。非常に助かります。
    余談ですが、よろしければ、初心者フォーラムを卒業してRZフォーラム(あるいは、英語版の
    RZ Forum)へどうぞ。 最近、少し寂しいもので(笑)

    > >(1) シリアルフラッシュを書き換えた後、一旦、GENMAI の電源を落とし、再投入する。

    > シリアルフラッシュ書込み後、GENMAI電源OFF。ICEの出力画面に"ターゲット電源OFF"表示
    > GENMAI電源ON。ICEの出力画面に"ターゲット電源ON"表示

    > >(2) 0x18000000 番地にハードウェアブレークポイント(ソフトウェアブレークポイントは

    > 不可)を設定し、ブートモード3で実行する。
    > ハードウェアブレークはICEに拒否されたので、OCD(On Chip Debug)ブレークを使用しました。
    > ブレーク時のレジスタは以下の通りです。
    > PC:0x18000000、LR:0x00000000、CPSR:0x600001d3、SPSR:0x5b0d7f31

    ここまでは、特に問題ありません。

    RZ/A1 内蔵ROM のファームウェアが SPIBSC チャネル0の初期化に成功した後、
    シリアルフラッシュの先頭(0x18000000 番地)から書き込まれている u-boot に
    ジャンプしようとしてブレークがかかったものです。

    > >(5) 十秒ほど実行し、暴走しているようなら、強制ブレークして、その時のレジスタの値を
    > >確認する。

    > (4)→(5)まで実行した結果のレジスタは以下の通りです。
    > PC:0x18000004、LR:0x18000008、CPSR:0x600001db、SPSR:0x600001db
    > GENMAIボードを2枚用意して2枚ともですので、故障ではないと思っております。


    この結果で見る限り、その後、シリアルフラッシュの先頭(0x18000000 番地)から
    書き込まれている u-boot を実行しようとして、あるいは、実行中に、
    未定義命令例外を多重に起こして無限ループに入り込んでしまっているようです。

    CP15 の設定前に不動小数点演算命令や除算命令を実行した場合にも、この例外が
    発生しますが、今回のケースでは考えにくく、
    何らかの原因で、シリアルフラッシュが正しく読めない、あるいは、読めなくなる、
    と考えた方が良さそうです。

    こちらで試した限り、再現しない(特に問題無く u-boot が立ち上がる)ので、
    申し訳ありませんが、次のことを試してみていただけますか?

    先のメールの手順の (1)~(3) は、そのままで、
    (4) 0x18000000 でブレークしたら、その後、0x18000000 番地からメモリダンプして
    シリアルフラッシュが正常に読めることを確認する。
    (5) 次に 0x18000004 にハードウェアブレークポイントを設定し、(0x18000000 から)
    継続実行する。
    (6) 0x18000004 でブレークしたら、その時のレジスタ(PC, LR, CPSR, SPSR) を
    確認する。
    (7) (6) の LR のアドレスの前後10命令程度を逆アセンブルする。

    もし、(6) でブレークしなかったら、(1)~(3) は、そのままで、
    (4) 0x18000000 でブレークしたら、次に 0x18000004 にハードウェアブレーク
    ポイントを設定し、(0x18000000 から) 継続実行する。
    (5) 0x18000004 でブレークしたら、その時のレジスタ(PC, LR, CPSR, SPSR) を
    確認する。
    (7) (5) の LR のアドレスの前後10命令程度を逆アセンブルする。

    をしてみてください。
  • pecteilisさん。詳細なご検討ありがとうございます。
    まずは、
    >余談ですが、よろしければ、初心者フォーラムを卒業してRZフォーラム(あるいは、英語版の
    RZ Forum)へどうぞ。 最近、少し寂しいもので(笑)
     組み込みLinuxに関してはまったくの初心者ですので、今回のGENMAIで組み込みLinuxを動作させるまでは、
     初心者として扱ってください。(組み込みに関しては、そこそこ経験はありますが)

    >(4) 0x18000000 でブレークしたら、その後、0x18000000 番地からメモリダンプして
    シリアルフラッシュが正常に読めることを確認する。
     この時点でシリアルフラッシュが正常に読み込めません(すべて0xffです)。
     NORフラッシュ起動後に同じ操作をして、ブレーク後は、正常に読み出せます。

    シリアルフラッシュに書き込む際に、以下のスクリプトを実行しています。(添付ファイルの付け方が分かりませんのでテキストを貼り付けます)
    ############################################
    # RZ/A1H_A1M Init script
    ############################################
    # Example of circuit diagram.
    #
    # ----------+
    # RZ/A1x |
    # | +-------------+
    # | | Serial Flash|
    # ch0 |-----------+ |
    # | | |
    # | +-------------+
    # |
    # | +-------------+
    # | | Serial Flash|
    # ch1 |-----------+ |
    # | | |
    # | +-------------+
    # |
    # ----------+
    #Data Version Discription
    #-----------+---------+-----------------------
    #2013/12/27 1.00 New
    ##############################################


    #
    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    # ;*; CPG Setting ;;
    # ;*; PLL(x30),I:G:B:P1:P0 = 30:10:10:5:5/2 ;;
    # ;*; CKIO:Output at time usually,Output when bus right is opened,output at standby"L" ;;
    # ;*; Clockin = 13.33MHz, CKIO = 66.67MHz ;;
    # ;*; I Clock = 400.00MHz ;;
    # ;*; G Clock = 133.33MHz ;;
    # ;*; B Clock = 133.33MHz ;;
    # ;*; P1 Clock = 66.67MHz ;;
    # ;*; P0 Clock = 33.33MHz ;;
    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    reset
    srqwait
    #PL310 Initialize
    mem l #0x3fffff80 = 0x00000001 off

    # dummy read
    mdump #0x3fffff80,,0x4 l
    delay 1

    # FRQCR
    # FRQCR2(Default)
    mem w #0xfcfe0010 = 0x1035 off
    mem w #0xfcfe0014 = 0x0003 off

    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    # ;*; Internal RAM write enable ;;
    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    # ;*; Writing to On-Chip Data-Retention RAM is enabled.
    # ;*; SYSCR3.RRAMWE3=RRAMWE2=RRAMWE1=RRAMWE0=1
    mem b #0xfcfe0408 = 0x0f off

    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    # ;*; SPI Settings ;;
    # ;*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    # *************************************************
    # SPI Controller enable
    # *************************************************
    #STB_STBCR = STB_STBCR & ~STB_STBCR_SPIBSC0_MSK;
    mem b 0xFCFE0438 = 0xF3 off

    # *************************************************
    # Ch0 Settings
    # *************************************************
    # PORT9[7:2] Serial Flash ch0-1
    #
    # REG_PIPC9
    # REG_PM9
    # REG_PFC9
    # REG_PFCE9
    # REG_PFCAE9
    # REG_PMC9
    mem w #0xFCFE7224 = 0x00FF off
    mem w #0xFCFE3324 = 0xFF03 off
    mem w #0xFCFE3524 = 0x00FC off
    mem w #0xFCFE3624 = 0x0000 off
    mem w #0xFCFE3A24 = 0x0000 off
    mem w #0xFCFE3424 = 0x00FF off


    # PORT2[12:15]Serial Flash ch0-2
    #
    # REG_PIPC2
    # REG_PM2
    # REG_PFC2
    # REG_PFCE2
    # REG_PFCAE2
    # REG_PMC2
    mem w #0xFCFE7208 = 0xF000 off
    mem w #0xFCFE3308 = 0x0000 off
    mem w #0xFCFE3508 = 0xF000 off
    mem w #0xFCFE3608 = 0xF000 off
    mem w #0xFCFE3A08 = 0x0000 off
    mem w #0xFCFE3408 = 0xF000 off

    #REG_CMNCR
    mem l #0x3FEFA000 = 0x01fff320 off

    #REG_SSLDR 0x3FEFA004uL
    mem l #0x3FEFA004 = 0x00070707 off

    # /* ---- Bit rate 66.67Mbps ---- */
    mem l #0x3FEFA008 = 0x00000200 off


    # /* S-flash deta read address map 26bit */
    mem l #0x3FEFA014 = 0x00000001 off



    # *************************************************
    # Ch1 Settings
    # *************************************************
    # PORT8[15:10] Serial Flash ch1
    # REG_PMC8
    # REG_PFCAE8
    # REG_PFCE8
    # REG_PFC8
    # REG_PM8
    # REG_PIPC8
    mem w #0xfcfe3420 = 0xffff off
    mem w #0xfcfe3A20 = 0x0000 off
    mem w #0xfcfe3620 = 0xfc00 off
    mem w #0xfcfe3520 = 0x0000 off
    mem w #0xfcfe3320 = 0x03ff off
    mem w #0xfcfe7220 = 0xffff off


    #REG_CMNCR
    mem l #0x3FEFB000 = 0x01fff320 off

    #REG_SSLDR 0x3FEFB004uL
    mem l #0x3FEFB004 = 0x00070707 off

    # /* ---- Bit rate 66.67Mbps ---- */
    mem l #0x3FEFB008 = 0x00000200 off

    # /* S-flash deta read address map 26bit */
    mem l #0x3FEFB014 = 0x00000001 off

    # Reset of Serial Flash (ch0: Serial Flash x1)
    mem l #0x3FEFA000 = 0x81FFF320 off

    # Write enable
    mem l #0x3FEFA024 = 0x00060000 off
    mem l #0x3FEFA030 = 0x00004000 off
    mem l #0x3FEFA020 = 0x00000001 off
    # Reset
    mem l #0x3FEFA024 = 0x00F00000 off
    mem l #0x3FEFA030 = 0x00004000 off
    mem l #0x3FEFA020 = 0x00000001 off

    mem l #0x3FEFA000 = 0x01FFF320 off

    # Reset of Serial Flash (ch1: Serial Flash x1)
    mem l #0x3FEFB000 = 0x81FFF320 off

    # Write enable
    mem l #0x3FEFB024 = 0x00060000 off
    mem l #0x3FEFB030 = 0x00004000 off
    mem l #0x3FEFB020 = 0x00000001 off
    # Reset
    mem l #0x3FEFB024 = 0x00F00000 off
    mem l #0x3FEFB030 = 0x00004000 off
    mem l #0x3FEFB020 = 0x00000001 off

    mem l #0x3FEFB000 = 0x01FFF320 off

    ICEのメーカからの提供です。
    これが問題でしょうか。

    また情報として、NORフラッシュで起動させてブート開始後にキー入力でブートコマンドが入力できる状態にした後(カーネルが起動する前)で電源OFFしても、その後シリアルフラッシュからの起動はできません。NORフラッシュで起動させ、カーネルの初期化が終了(現在は、ファイルシステムでエラーになるので完全には終了していません)しないと、シリアルフラッシュからの起動はできな状況です。

    長くなってしまいましたが、ご検討をお願いします。

    以上
  • 昨日の実施でブレーク時にシリアルフラッシュから読み込めないと回答しましたが、ICEでリセットを実施後に確認したところ読み込めました。(4)以降の手順を実施しましたのでご報告します。

    >(6) 0x18000004 でブレークしたら、その時のレジスタ(PC, LR, CPSR, SPSR) を確認する。
     PC:0x18000004、LR:0x18000014、CPSR:0x600001db、SPSR:0x600001d7

    >(7) (6) の LR のアドレスの前後10命令程度を逆アセンブルする。
    Addr Data Source
     18000000 ea000014 b &18000058
     18000004 e59ff014 ldr pc,&18000020
     18000008 e59ff014 ldr pc,&18000024
     1800000c e59ff014 ldr pc,&18000028
     18000010 e59ff014 ldr pc,&1800002c
     18000014 e59ff014 ldr pc,&18000030
     18000018 e59ff014 ldr pc,&18000034
     1800001c e59ff014 ldr pc,&18000038
     18000020 180001a0 stmneda r0,{r5,r7-r8}
     18000024 18000200 strmneda r0,{r9}
     18000028 18000260 stmneda r0,{r5-r6,r9}
    1800002c 180002c0 stmneda r0,{r6-r7,r9}
    18000030 18000320 stmneda r0,{r5,r8-r9}

     R0:0x08c5187a、R5:0x0000003c、R6:R7:R8:R9:0x00000000

    >もし、(6) でブレークしなかったら、(1)~(3) は、そのままで、
     これ以降の手順が、その前までの手順との違いが分かりませんでした。別の情報の取得方法が有るようでしたら、ご指示下さい。

    以上
  • わわいです
    えー、、、なにを目指してるのはよーわかりませんが、、
    ブートプログラムのソースはないんでしょうか。
    逆アセンブルしてみても、そのトラブルが解決できるとも思えませんが