USBホストフラッシュブートローダーについて

はじめまして。よし と申します。

過去の投稿内容やメーカーからご提示されている資料を拝読するものの、どうしても分からないことがありご教示をお願い致します。

現在、RX621でUSBホストフラッシュブートローダーを作ろうとしています。

試しに、アプリケーションノート(R01AN0892JJ0100)とサンプルプログラムを入手しまして、

boot側をサブプロジェクト、download側をメインプロジェクトとして環境を用意しました。

ハードは自作の基板になります。

そこで、いくつか御質問が御座います。

1.boot側の動作としては、起動後、R_Fl_Mode_Entry();へ遷移する事は確認できました。

  当該関数内の以下の処理で、指定アドレスが格納されずif文内へ入ってこず、設定の問題なのかサンプルコードのミスなのか、

  判断が出来ずに迷っております、、、

 

  /* ==== Set target reset vector ==== */
  trgt_vctr_tmp = (uint32_t *)FL_TARGET_REST_VECT_ADDR;

  if(*trgt_vctr_tmp != 0xFFFFFFFFu){
   /* ==== Call user function ==== */
   trgt_fnc = (void (*)())(*trgt_vctr_tmp);
   trgt_fnc();
  }
  else{
   while(1);
  }

  0xFFFFFFFFが格納されており、必ずelseに来てしまいます。

   メモリViewで確認するに、以下となっていました。

  trgt_vctr_tmp = 0xFFFE3FFC

  *trgt_vctr_tmp = 0xFFFFFFFF

 

2.上述の1の状態から、trgt_vctr_tmp = 0xFFFE3FFCとなるように設定をして、

  trgt_fnc()の遷移先を0xFFFE3FFC番地にした際、予期しないアドレスへ遷移してしまいます。

  当方が期待する遷移先は、download側のPowerON_Resetなのですが、TrgtPrgDmmy.cに記載されているTrgtPrgDmmy_mainがコメントアウトされているので、

  ユーザー側で処理を追記する必要があるものなのか、あるいは、download側とのリンクが上手く設定できておらず遷移できていないのか、

  お恥ずかしながらサンプルプログラムにどの様な追加設定・処理をすべきか分からない状態にあります、、、

  関係しそうなノートとして、ブート領域、フラッシュ領域の分割方法(R20UT4547JJ0100)は拝読しております。

 

開発環境は以下になります。

統合開発環境:CS+ for CC V7.00.00 [13 Jun 2018]

CPU:R5F56216B(176pin)

ハード:自作基板

お知恵を貸して頂ける方、どうぞ宜しくお願い致します。

Parents
  • よし さん、こんにちは。NoMaYです。

    >正に、ここが当方の知見が及んでいない部分だと認識しておりまして、vecttbl.cの記載された処理は、添付頂いたドキュメントの画面コピーにある、「0xFFFE3FFC番地に書かれたアドレスを実行」に相当するものではないのでしょうか?

    言われてみると、確かに1つ目の画面コピーの図の部分だけ見ると、よしさんが予想しているように(でもそれは文章の表現とは違うようですが)解釈してしまうのも無理ないですね。でも、以下であることをお伝えすれば、画面コピーの文章の部分から図の真の意味を解釈し直せるかも知れないかな、と思いました。

    「0xFFFE3FFC番地に書かれたアドレスを実行」≠「0xFFFE3FFC番地を実行」

    「0xFFFE3FFC番地に書かれたアドレスを実行」=「『0xFFFE3FFC番地に書かれたアドレス』を実行」=「0xFFF80000番地を実行」

    また、C言語で書けば以下のようになることもお伝えすれば、理解の助けになるかな、と思いました。(赤字の部分が異なります。)

    「0xFFFE3FFC番地を実行」(trgt_vctr_tmp = 0xFFFE3FFC として)
     trgt_fnc = (void (*)())trgt_vctr_tmp;
     trgt_fnc();

    「0xFFFE3FFC番地に書かれたアドレスを実行」(trgt_vctr_tmp = 0xFFFE3FFC かつ *trgt_vctr_tmp = 0xFFF80000 として)
     trgt_fnc = (void (*)())(*trgt_vctr_tmp);
     trgt_fnc();

    ちなみに、以下ですが(最初の文章もそうですが)、文章の表現とよしさんが言いたいことが合っていない気がします。文章の表現としては、正に、出力コードはその様になってますよ。これは、こう書かないと他の人には伝わらないのではないか、と思うのです。

    >FIXEDVECTセクションの0xFFFE3FFC番地にPowerON_Resetのジャンプ先があり、実際のPowerON_Resetの配置番地である、0xFFF80000番地へジャンプする・・・と解釈したのですが、ご指摘頂いた通り出力コードはその様になっていないので、認識が間違っていることは理解ができております。

    よしさんが言いたかったであろうこと:

    0xFFFE3FFC番地にPowerON_Resetのジャンプ先があり
    ⇒ 0xFFFE3FFC番地にPowerON_Resetへジャンプするジャンプ命令があり

    それで、頂いたリプライ全体から推測すると、(2)に関してはOKで、でも(1)に関して認識の間違いがあるように思われます。

    >つまり、配置アドレスがオーバーラップしていなければ、両方のプロジェクトのプログラムが展開されて、然るべき動作になるのだと解釈しておりました。

    両方のプログラムが、CS+&E1でダウンロードされる訳では無い、です。CS+には、アクティブプロジェクトという概念があり、アクティブプロジェクトとなっている方だけしか、CS+&E1でダウンロードされないですよ。(現状はboot側のサブプロジェクトがアクティブプロジェクトになっているのではないでしょうか?)

    もしかすると、手作業で、順に両方CS+&E1でダウンロードしているかも知れませんが、CS+のデフォルトは、私の記憶では、新しいプログラムをダウンロードする時には古いプログラムを消す(新しいプログラムでコードが無い部分は強制的に0xFFになる)ようにダウンロードされる、という動作だったと思います。(つまり、仮に、メインプロジェクト(download)側→サブプロジェクト(boot)側の順に手作業でダウンロードしていたとしても、結局、メインプロジェクト(download)側は消されてしまい(0xFFになってしまい)、サブプロジェクト側(boot)しかダウンロードしなかったことと同じになります。)

    よしさんが期待しているようにダウンロードするには、アクティブプロジェクト(現状はboot側のサブプロジェクトがアクティブプロジェクトになっているのではないでしょうか?)の方のデバッガのプロパティ設定で、メインプロジェクトとサブプロジェクトの.ABSファイルを共に(2つとも)ダウンロードするように設定しないといけない筈だと思います。

Reply
  • よし さん、こんにちは。NoMaYです。

    >正に、ここが当方の知見が及んでいない部分だと認識しておりまして、vecttbl.cの記載された処理は、添付頂いたドキュメントの画面コピーにある、「0xFFFE3FFC番地に書かれたアドレスを実行」に相当するものではないのでしょうか?

    言われてみると、確かに1つ目の画面コピーの図の部分だけ見ると、よしさんが予想しているように(でもそれは文章の表現とは違うようですが)解釈してしまうのも無理ないですね。でも、以下であることをお伝えすれば、画面コピーの文章の部分から図の真の意味を解釈し直せるかも知れないかな、と思いました。

    「0xFFFE3FFC番地に書かれたアドレスを実行」≠「0xFFFE3FFC番地を実行」

    「0xFFFE3FFC番地に書かれたアドレスを実行」=「『0xFFFE3FFC番地に書かれたアドレス』を実行」=「0xFFF80000番地を実行」

    また、C言語で書けば以下のようになることもお伝えすれば、理解の助けになるかな、と思いました。(赤字の部分が異なります。)

    「0xFFFE3FFC番地を実行」(trgt_vctr_tmp = 0xFFFE3FFC として)
     trgt_fnc = (void (*)())trgt_vctr_tmp;
     trgt_fnc();

    「0xFFFE3FFC番地に書かれたアドレスを実行」(trgt_vctr_tmp = 0xFFFE3FFC かつ *trgt_vctr_tmp = 0xFFF80000 として)
     trgt_fnc = (void (*)())(*trgt_vctr_tmp);
     trgt_fnc();

    ちなみに、以下ですが(最初の文章もそうですが)、文章の表現とよしさんが言いたいことが合っていない気がします。文章の表現としては、正に、出力コードはその様になってますよ。これは、こう書かないと他の人には伝わらないのではないか、と思うのです。

    >FIXEDVECTセクションの0xFFFE3FFC番地にPowerON_Resetのジャンプ先があり、実際のPowerON_Resetの配置番地である、0xFFF80000番地へジャンプする・・・と解釈したのですが、ご指摘頂いた通り出力コードはその様になっていないので、認識が間違っていることは理解ができております。

    よしさんが言いたかったであろうこと:

    0xFFFE3FFC番地にPowerON_Resetのジャンプ先があり
    ⇒ 0xFFFE3FFC番地にPowerON_Resetへジャンプするジャンプ命令があり

    それで、頂いたリプライ全体から推測すると、(2)に関してはOKで、でも(1)に関して認識の間違いがあるように思われます。

    >つまり、配置アドレスがオーバーラップしていなければ、両方のプロジェクトのプログラムが展開されて、然るべき動作になるのだと解釈しておりました。

    両方のプログラムが、CS+&E1でダウンロードされる訳では無い、です。CS+には、アクティブプロジェクトという概念があり、アクティブプロジェクトとなっている方だけしか、CS+&E1でダウンロードされないですよ。(現状はboot側のサブプロジェクトがアクティブプロジェクトになっているのではないでしょうか?)

    もしかすると、手作業で、順に両方CS+&E1でダウンロードしているかも知れませんが、CS+のデフォルトは、私の記憶では、新しいプログラムをダウンロードする時には古いプログラムを消す(新しいプログラムでコードが無い部分は強制的に0xFFになる)ようにダウンロードされる、という動作だったと思います。(つまり、仮に、メインプロジェクト(download)側→サブプロジェクト(boot)側の順に手作業でダウンロードしていたとしても、結局、メインプロジェクト(download)側は消されてしまい(0xFFになってしまい)、サブプロジェクト側(boot)しかダウンロードしなかったことと同じになります。)

    よしさんが期待しているようにダウンロードするには、アクティブプロジェクト(現状はboot側のサブプロジェクトがアクティブプロジェクトになっているのではないでしょうか?)の方のデバッガのプロパティ設定で、メインプロジェクトとサブプロジェクトの.ABSファイルを共に(2つとも)ダウンロードするように設定しないといけない筈だと思います。

Children
  • NoMaY 様 ご教示ありがとうございます。

    文章表現が分かりづらく、申し訳ございません。
    整理できていない知識を文章にしている部分もあり、混沌としている表現になっていると思います、、、

    また、私が申し上げたかったことを代弁頂きありがとうございます。
    意図は記述頂いた内容の通りになります。

    以下はサンプルプログラムそのままの状態だと思われ、*trgt_vctr_tmp = 0xFFF80000になっていないのが、当方の現状です。

    >> 「0xFFFE3FFC番地に書かれたアドレスを実行」
    >> (trgt_vctr_tmp = 0xFFFE3FFC かつ *trgt_vctr_tmp = 0xFFF80000 として)

    >> trgt_fnc = (void (*)())(*trgt_vctr_tmp);
    >> trgt_fnc();



    trgt_vctr_tmp = 0xFFFE3FFCは、FL_TARGET_REST_VECT_ADDRに0xFFFE3FFCが格納されており、直前行で代入されている事から問題無いと認識しております。
    *trgt_vctr_tmp = 0xFFF80000が期待する値であるが、*trgt_vctr_tmp = 0xFFFFFFFになっており、上手く設定が出来てないと感じていました。

    CS+&E1を使う場合、サブプロジェクト->メインプロジェクトの順に処理がされると理解しております。
    また、E1では、download側の「デバッグツール」->「ダウンロード・ファイル設定」の「ダウンロードするファイル」項目にdownload.abs(download側のモジュールファイル)とNonOS_MscFw.abs(boot側のモジュールファイル)を追加しています。

    試しに、download側(メインプロジェクト)のダウンロードファイルを1つだけに戻して、サブプロジェクトであるboot側に両方のダウンロードファイルの設定をしてみましたが、起動後にリセットベクタに来ず、CS+が実行状態のまま操作できなくなってしまいました。

    ここは、R20UT4547JJ0100の「5.デバッグツール」に設定方法が書かれておりましたので、そのまま抜粋処理しました。

    *trgt_vctr_tmp = 0xFFF80000とする為に、補完すべき設定や処理を模索していますが、
    何が不足しているのか及んでおりません、、、