NXPサポートチーム様
現在、NXP S32K146 MCU 上でブートローダベースのファームウェア更新メカニズムを開発しています。開発中に、特定のファームウェア イメージをフラッシュした後にデバイスが保護され、消去できなくなるという重大な問題が発生しています。
私たちのセットアップでは、ブートローダーとアプリケーション アーキテクチャを使用します。MCU は最初は期待どおりに動作し、ファームウェアの更新も正常に機能します。ただし、アプリケーションを複数回フラッシュした後、またはアプリケーションをベース (ブートローダ以外) リンカー構成に切り替えると、デバイスはセキュリティ保護された状態になります。この状態では、connect-under-reset を使用しても大量消去が失敗し、デバッガーは接続できません。J-Link は、デバイスが保護されており、コアを停止できないことを報告し、これにより、それ以上のフラッシュとファームウェアの検証がブロックされます。
使用される MCU は S32K146 であり、JTAG 経由で SEGGER J-Link V9 デバッガーを使用しています。
以下は、このプロジェクトで使用されるフラッシュ メモリのレイアウトです。
ブートローダーリンカー構成:
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x000FFBF0
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000F000
}アプリケーション リンカーの構成:
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x00010000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00010400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00010410, LENGTH = 0x000EFBF0
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000F000
}ベースアプリケーションリンカー構成(ブートローダーなし):
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x000FFBF0
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000F000
}フラッシュ コンフィギュレーション フィールドの正しい処理、ブートローダとアプリケーションの分離のための推奨リンカー レイアウト、意図しないフラッシュ セキュリティ ロックを防止する方法、および S32K146 MCU で信頼性の高いファームウェア更新メカニズムを実装するためのベスト プラクティスについてご指導をお願いいたします。
あなたのサポートは、この問題を解決し、ファームウェアの検証を安全に進めるのに役立ちます。
ご協力ありがとうございました。
よろしくお願いします、
パンディヤンT
ファームウェア エンジニア。
こんにちは@Panidiyan_T
ご提供いただいたリンクファイルの設定に問題は見つかりませんでした。
そしてあなたのアプローチは最も一般的です。
ブートローダとアプリケーション コードがフラッシュ内に存在する場合は、ブートローダでチップ セキュリティとフラッシュ データ保護機能を構成することをお勧めします。ブートローダが破損するのを防ぐために、ブートローダ コード領域のデータ保護を構成することもお勧めします。