Ethernetを使ってファームウェアアップデートのようなことが
RA6M5で実現できますか?
普段はE2 Liteでソフト書き込みを行っていますが
ユーザへ販売後に不具合などが見つかった場合に、マイコンソフトを自作のパソコンアプリなどから更新できるようにしたいと思っています。
そういったことがそもそも可能なものなのか知りたいのと
キーワード的には「セルフプログラミング」が該当しますか?
基板につけている通信インタフェースはEthernetのみでUSBなどは搭載しておりません。
RA6M5だと、デュアルモードが使えるので、
・バンク0(現行バージョン)上で実行するプログラムで→更新版のファームをバンク1に書き込む
・オプション設定メモリのバンク設定を書き換えてバンク1から起動する様に切り替える
(次のバージョアンアップの際は、バンク1(現行ファーム)→更新版のファームをバンク0に書き込む&バンクを0から起動する様に切り替える)
という様な手法が使えます…
わわいです
1.Ethenetを使って、正常にデータの転送ができる
2.プログラム中から、フラッシュメモリの書き換えができる
ってことがきちんと実装できるなら、可能です。
> キーワード的には「セルフプログラミング」が該当しますか?
該当します。
ハードルはちと高いと思いますが、がんばってください
ありがとうございます。
現時点でEthernetを使用する通信は自在にできております。
ただ、フラッシュメモリ等々、「メモリ」に関する知識があやふやなので
セルフプログラミング周りのマニュアルを読んでもさっぱり分からない状態ではあります。
この辺は今から頑張ってみます。
あと、もう1点気になっていることがあり、もしご存じでしたら教えてください。
現在FreeRTOSを使っています。セルフプログラミングを実装するにあたって支障がありそうですか?
あまり分かってないのですが、メモリの配置のされかたなどを意識してやる必要があると思いますので
OSを使ってしまっていると、どうなるのかなーという ざっくりとした不安があります。
何か御意見いただけると助かります。
一般的には、通信して書き換えるプログラムと、書き換える対象の(本番の)プログラムを全く別個のモジュールとします。
ってことで、本番側でOSを使ってようが関係ありません
で、メモリ配置は上記の2つのモジュールを別個のメモリエリアに配置することになりますんで、そこらへんもいろいろとややこしくなりますんで覚悟しておきましょう
ありがとうございます!
おかげ様でイメージがわきました。
先は長そうですが、RA6M5のハードウェアマニュアルとにらめっこしてみます。
という様な手法が使えます。
(ファーム書き換えプログラムが格納されている領域を書き換えなくても良いので、現行ファームや割り込みのテーブルをRAMにコピーしてRAMで実行などの手間は不要であるかと思います)
フラッシュメモリの書き換えに関しては、FSPのstacksで"r_flash_hp"を追加すれば、消去(R_FLASH_HP_Erase)や書き込み(R_FLASH_HP_Write)、バンク切り替え(R_FLASH_HP_BankSwap)のAPI関数が用意されているので、FACIコマンドの章は読まなくても、書き換え自体はできてしまうかと思います。
tf様 ありがとうございます。
おかげ様で下記のマニュアルにたどり着くことができました。
https://www.renesas.com/jp/ja/document/apn/ra6-secure-firmware-update-using-mcuboot-and-flash-dual-bank-application-project
見ようみまねでやってみただけですが
ブートローダからプライマリアプリケーションを起動することができるようになりました。
USBやUARTでアップデートを行うようなサンプルプログラムもありましたので
これをEthernetバージョンに流用して試してみます。
Dualモードを使用して自作のアプリケーションから
Ethernetでファームウェアアップデートできるようになりました。
一点、質問がありまして、
現在、バージョン番号の高いものへのアップグレードはできるのですが
ダウングレードができません。具体的にはセカンダリイメージにバージョン番号の低いイメージを書き込むと、SWAPが実行されません。
「Upgrade Mode」の設定はDirect XIPにしています。
下記マニュアルの Page22
ここに Direct XIPモードではMCU boot側でダウングレード防止がサポートされていると記述があります。
MCU bootの「Downgrade Prevention」をDisabledにしても、ダウングレードはできませんでした。
これはDirect XIPモードではダウングレードはできない仕様 という認識で合っているでしょうか?
任意のバージョンに書き換えをしたい場合、Direct XIPモードや Dualモードは使用せず、何か他のやり方を選択する必要があるということでしょうか?
MCU_bootのloader.cの中にセカンダリエリアに書かれたイメージとプライマリエリアのイメージの
バージョン比較部分があったのでそこを改造してダウングレードできるようになりました。
と思いきや、再起動するたびにバージョンが入れ替わるように。。。
そりゃそうか。。。
R_FLASH_HP_BankSwapをブートローダー(MCU_boot)内で実行するのをやめて
プライマリアプリで書き込みデータ受信+セカンダリにイメージ書き込み+BANKSWAP + SystemResetでとりあえずダウングレードはできるようになりました。
ブートローダ(MCU_BOOT)使うのをやめて
シンプルにDualモードの下BANKの先頭番地0にアプリケーションを配置
下BANKのアプリケーションでファームウェア受信+上BANKに対してR_FLASH_HP_Erase+R_FLASH_HP_Writeを実行
書き込み終わったらR_FLASH_HP_BankSwap呼んで再起動
という流れでやりたいことができるようになりました。
不正なファームを転送された場合の処理など意識するとMCU_BOOTを使用したほうがよさそうですが
そこまで気にするものを作成してないので今回はこれで良しとしました。
以上