SSブログ

PSoC 3 で、 HID Bootloader を試す (5) [PSoC]このエントリーを含むはてなブックマーク#

CY8CKIT-030

これまで、単純に Bootloader を実装してきましたが、 MiniProg3 などを使って SWD でアクセスすると、フラッシュ ROM の内容が丸見えになってしまいます。 大事なファームウェアを保護するには、フラッシュ ROM にプロテクトをかけます。

フラッシュ ROM には、4レベルのプロテクションレベルがある

フラッシュ ROM には、 256 バイトの row 単位でプロテクトを設定できるようになっています。 それぞれの領域に設定可能なプロテクションレベルは、以下の4種類です。

プロテクションレベル概要
U - Unprotected 全くプロテクトがかかっていない状態です。 内蔵ファームウェアからも外部プログラマからも読み書きができます。
F - Factory Upgrade 内蔵ファームウェアからの読み書きと外部プログラマからの書き込みは出来ますが、外部プログラマからの読み出しが禁止されます。
R - Field Upgrade 内蔵ファームウェアからは読み書きができますが、外部プログラマからは読み書きともに禁止されます。
W - Full Protection 外部プログラマからのアクセスおよび内蔵ファームウェアからの消去書き込みが禁止されます。

BootloaderBootloadable は、互いに使用方法が異なっていますので、これらの領域ごとにプロテクションレベルを考えて設定します。

Bootloader が破壊されては困る

Bootloader は、ここで想定しているシステムの要(かなめ)です。 ホストから新たな Bootloadable アプリケーションを受け付けられるのも、 Bootloader が存在すればこそです。 そこで、 Bootloader 部分には、なにがあっても破壊されない、最も強力なプロテクトをかけます。

そこで、この領域には、 "W - Full Protection" のプロテクションレベルを適用します。 このプロテクションレベルが設定されると、 Bootloader の領域は、フラッシュ ROM の一括消去以外では、破壊されなくなります。 また、外部プログラマから読み出される事もないため、情報が安全に守られます。

Bootloadable は、 Bootloader によって書き換えられる

Bootloadable の領域は、内部ファームウェアである Bootloader によって書き換えることができます。 しかし、外部プログラマからのアクセスは、情報を守るために禁止しなくてはなりません。

そこで、この領域には、 "R - Field Upgrade" のプロテクションレベルを適用します。 このプロテクションレベルが設定されると、 Bootloadable の領域は、 Bootloader からの読み書きができます。 ただし、外部プログラマからのアクセスが禁止され、外部からの読み出しおよび破壊・改ざんなどから情報を守る事ができます。

フラッシュ ROM のプロテクト設定

MAP ファイル

それぞれの領域のプロテクションレベルを決定したので、 PSoC Creator で実際に設定します。 まずは、 Bootloader が、フラッシュ ROM のどこまでの範囲に配置されるかを調べます。

Bootloader の配置アドレスを調べるには、 "Workspace Explorer" の "Results" タブから Bootloader プロジェクトの ".map" ファイルを開きます。 ここでは、 "USB_Bootloader.map" を開きます。


フラッシュの最終アドレス

フラッシュ ROM は、 "CODE MEMORY" というセグメントに配置され、このファイルでは、後に "XDATA MEMORY" が続いています。 ここで作成した "USB_Bootloader" の場合、 000000H から 003759H までの範囲に配置されます。 フラッシュ ROM は、256バイトの row 単位で消去・書き込み・プロテクションレベルの設定ができます。 そのため、実際に Bootloader のために確保されるのは、 000000H から 0037FFH までの 56rows の範囲です。


Flash Security の設定

プロテクションレベルは、 "USB_Bootloader.cydwr" の "Flash Security" タブで設定する事ができます。 このタブで row ごとにプロテクションレベルを設定しますが、一つずつ設定するのは大変です。


プロテクションレベルの設定ボタン

そこで、タブの上方にある一括設定ボタンを使用します。


領域From rowto設定
Bootloader (0000-37FF)055W - Full Protection
Bootloadable (3800-FFFF)56255R - Field Upgrade

上記の設定のあと Set ボタンをクリックすると、プロテクションレベルを設定できます。

デバッガからのアクセスを禁止する

デバッガからメモリにアクセスする

フラッシュ ROM にプロテクトをかけると、確かにプログラマからのアクセスが禁止されますが、実は、もう一つ抜け道が残っています。 それは、デバッガです。 PSoC 3 がデバッガからの接続を受け付けている限り、デバッガはメモリに対してアクセスする事ができます。 "USB_Bootloader" の場合も、このままではファームウェアが丸見えです。


Enable Debug Protection

この状態に対処するためには、デバッガが接続できないように設定しなくてはなりません。 "USB_Bootloader.cydwr" の "System" タブで "Enable Device Protection" をチェックします。 これで、デバッガからの接続は拒否され、ファームウェアを保護する事が出来るようになります。

デバッガの接続を受け付けられないという事は、アプリケーションのデバッグも出来ないという事を意味します。 しかしながら、 Bootloadable のプロジェクトでは、デバッガを起動する事がそもそもできないので、デバッガを使ったデバッグを行う事が出来ません。 開発段階でデバッガを使う必要がある場合には、 "Enable Device Protection" の設定を元に戻すほか、 "Project"→"Build Settings..." で "Application Type" をBootloadable から Normal に変更し、回路図に配置した "Bootloadable" の Property で CY_REMOVE を "true" に設定し、ソースコードで "Bootloadable" を参照している部分を変更します。 これで、通常のアプリケーションとしてデバッグを行うことが出来ます。

Bootloadable の NVL 設定は、 Bootloader に合わせる

フラッシュ ROM にプロテクションを設定するため、 "USB_Bootloader.cydwr" の "System" タブの設定を変更してきました。 この "System" タブの設定は、ファームウェアから設定されるものではなく、 Non Volatile Latch (NVL) と呼ばれる特殊な不揮発性メモリに記録されリセット後に自動的に設定されます。 もちろん、 NVL は、一つの PSoC 3 には、一つしかありません。 そのため、 Bootloadable が実行される場合でも、 Bootloader から Bootloadable が呼び出され時にソフトウェアリセットが発生し、 Bootloader で設定した NVL の値が使用されます。 このような事情から、 Bootloadable の開発を行う場合でも、 "System" タブの設定を Bootloader で設定した値と同じにする必要があります。 設定が異なっている場合には、初期状態が違うためにポートが動作しないなどの症状が出る場合がありますので、気を付けてください。

参考文献

関連文献

開発編 ARM PSoCで作るMyスペシャル・マイコン (トライアルシリーズ)

開発編 ARM PSoCで作るMyスペシャル・マイコン (トライアルシリーズ)

  • 作者: 圓山 宗智
  • 出版社/メーカー: CQ出版
  • 発売日: 2013/12/24
  • メディア: 単行本

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。