アプリケーションノート 111 - ARM Information Center

アプリケーションノート111
フラッシュメモリのプログラミング
資料番号:ARM DAI 0111AJ-00
発行日:2003 年 5 月
Copyright ARM Limited 2003
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
アプリケーションノート 111
フラッシュメモリのプログラミング
Copyright © 2003 ARM Limited. All rights reserved.
リリース情報
アプリケーションノート 111 の改訂履歴は以下の通りです。
改訂履歴
日付
発行
変更内容
2003 年 5 月
A
初版
著作権
ARM、ARM Powered ロゴ、Thumb、StrongARM は、ARM 社の登録商標です。
ARM ロゴ、AMBA、Angel、ARMulator、EmbeddedICE、ModelGen、Multi-ICE、ARM7TDMI、ARM9TDMI、TDMI、
STRONG は、ARM 社の商標です。
本書に記載されている他のすべての製品・サービスは、その所有者の商標です。
守秘義務
本書は誰でも閲覧することができます。配布に関する規定はありません。
アプリケーションノート 111 に関するご意見・ご質問
に関するご意見・ご質問
本アプリケーションノートに関するご意見等がございましたら、電子メールに以下の情報をご記入の上、errata@arm.comま
でお寄せ下さい。
•
資料名
•
資料番号
•
ご意見のあるページ番号
•
ご意見の内容
補足または改善すべき点についてのご提案もお待ちしています。
ARM ホームページ
http://www.arm.com
ii
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
目次
1
はじめに ....................................................................................................................................2
2
AXD のフラッシュダウンロードオプション .............................................................................3
2.1
2.2
3
ARM Firmware Suite によるフラッシュメモリのサポート......................................................5
によるフラッシュメモリのサポート
3.1
3.2
3.3
4
はじめに ..........................................................................................................................7
サンプルユーティリティのファイル................................................................................7
Flash API .........................................................................................................................8
Intel フラッシュメモリ関数 .............................................................................................9
ユーティリティを使用する............................................................................................11
Integrator/CP 向けにコードを修正する .........................................................................12
サンプルユーティリティの移植 ..............................................................................................13
5.1
5.2
5.3
5.4
Application Note 111
ARM DAI 0111AJ-00
ARM フラッシュユーティリティ .....................................................................................5
ブートモニタ ...................................................................................................................5
ARM フラッシュライブラリ ............................................................................................5
フラッシュプログラミングユーティリティのサンプル ............................................................7
4.1
4.2
4.3
4.4
4.5
4.6
5
フラッシュダウンロードオプションについて .................................................................3
AXD からフラッシュダウンローダを使用する ................................................................4
はじめに ........................................................................................................................13
Evaluator-7T フラッシュメモリの概要 ..........................................................................13
SST フラッシュメモリの概要........................................................................................13
コードの変更 .................................................................................................................13
6
参考資料 ..................................................................................................................................16
7
付録 - CFI フラッシュメモリ ...................................................................................................17
Copyright © 2003 ARM Limited. All rights reserved.
1
はじめに
本アプリケーションノートでは、ARM 搭載システム上のフラッシュメモリをプログラミングする
方法について説明します。
本書は以下のセクションから構成されています。
注
1.
本セクション
2.
AXD のフラッシュダウンロードユーティリティについて説明します。この章では、AXD を使
用して、ARM Integrator/AP ボード上のフラッシュメモリにバイナリファイルを書き込む方法
を説明します。
3.
ARM Firmware Suite に含まれるフラッシュメモリへのプログラミング機能について説明しま
す。この中では、ARM フラッシュユーティリティ、Integrator/AP ブートモニタ、ARM フラッ
シュライブラリについて説明します。
4.
C 言語で記述された簡単なフラッシュメモリへのダウンロードユーティリティについて説明し
ます。
5.
セクション 4 で説明されているユーティリティを移植して、他のボード上のフラッシュメモリ
を プ ロ グ ラ ム す る 方 法 に つ い て 説 明 し ま す 。 一 例 と し て 、 こ の セ ク シ ョ ン で は ARM
Evaluator-7T 上で動作するユーティリティの移植方法を説明します。
6.
参考資料
7.
この付録では、汎用フラッシュインタフェース(CFI)について説明します。
本アプリケーションノートのセクション4で説明されているユーティリティは、RealView デバッガ
(RVD)でも使用できます。また RVD には、アプリケーションノート 110「RVD によるフラッ
シュメモリのプログラミング」で説明されているフラッシュメモリへのプログラミング機能が組み
込まれています。
2
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
AXD のフラッシュダウンロードオプション
2
AXD のフラッシュダウンロードオプション
2.1
フラッシュダウンロードオプションについて
AXD からフラッシュダウンロードオプションを起動すると、ターゲットボード上の RAM に簡単な
フラッシュメモリプログラミング用ユーティリティがロードされます。次に、ARM コアによってこ
のユーティリティが実行されます。このユーティリティは、セミホスティング機能を使用してホス
トコンピュータ上のファイルを読み出します。ダウンロードされるファイルはプレーンバイナリ形
式である必要があります。fromelf ユーティリティを使用して、ELF 形式のファイルをプレーンバイ
ナリ形式に変換する方法については、ADS 1.2「リンカ/ユーティリティガイド」を参照して下さい。
2.1.1
互換性
Integrator/AP 対応のフラッシュダウンロードコードが install_directory\bin\flash.li にバイ
ナリ形式で格納されています。このファイルを使用することにより、ARM Integrator/AP ボードに
実装された Intel DT28F320 デバイスをプログラムできます。
注
このバージョンのフラッシュダウンローダは、 ARM Integrator/AP ボードでのみ使用できます。
ARM Integrator/AP はビッグエンディアンモードでは動作しません。ビッグエンディアンモードで
使用しようとすると警告メッセージを表示する、flash.bi という名前のダミーファイルが提供され
ています。
注
ADS 1.1 以前のバージョンでは、Integrator ではなく ARM 開発ボード(PDI)をターゲットとした
フラッシュダウンローダが提供されていました。フラッシュダウンローダの動作原理は同じです。
2.1.2
Integrator/AP のスイッチの設定
Integrator/AP ボードのスイッチの設定(以下参照)により、リセット後または起動後に実行される
コードが選択されます。
設定 1:
:S1-1 OFF(下)
•
ボードがアプリケーションフラッシュメモリから直接ブートされます。
•
アドレス 0x24000000 にあるフラッシュメモリ(アプリケーションフラッシュメモ
リ)が 0x0 番地にマップされ、リセット後はこの位置から実行が開始されます。通常、
アプリケーションコードによって(RAM がアドレス 0x0 にくるように)メモリマッ
プが「リマップ」されます。
設定 2:
:S1-1 ON、S1-4 ON
•
ブートモニタが実行され、コマンドプロンプトが表示されます。
•
アドレス 0x20000000 にある「ブート ROM」が 0x0 にマップされ、リセット後はこ
の位置から実行が開始されます。その後、RAM がアドレス 0x0 にくるように、ブー
トモニタによってリマップされます。
設定 3 :S1-1 ON、S1-4 OFF
•
ブートモニタが実行され、アプリケーションフラッシュメモリへジャンプします。
•
ブートモニタによって ROM/RAM のリマップが実行されます。
•
アプリケーションフラッシュメモリ内の任意のイメージにジャンプするようにブート
モニタをプログラムできます。
フラッシュメモリをプログラムする場合、AXD によってフラッシュメモリのプログラムコードが
ダウンロードされる前に必ず ROM/RAM のリマップが行われるように、スイッチ 1 を ON にして
ブートすることを推奨します。ROM/RAM のリマップが必要とされる理由は、フラッシュメモリの
プログラムコードがアドレス 0x8000 にダウンロードされるため、この位置に RAM が存在してい
る必要があるからです。
注
コアモジュールに SDRAM DIMM が接続されている場合を除き、使用されるコアモジュールによっ
ては$top_of_memory に 0x40000 を設定しなくてはならない場合があります。
3
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
2.2
AXD からフラッシュダウンローダを
からフラッシュダウンローダを使用する
使用する
AXD からフラッシュダウンローダを使用する場合は、以下の手順に従って下さい。
1. Integrator 上のアドレス 0x0 に RAM が存在することを確認します。スイッチ 1 を ON にしてリ
セットすることで、この位置に RAM を配置できます。
2. AXD を起動し、(Multi-ICE または Angel を介して)ターゲットに接続します。
3. [File]メニューから[Flash Download...]を選択します。以下の[Flash Download]ダイアログが表示
されます。
4. 入力情報(以下参照)を指定するか、[Browse]をクリックしてダウンロードするバイナリファ
イルを選択します。ブロック、イメージ、アドレスには、デフォルト値を使用することも、別
の値を使用することもできます。
•
ローダ情報が入力されていない場合は、ダウンローダは以下のデフォルト値を使用します。
イメージ番号 128
ブロック番号 0
イメージのベースアドレス 0x24000000
•
デフォルト値以外の値を使用する場合は、[Loader options]フィールドに以下の形式で入力
して下さい。
[a<address> |or| b<block_no>] i<image_no> *name
例:
b5 i5 *my_image
5. [OK]をクリックします。フラッシュダウンローダによってバイナリファイルが読み込まれ、
[Console]プロセッサビューにダウンロードの設定が表示されます。
6. 必要に応じて設定内容を編集し、[Enter]キーを押します。フラッシュメモリにデータが書き込
まれると、[Console]ビューにメッセージが表示されます。
4
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
ARM Firmware Suite によるフラッシュメモリのサポート
3
ARM Firmware Suite によるフラッシュメモリのサポート
ARM Firmware Suite は、ハードウェアを動作させるための様々なユーティリティとサポートコード
で構成されています。ARM Firmware Suite を構成するいくつかのコンポーネントは、(新しいプ
ラットフォームへの移植が可能なように)ソースコードと、様々な開発ボード用のビルド済みのイ
メージの両方で提供されています。以下ではフラッシュメモリに関連するものについて説明します。
3.1
ARM フラッシュユーティリティ
ARM フラッシュユーティリティ(AFU)を使用して、フラッシュメモリ内のデータを管理したり、
フラッシュメモリにデータを保存することができます。ダウンロードされたコードに関する情報も、
Integrator のブートモニタが使用できる形式で、フラッシュメモリにプログラムされます。これに
より、ARM ブートシステムを使用して、ボード上でコードを実行できます。
サポートされているターゲット上で AFU を使用してフラッシュメモリをプログラムする場合は、
ビルド済みの afu.axf イメージ(ARM Firmware Suite に収録されています)をデバッガにロードし
て実行します。
このユーティリティ(AFU)には、AXD の標準機能であるフラッシュダウンロードオプションよ
りも多くの機能があります。たとえば、イメージ全体を削除したり、フラッシュメモリの特定のブ
ロックを削除することができます。これらの処理は、単純なコマンドラインインタフェースを使用
して実行されます。さらに AFU では、ELF や Motorola S レコードなどの様々な入力ファイル形式
がサポートされています。このユーティリティの詳細については、AFS 1.4 リファレンスガイドの
第 7 章を参照して下さい。
3.2
ブートモニタ
Integrator/AP では、フラッシュメモリにブートモニタがあらかじめロードされており、このブート
モニタを使用してフラッシュメモリの簡単な管理を行うことができます。ブートモニタの操作は、
ARM Integrator/AP 上のシリアルポート A を介して(例:Windows HyperTerminal 経由)行うこと
ができます。
ブートモニタは、AXD からは完全に独立しています。ブートモニタを使用したフラッシュメモリ
のプログラミングは時間がかかるため、AXD を使用できない場合を除いては、この方法は推奨さ
れません。フラッシュメモリをプログラムするブートモニタのコマンドは以下の通りです。
‘BI’:デフォルトのフラッシュイメージ番号に、指定されたイメージ番号が設定されます。
‘E’:フラッシュメモリ全体が消去されます。
‘V’:アプリケーションフラッシュメモリと SIB の内容が検査・表示されます。
‘L’:Motorola S レコード形式のイメージがフラッシュメモリにロードされます。
ブートモニタの詳細については、AFS 1.4 リファレンスガイドの第 3 章を参照して下さい。
3.3
ARM フラッシュライブラリ
ARM フラッシュライブラリは、AXD のフラッシュダウンロードユーティリティ、AFU、ブートモ
ニタのすべてに使用されます。ARM フラッシュライブラリは、ARM Firmware Suite(AFS)に収
録されているフラッシュメモリ管理ルーチンであり、ターゲットに関係なく動作するように設計さ
れています。必要に応じてコールバック関数を使用することで、ターゲット固有の機能を実装でき
ます。
ARM フラッシュライブラリは、大容量のフラッシュメモリが組み込まれたボード(Integrator な
ど)で動作するように設計されています。このフラッシュメモリの空間には、独立した数多くのプ
ログラムや関連データを保存できます。ARM フラッシュライブラリには、これらのプログラムや
データを整理するためのファイリングシステムが実装されています。フラッシュメモリへの書き込
みだけを実行する場合には、ARM フラッシュライブラリを使用する必要はありません。
3.3.1
ライブラリ構造と API
ARM フラッシュライブラリでは、使用される物理フラッシュメモリデバイスを抽象化した API が
定義されており、複数の物理デバイス(またはその部品)を使用する「論理」デバイスを定義でき
るようになっています。
5
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
この抽象化は、フラッシュライブラリ内で定義されている、リンクされた 2 つの構造体によって管
理されます。物理デバイスは、フラッシュメモリのサイズ・位置・タイプに関する情報を保持する
flashPhysicalType 型の構造体によって定義されます。これらの構造体には、フラッシュメモ
リの基本的な操作(書き込み、読み出し、消去など)を実行する関数へのポインタも保持されます。
論理デバイスは、一連の flashType 構造体で定義されています。これらの構造体には、その論理
デバイスに使用される最初の物理フラッシュメモリデバイスと、このデバイスへのオフセットなら
びにデバイスのサイズが記述された flashPhysicalType 構造体へのポインタが保持されます。
このオフセットによって、フラッシュメモリの最初の部分を別の論理デバイスに使用することがで
きます。記述されたサイズがフラッシュメモリデバイス内の残りの空間のサイズを超えると、リン
クされた一連の flashPhysicalType 構造体から、次のデバイスが使用されます。
フラッシュライブラリ関数のほとんどには、flashType 構造体がパラメータとして使用されます。
フラッシュライブラリ関数は、このパラメータを、使用する物理デバイスを決定するために利用し
ます。次に、この物理デバイスを記述した構造体が使用され、そのデバイスをプログラムする関数
が決まります。
フラッシュライブラリは、フラッシュメモリ内に 1 つの構造体を保持します。フラッシュメモリ内
には独立した複数のイメージを保存できます。イメージは、必要な数のブロックを使用して保存さ
れ、そのイメージに関する情報は、最後のブロックに含まれるいくつかの構造体内に保存されます。
これらの構造体を保持できるだけの十分な空間が最後のブロックにない場合には、さらに別のブ
ロックが使用されます。フラッシュライブラリの構造体がイメージの前に保存されることはないた
め、フラッシュメモリデバイスがアドレス 0x0 で始まるシステムでは、イメージの最初の命令がリ
セットベクタに配置されます。
6
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
フラッシュプログラミングユーティリティのサンプル
4
フラッシュプログラミングユーティリティのサンプル
4.1
はじめに
このセクションでは、ARM 搭載システムにおけるフラッシュメモリのプログラミングの例を示す
ために C 言語で記述された簡単なユーティリティについて説明します。このユーティリティは、
フラッシュメモリへの書き込みを実行する単純な関数の例を示すことを目的としているため、
ARM フラッシュライブラリは使用しません。ファイリングシステムやイメージ管理機能は実装さ
れていません。
このユーティリティは、Intel フラッシュメモリを使用する ARM Integrator/AP または/CP 開発ボー
ドを対象として記述されています。セクション5では、SST フラッシュメモリデバイスを使用する
ARM Evaluator-7T ボードへこのユーティリティを移植する方法を説明しています。
4.2
サンプルユーティリティのファイル
サンプルユーティリティは以下の 5 つのファイルで構成されています。
4.2.1
•
Flashdemo.c - セクション4.2.1参照
•
Flash.h - セクション4.2.2参照
•
Intel_Flash_Routines.c - セクション4.2.3参照
•
Integrator_target.c - セクション4.2.4参照
•
Integrator.h - セクション4.2.4参照。このファイルを Integrator/CP で使用する場合
は若干の修正が必要です。詳細についてはセクション4.6を参照して下さい。
Flashdemo.c
メインのサンプルコードが含まれています。このファイルの目的は、完全なフラッシュメモリプロ
グラミングユーティリティとして機能することではなく、フラッシュルーチンの使用例を示すこと
です。
標準 C ライブラリヘッダ以外にこのソースファイルが参照するファイルは、フラッシュメモリ関
数へのインタフェースを指定する Flash.h のみです。
このサンプルユーティリティでは、セミホスティング操作を使用して、ホストコンピュータのファ
イルがフラッシュメモリにプログラムされます。この処理は、ユーティリティにパラメータ
(argv および argc)が渡されたかどうかをチェックすることから開始されます。パラメータが
渡されている場合には最初のパラメータがファイル名と見なされ、そのファイルを開く処理が試行
されます。ファイルが開けない場合には、ファイル名の入力を促すプロンプトが表示されます。も
う一つの引数が指定されている場合、この引数はフラッシュメモリ内にプログラムするためのベー
スアドレスと見なされます。もう一つの引数が指定されていない場合には、ベースアドレスの入力
を促すプロンプトが表示されます。
その後、flash.h 内の API から関数が呼び出されて、セクション4.3で説明されているようにフ
ラッシュメモリのプログラミングが実行されます。
4.2.2
Flash.h
このファイルには、フラッシュメモリをプログラムする関数への最小限のインタフェースが記述さ
れています。このファイル内の定義は、新しいフラッシュメモリデバイス用の関数が追加される場
合でも変更されないことを前提としています。このインタフェースは以下の 2 種類に分類されます。
•
フラッシュメモリ固有の関数。Intel_Flash_Routines.c 内に実装されています。
•
ターゲット固有の関数。<target>_target.c 内に実装されています。
このインタフェースで使用される各関数の説明については、セクション4.3を参照して下さい。
7
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
4.2.3
Intel_Flash_Routines.c
このファイルには、Intel フラッシュメモリへのアクセスに使用されるすべてのコードが含まれてい
ます。これらの関数は Integrator/AP 開発プラットフォームを使用して記述・テストされています
が、Intel 基本コマンドセットを使用するすべてのフラッシュメモリデバイスを対象としています。
Integrator のフラッシュメモリデバイス上に実装されている汎用フラッシュインタフェース(CFI)
は使用されていません(CFI の概要についてはセクション7を参照)。
このファイルは、integrator.h 内の情報を元に、フラッシュメモリの位置、サイズならびにア
クセス幅を定義します。Intel フラッシュメモリが組み込まれた他のターゲットをサポートする場合
は、インクルードファイルのみを変更する必要があります。
注
4.2.4
このファイルに含まれているコードは、Integrator 開発プラットフォーム上でのみテストされていま
す。このコードのいくつかの部分は、fc32x1 などのシンボルによって条件付きでコンパイルされて
います。これらのシンボルはフラッシュメモリのアクセス幅を表しており、fc16x2(16 ビット幅の
フラッシュメモリデバイスが同時に 2 つ使用されることを表します)のみがテストされています。
Integrator_target.c、
、Integrator.h
この 2 つのファイルでは、(フラッシュメモリではなく)プラットフォーム固有の関数とパラメー
タが定義されています。Flash_Write_Enable と Flash_Write_Disable は flash.h 内で定
義されているため、何も行わなくてよい場合でも実装する必要があります。Integrator/AP プラット
フォームでは、これらの関数による EBI(外部バスインタフェース)レジスタへの書き込みによっ
て、書き込みアクセスのイネーブル/ディセーブルが行われます。
4.3
Flash API
フラッシュメモリはいくつかのブロックから構成されます。一般的にこれらのブロックのサイズは
同じですが、そうでない場合もあります。フラッシュメモリでは 1 ブロック全体を一度に消去する
ことのみが許されており、その際にはブロック内のすべての記憶ビットに論理値「1」がセットさ
れます(そのため、消去されたフラッシュメモリを読み出すと 0xFFFFFFFF が返されます)。メ
モリの個々のワードへの書き込みは可能ですが、書き込み前にその位置が消去された状態でなくて
はなりません。通常、フラッシュメモリのプログラミングと消去を行うには、フラッシュメモリ空
間の特定の位置にデータ値(一般にコマンド)のシーケンスを書き込む必要があります。
一部のフラッシュメモリには、1 つの命令でメモリ全体を消去したり、ブロックを個別に「ロッ
ク」したり、すべてのブロックへの書き込みを高速で実行するといった追加機能があります。
flash.h 内で定義されている API は、フラッシュメモリを効率的に処理できるよう、一般的な機
能(1 ワードの書き込みやブロック消去など)が利用できるように設計されています。また、特定
のデバイスの機能を隠蔽しながらもフラッシュメモリ関数として、フラッシュの各種機能が使用さ
れる際にも柔軟に対応できるインタフェースが提供されています。
たとえば、Flash_Write_Area 関数は、メモリエリアへの書き込みを行います。デバイスによっ
ては、この関数は単に Flash_Write_Word を繰り返し呼び出すだけです。しかし、Intel フラッ
シュメモリ関数では、この関数内から Intel デバイスのブロック書き込み機能を利用しています。
「非破壊書き込み」関数は含まれていません(この関数を使用するとブロック内の 1 つのエリアに、
そのブロックの残りの部分を消去せずに書き込むことができます)。ほとんどのフラッシュメモリ
では、書き込まれないブロックエリアの読み出し(および保存)が行われた後にブロック全体が消
去され、読み出されたデータが元の場所に書き込まれることになります。この処理を行うには、フ
ラッシュメモリ関数に必要なメモリ容量が多くなり、動的メモリ割り当ての機能も必要になるで
しょう。しかし、このような API が存在すると、非破壊書き込みの処理をアプリケーションプログ
ラム内に容易に実装することが可能になり、メモリ管理機能を特定のアプリケーションに合わせて
より簡単にカスタマイズできるようになります。
4.3.1
Flash_Write_Word
この関数は、1 ワード(32 ビット)をフラッシュメモリに書き込みます。書き込み先のアドレスと、
そこに書き込むデータ値が渡されます。書き込み先の位置は最初に消去されないため、この関数を
呼び出すときはすでに消去されているアドレスを使用して呼び出す必要があります。この関数が 2
つの異なるハーフワードの書き込みを実行するような場合でも、フラッシュメモリへの物理的なア
クセスサイズはこの関数の呼び出し元からは見えません。
8
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
フラッシュプログラミングユーティリティのサンプル
4.3.2
Flash_Write_Area
この関数は、データブロックをフラッシュメモリに書き込みます。書き込まれるエリアが 1 つのブ
ロック内に収まっている必要はありませんが、この関数を呼び出すアプリケーションは、書き込ま
れるエリア全体が関数の呼び出しの前に消去されていることを確認する必要があります。この関数
には、プログラムされるエリアのベースアドレスとソースデータへのポインタ、書き込みデータの
サイズ(バイト)が渡されます。
この関数からは PASS (0)または FAIL (1)が返されます。
4.3.3
Flash_Calc_Blocks
この関数は、指定されたエリアのプログラミングの前に消去する必要のあるフラッシュメモリのエ
リアを返します。つまり、渡されるメモリエリアとオーバラップするすべてのブロックの開始アド
レスと合計サイズが返されます。アプリケーションは返された値に基づいて、特定のフラッシュメ
モリのブロック構造を知らなくても、前に保存されたデータが消去されるかどうか(または後でこ
のデータを元の位置に書き込めるかどうか、あるいはその両方)をチェックすることができます。
この関数には、ベースアドレスおよび指定されたエリアのサイズ(バイト)を保持する 2 つの変数
が参照で渡されます。これら 2 つの変数は、消去する必要のあるエリアのベースアドレスとサイズ
で更新されます。
この関数からは PASS (0)または FAIL (1)が返されます。FAIL は、消去する必要のあるエリアがフ
ラッシュメモリの範囲外にあることを通知する目的で使用できますが、サンプルコードでは常に
PASS が返されています。
4.3.4
Flash_Erase_Blocks
この関数にベースアドレスとサイズを指定することによって、そのエリアにオーバラップするすべ
てのブロックが消去されます。このエリアがブロックの開始アドレスおよびサイズと一致している
必要はないため、アプリケーションは消去される領域をチェックする必要があるかどうかによって、
最初に Flash_Calc_Blocks を呼び出すかどうかを判断できます。
4.3.5
Flash_Init
フラッシュメモリへの書き込みが可能になる前に実行する必要のある、フラッシュメモリ固有の
コードを記述します。
4.3.6
Flash_Close
フラッシュメモリへの書き込みが完了した後に実行する必要のある、フラッシュメモリ固有のコー
ドを記述します。
4.3.7
Flash_Write_Enable
ターゲット(フラッシュメモリ自体を操作する)固有の初期化コードを記述します。
4.3.8
Flash_Write_Disable
ターゲット固有の終了コード(フラッシュメモリへの書き込みアクセスのディセーブルなど)を記
述します。
4.4
Intel フラッシュメモリ関数
Integrator/AP 開発ボード上で使用されるフラッシュメモリは Intel DT28F320 です。このフラッ
シュメモリの幅は 16 ビットであり、2 個を同時に使用することによって 32 ビット幅でアクセスで
きます。32MB のフラッシュメモリに合計で 8 個のデバイス(4 個×2 列)が使用されます。これ
らのデバイスのパラメータは integrator.h 内に指定されています。
通常、メモリへのアクセス幅はメモリコントローラによってアプリケーションには隠されています
が、コマンドを特定の物理デバイスに書き込む必要があるため、フラッシュメモリをプログラムす
る際にはアクセス幅を知っておくことが重要です。たとえば、16 ビットのフラッシュメモリデバ
イスが 1 つだけ使用される場合には、このフラッシュメモリデバイスの開始アドレスにあるブロッ
クを消去するコマンドを記述すると、ブロック全体が消去されます。同じことを 2 つのフラッシュ
9
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
メモリデバイスが並列に使用されている状況で行うと、指定されたメモリ範囲の 2 倍の範囲にわ
たって一方のハーフワードだけが互い違いに消去されます。したがって、データバスの両側にブ
ロック消去コマンドを発行する必要がありますが、この処理は 1 つの 32 ビット書き込み命令で実
行することができます。
4.4.1
スタティック関数
Intel_Flash_Routines.c には 5 つのスタティック関数が実装されています。これらの関数が
スタティックである理由は、flash.h で定義されている API とは関係がないことと、メインアプ
リケーションから呼び出されることが想定されていないためです。
Flash_Unlock_Block
この関数は、個々のブロックをロックできるという Intel フラッシュメモリデバイスに固有の機能
と関連しています。ブロックがロックされると、指定されたデバイス内のすべてのブロックをアン
ロックする特定のコマンドシーケンスが書き込まれるまで、そのブロックへの書き込みは不可能と
なります。この関数は、消去関数および書き込み関数によって、書き込み先のブロックがロックさ
れていることが検出された場合に呼び出されます。この関数が呼び出されると、並列に接続された
フラッシュデバイスの両方がアンロックされます。
ReadyWait
フラッシュメモリデバイスへのコマンド(ブロック消去など)が発行されてから、そのデバイスが
処理を完了するまでに多少の時間がかかる場合があります。処理が完了するまで、このデバイスに
他のコマンドを書き込むことはできません。この関数は、処理が完了したかどうかを示すフラッ
シュメモリデバイス内のステータスビットを読み出し、完了が通知されるまで読み出しを繰り返し
ます。
Command
Intel フラッシュメモリへのコマンドを発行すると、特定のデータ値が特定の位置に書き込まれます。
この関数は、並列に接続されたデバイスの両方が同時に書き込まれるように書き込みを実行します。
Flash_Write_Block
この関数はメモリエリアへの書き込みを実行しますが、このエリアは 1 つのブロック内に収まって
いる必要があります。エリアが 1 ブロック内に収まっていることにより、フラッシュメモリデバイ
ス内で 16 ワードのバッファを使用することができ、書き込み速度を上げることができます。1 ブ
ロック内に収まるアドレス範囲を使用して Flash_Write_Area を呼び出すと、単にこの関数への
呼び出しが行われます。複数のブロックにまたがるアドレス範囲を使用して Flash_Write_Area
を呼び出すと、オーバラップするブロックごとにこの関数が呼び出されます。
この関数は最初に Flash_Unlock_Block を呼び出して、ブロックがロックされていないことを確
実にします。渡されるアドレスは、正しいブロック内に存在する必要があります。アドレスが渡さ
れると、フラッシュメモリデバイスのモードを正しいモードに変更するために BLOCK_WRITE_MODE
コマンドが発行され、ステータスビットがチェックされます。BLOCK_WRITE_MODE コマンドが受
け入れられなかった場合は再発行される必要があるため、この処理に ReadyWait()を使用するこ
とはできません。
次にバッファに書き込まれるワード数が計算され、正しいブロック内のアドレスに書き込まれます。
バッファに書き込める最大ワード数は 16 ワードですが、書き込むべきワードが常にこの数だけ存
在するとは限りません。バッファのサイズは実際には 16 ハーフワードですが、2 つのデバイスを
同時にプログラミングするため、16 ワードを書き込むことが可能です。
その後、ReadyWait()によるステータスビットのチェックを可能にする PROGRAM_VERIFY コマ
ンドが発行されます。プログラムするデータがまだ残っている場合は、上記のプロセスが繰り返さ
れます。
Flash_Erase_Block
この関数は 1 ブロックを消去します。まずブロックがアンロックされ、消去コマンドが書き込まれ
た後、確認コマンドが実行されます。次にフラッシュメモリデバイスが READ_STATUS モードに設
定され、ReadyWait()が呼び出されて消去が成功したかどうかのステータスがチェックされます。
関数から戻る前に、フラッシュメモリの内容を通常通りに読み出せるようにデバイスが元の
READ_ARRAY モードに設定されます。
10
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
フラッシュプログラミングユーティリティのサンプル
4.4.2
API 関数
Flash_Write_Word
この関数には、デバイスとバスの幅に応じて条件付きでコンパイルされた、主要部分が異なる 6 つ
のバージョンがあります。Integrator 用には、fc16x2 セクションがコンパイルされています。まず、
PROGRAM_COMMAND コマンドの発行によってデバイスが書き込みモードに設定され、データが正
しいアドレスに書き込まれます。その後デバイスは READ_STATUS に設定され、ReadyWait()を
呼び出せるようになります。
ReadyWait()が呼び出されると、ステータスが読み出されます。ブロックがロックされていたた
めに書き込みに失敗したことが通知された場合には Flash_Unlock_Block が呼び出され、この
プロセスが繰り返されます。
この関数の終了前にデバイスは元の READ_ARRAY モードに戻され、書き込みが正しく実行された
ことを検証するために、書き込まれたワードが読み出されます。この検証結果に基づいて、PASS
または FAIL が返されます。
Flash_Write_Area
この関数に渡されるアドレス範囲は潜在的に複数の領域に細分化されます。このとき、各領域がそ
れぞれ 1 つのブロックに保持するよう分割されます。これらの領域のそれぞれにスタティック関数
Flash_write_Block が呼び出されます。
この呼び出しの前に、アドレス範囲がフラッシュメモリの範囲内に収まっているかどうかがチェッ
クされます。収まっていない場合は書き込みが行われず、FAIL が返されます。
Flash_Calc_Blocks
渡されるアドレス範囲を、Integrator.h 内で定義されている FLASH_BLOCK サイズと組み合わ
せることにより、渡されるアドレス範囲とオーバラップするすべてのブロックでカバーされるアド
レス範囲が計算されます。必ず PASS が返されます。
Flash_Erase_Blocks
この関数は、渡されるアドレス範囲とオーバラップする各ブロックに対して
Flash_Erase_Block を呼び出します。
Flash_Init & Flash_Close
Intel フラッシュメモリデバイスには初期化コードも終了コードも必要とされないため、これらの関
数は両方とも単純に元のルーチンに復帰するだけです。
4.5
ユーティリティを
ユーティリティを使用する
使用する
4.5.1
標準アプリケーションとして
サンプルユーティリティをビルドすると、AXD や RealView デバッガなどのデバッガを使用して
ターゲットボード上の RAM にロードできる ARM 実行ファイル(AXF)が作成されます。ター
ゲットボードへの接続には、Multi-ICE、RealView ICE、あるいは他社製の JTAG ツールを使用す
ることができます。Angel デバッグモニタを使用した接続も可能ですが、プログラムする予定のフ
ラッシュメモリから Angel デバッグモニタを実行することはできません。
プログラムされるターゲットアドレスおよびファイルのパス/名前は、これらを指定するデバッガ
の機能を使用して、コマンドライン引数として渡すことができます。これらの値が指定されていな
い場合は、ユーティリティによって入力を促すプロンプトが表示されます。いずれの場合も、ター
ゲットアドレスは 10 進値、もしくは'0x'で始まる 16 進値で指定することができます。ファイル名
は、デバッガが実行されるホストシステムで使用されている形式で指定する必要があります。
11
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
4.5.2
AXD のフラッシュダウンロードオプションからサンプルコードを
のフラッシュダウンロードオプションからサンプルコードを使用する
使用する
サンプルコードは、AXD の「フラッシュダウンロード」オプションで使用できるように記述され
ています。このオプションからサンプルコードを使用するには、.axf ファイルの名前を flash.li
(ビッグエンディアンバージョンを作成する場合は flash.bi)に変更し、<ads install>\bin ディ
レクトリ内に配置します。
フラッシュダウンロードオプションを使用する際、ダウンロードされるファイルはブラウズボタン
を使用して選択することができます。このファイルをプログラムするためのベースアドレスは、
[Options]フィールドに入力します(10 進アドレス、もしくは'0x'で始まる 16 進アドレスを使用で
きます)。いずれかのフィールドが空欄になっている(または無効な)場合は、コードによって値
の入力を促すプロンプトが表示されます。
4.6
Integrator/CP 向けに
向けにコードを
コードを修正する
修正する
Integrator/CP プラットフォームには Intel 28F640J3A120 が使用されています。このフラッシュメ
モリは Integrator/AP 上で使用されているフラッシュメモリと非常によく似ていますが、64K のブ
ロックではなく 128K のブロックが使用されています。メモリマップも AP のものと非常によく似
ています。アプリケーションベースアドレスは同じく 0x24000000 ですが、CP のフラッシュメモ
リは 16MB であり、最後の 256KB がブートローダ用に予約されています。
Integrator/CP でユーティリティを使用するには、integrator.h 内の以下の 2 つの定義を変更する必
要があります。
// Total Flash area in bytes
unsigned int FLASH_SIZE = 16*1024*1024 - 256*1024;
// Block Size
unsigned int FLASH_BLOCK = 128*1024;
// Block Size
サンプルコードでは、これらの変更は別のヘッダファイル(IntegratorCP.h)内に含まれてお
り、フラッシュメモリ関数のもう一つのソースファイル Intel_flash_routines_cp.c の中で、
このヘッダファイルを#include するように変更されています。
12
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
サンプルユーティリティの移植
5
サンプルユーティリティの移植
5.1
はじめに
このセクションでは、前のセクションで使用したサンプルユーティリティを Evaluator-7T ボード
に移植する方法について説明します。
ここでは、フラッシュメモリのメーカーによって提供されているサンプルコードやアルゴリズムを
基にして、別のフラッシュメモリデバイスおよびボードへフラッシュメモリ関数を移植することが
可能なことを示します。
5.2
Evaluator-7T フラッシュメモリの概要
Evaluator-7T には、Integrator の Intel フラッシュメモリとはプログラミングアルゴリズムが異なる
SST フラッシュメモリ(S3C4510x01-QERO)が使用されています。このフラッシュメモリには、
サイズが 512KB の 16 ビットデバイスが 1 つだけ使用されています。
このフラッシュメモリの開始アドレスは 0x01800000 です。ただし、最下位 128KB はブートスト
ラップローダと Angel によって使用されます。このブートコードがないとボードのメモリマップが
セットアップされず、復元も難しい(JTAG デバッガ接続がない場合は不可能)ことから、このエ
リアをリプログラムすることは推奨されません。このため、ここでのサンプルコードの移植では、
フラッシュメモリの開始アドレスを 0x01820000 と定義し、このアドレスよりも下位のエリアは消
去されないようにします。
5.3
SST フラッシュメモリの概要
SST フラッシュメモリは 64K の複数のブロックから構成されています。このブロックはさらに 2K の
セクタに分割されており、セクタごとに消去できます。チップ全体の消去もサポートされています。
セクタ、ブロック、チップの消去操作には、指定された 6 つのハーフワードのシーケンスを、関連
するセクタ、ブロックあるいはチップに指定されたオフセットに書き込む必要があります(最初の
5 ステップはすべての消去操作で同じですが、最後のデータが異なります)。
ハーフワードをプログラムする場合には、消去時と同じ最初の 2 サイクルが実行され、次に消去時
と異なる 3 番目のサイクルが実行され(ただしアドレスは同じ)、その後必要なデータが必要なア
ドレスに書き込まれます。
消去または書き込み処理の完了は、完了前と完了後のデータが正しいことを通知するビットの読み
出しによって検出することができます。別の方法としては、完了前には 1 と 0 を交互に返し、完了
後には定数値を返すトグルビットを使用することができます。
SST フラッシュメモリでは CFI の識別がサポートされていますが、このサンプルユーティリティ
では使用されていません。CFI についてはセクション7で簡単に説明されています。
5.4
コードの変更
5.4.1
概要
Flashdemo.c 内のメインコードは変更されていません。これは、このコードが唯一依存する
flash.h 内のインタフェース定義も変更されていないためです。Evaluator 上のフラッシュメモリ
へのアクセスを可能にするためのコードは必要ないため、Evaluator_target.c にはすぐ復帰す
るだけのダミー関数が用意されています。
Evaluator.h は Integrator.h に基づいていますが、パラメータは Evaluator 上のフラッシュ
メモリのアクセス幅を反映して変更されています。この例では、ブロック操作ではなくセクタ消去
操作が使用されているため、ブロックサイズに 2K が指定されています。
その他のすべての変更は、フラッシュメモリルーチンのソースファイル
SST_Flash_routines.c に含まれています。
13
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
5.4.2
SST_Flash_routines
定義
最初に行う変更は、Integrator のヘッダファイルではなく Evaluator のヘッダファイルを#include で
読み込むことです。このヘッダファイルには、フラッシュメモリの位置、サイズならびにアクセス
幅を記述したすべてのパラメータが定義されています。
定義ブロックによって、様々なフラッシュメモリコマンドに使用される値が設定されます。これら
のコマンドは、Intel フラッシュメモリに使用されるコマンドセットとまったく異なります。
INVERT_BIT および TOGGLE_BIT は、処理完了をチェックする関連ビットを取得するためのマス
クコマンドです(セクション5.3参照)。
ReadyWait
この関数は、Intel フラッシュメモリの場合とまったく同じタスクを実行します(フラッシュメモリ
の処理が完了するまでステータスビットをポーリングします)。ただし SST デバイスでは、特定
の値が返されるまでではなく、ステータスビットのトグルが停止するまでポーリングされます。
Flash_Erase_Blocks
この関数は、任意のエリアの消去を個々のブロックに分けて消去する FLASH_BLOCK のみに依存す
るため、まったく変更されていません。
Flash_Erase_Block
この関数は Intel フラッシュメモリで使用されるものとまったく異なります。SST デバイスにはブ
ロックのロック機能がないためにこれをチェックする必要がなく、したがってこのルーチンは簡素
化されています。この関数は単に 5 つの指定されたコマンドを書き込んで消去操作をセットアップ
し、この消去をセクタ消去として指定するコマンドを、消去するセクタのベースアドレスに書き込
みます。その後、ReadyWait が呼び出されて PASS が返されます。
Flash_Write_area
SST フラッシュメモリには、バッファリングされる書き込み機能も、ブロックの書き込み機能も
ありません。このため、Intel フラッシュメモリのルーチンのように、1 ブロックに保持されている
エリアを記述するために Flash_Write_Block 関数を記述しても無意味です。したがってこの関
数は、アドレス範囲内の各ワードに対して Flash_Write_Word を呼び出すループとなります。
Flash_Calc_Blocks
この関数は、いくつかの計算を実行する FLASH_BLOCK のみに依存するため、まったく変更されて
いません。
Flash_Write_Word
前述の通り、このコードにはデバイスとバス幅に合わせて主要部分を変更して作成されたバージョ
ンがあります。Evaluator-7T 用のコードでは、16x1 オプションのみがコンパイルされます。
この関数は 32 ビットワードの書き込みを行いますが、SST フラッシュメモリはハーフワードのコマ
ンドおよびデータでプログラムする必要があるため、この書き込みは for ループで制御される 2 つの
独立した操作として実行されます。書き込み処理には 3 サイクルのコマンドシーケンスが発行され、
次に適切なハーフワードデータが、指定されたアドレスに書き込まれます。その後 ReadyWait が
呼び出され、書き込まれたデータがこの関数によって(書き込みが成功したことをチェックする目
的で)読み出されて適切な値が返されます。
Command
フラッシュメモリにコマンドを書き込む関数は Intel フラッシュメモリの場合と非常によく似ていま
すが、SST フラッシュメモリではバイトコマンドではなくハーフワードコマンドが使用されます。
実装されていない関数
Flash_Write_Block と Flash_Unlock_Block は、SST フラッシュメモリにはない機能に関連
しているため(また、API とは関係ないため)削除されています。
14
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
サンプルユーティリティの移植
考えられる改善方法
SST フラッシュメモリのセクタ、ブロック、チップの消去関数を Flash_erase_area 関数で利用
することにより、消去操作で指定できる最小単位を小さくしたまま、大規模な消去操作の速度を上
げることができます。
この場合は、ブロックとチップ全体の消去ルーチンを実装し、これらのルーチンを使用するように
Flash_erase_area 関数を拡張します。Evaluator.h に(セクタとチップのサイズを表現す
る)他のパラメータを追加する必要がありますが、この追加によって flash.h に影響はなく、し
たがって Flashdemo.c にも影響はありません。
15
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.
6
参考資料
ARM Firmware Suite の詳細については、以下の資料を参照して下さい。
•
AFS 1.4 Reference Guide
ARM DUI 0102F
AXD および RealView デバッガの詳細については、以下の資料を参照して下さい。
•
ADS 1.2 AXD / armsd デバッガガイド
ARM DUI 0066D
•
RealView Debugger 1.6 User Guide
ARM DUI 0153B
本アプリケーションノートで取り上げているフラッシュメモリの詳細については、以下の資料を参
照して下さい(それぞれ次の URL から入手できます)。
•
Intel Flash データシート
http://www.intel.com/design/flash/datashts/index.htm
•
SST Flash データシート
http://www.sst.com/products/part_finder.xhtml
RealView デバッガ固有のフラッシュメモリプログラミング機能については、以下の資料を参照し
て下さい(次の URL から入手できます)。
•
ARM アプリケーションノート 110
「RVD によるフラッシュメモリのプログラミング」(ARM DAI 0110A)
http://www.arm.com/arm/Application_Notes
16
Copyright © 2003 ARM Limited. All rights reserved.
Application Note 111
ARM DAI 0111AJ-00
付録 - CFI フラッシュメモリ
7
付録 - CFI フラッシュメモリ
多くのフラッシュメモリデバイスは CFI(汎用フラッシュメモリインタフェース)に準拠していま
す。しかし、CFI に準拠しているからといって、これらのデバイスが共通のコマンドセットとプロ
グラミングアルゴリズムを備えている訳ではありません。
CFI 標準では、フラッシュメモリデバイスからパラメータブロックを入手する汎用的な方法を定義
しています。このパラメータブロックには、フラッシュメモリのサイズやブロック構造などの情報
に加え、製造者および使用されるコマンドセットを表す数値が保持されています。CFI を使用する
ソフトウェアはこれらの数値を解釈し、プログラミングのための関数を適切に選択する必要があり
ます。
このメカニズムに基づいて、ソフトウェアは数多くの異なるフラッシュメモリをサポートすること
ができます。また、使用されるデバイスのタイプを自動的に検出することができます。これは、フ
ラッシュメモリデバイスが変更されるような(着脱可能なフラッシュカードが使用される場合な
ど)アプリケーションにとって非常に有用ですが、フラッシュメモリのタイプが既に分かっており、
変更されることのない環境で動作するアプリケーションではそれほど有用とは言えません。
どのようなフラッシュメモリデバイスでも、固有のコマンドセットに加えて CFI コマンドがサポー
トされていますが、そのデバイスをプログラムする際に CFI コマンドを使用する必要はありません。
17
Application Note 111
ARM DAI 0111AJ-00
Copyright © 2003 ARM Limited. All rights reserved.