シリアルフラッシュＲＯＭ対応のライタープログラムを追加する場合の説明（ブートモード１／３用)
Ｒｅｖ１．３０ ２０１２／１０／４
ＤＥＦバージョン１１．００Ａより
ＤＥＦバージョン１２．１０Ａ変更
ＤＥＦバージョン１２．２０Ａ変更【対象ＣＰＵ】
１．ＲＯＭレス品種が対象になります。
（ＳＨ７２６２／４／６／７）【機能】
１．サンプルで「ＡＴ２５ＤＦ０４１Ａ」の対応ソフトを用意してあります。
（ルネサスＣのみ対応）【ＳＨ７２６２／４】
２．サンプルで「ＳＳＴ２５ＶＦ０１６Ｂ／Ｍ２Ｐ１６」の対応ソフトを用意してあります。
（ルネサスＣのみ対応）【ＳＨ７２６６／７】
３．ＳＨ７２６２／４／６／７【ＲＳＰＩ０】に接続されたシリアルフラッシュＲＯＭが対象になります。
４．ＨｅｗにてＦｌａｓｈＲＯＭの品種追加が出来るよう対応する。
５．シリアルＦｌａｓｈＲＯＭ仕様にあわせたセクターイレーズとバイト書き込みをプログラミングするだけで追加が可能になります。

【品種追加前の準備】

１．ＡＨ７０００コントロールソフトのインストールＤＩＲにあるワークスペースを開きます。
（追加例）
[1-1]
＜デフォルトディレクトリ＞"c:¥Program Files¥Aone¥DEF¥rom-custom¥SH7264"＜ワークスペース＞"SH7264.hws"

２．プロジェクト名「＿ＮｅｗＳＦ＿Ｗｒｉｔｅｒ」をアクティブプロジェクトに設定します。
[1-2]＜＿ＮｅｗＳＦ＿Ｗｒｉｔｅｒ＞をマウスクリックし、右クリックのポップアップメニューから選択します。

３．
「プロジェクトタイプの作成」をします。
[1-3]
Ｈｅｗメニュー
＜プロジェクト＞－＜プロジェクトタイプの作成＞をクリックします。

４．新規プロジェクトタイプで使用する名前を指定します。
[1-4]

名前は、重複しないようにして下さい。
例として「ＮｅｗＳＦ＿Ｗｒｉｔｅｒ＿７２６４」としておきます。

＜－「次へ」をクリックします。

[1-5]＜－完了をクリックします。

この操作で「品種追加前の準備」は完了です。

【新規シリアルＦｌａｓｈＲＯＭ用ライタの追加】
１．新規シリアルＦｌａｓｈＲＯＭ用ライタを追加するため、「プロジェクトの挿入」をします。
[2-1]

Ｈｅｗメニュー
＜プロジェクト＞－＜プロジェクトの挿入＞をクリックします。

[2-2]「新規プロジェクト」を指定して、「ＯＫ」をクリックします。

[2-3]１）プロジェクトタイプに作成した「ＮｅｗＳＦ＿Ｗｒｉｔｅｒ＿７２６４」を指定します。
２）プロジェクト名を指定します。FlashROM 名を追加した「ＡＴ２５ＤＦ０４１Ａ＿Ｗｒｉｔｅｒ」にします。

＜－「ＯＫ」をクリックします。

２．新規シリアルＦｌａｓｈＲＯＭ用ライタの定義および制御プログラムを作成します。
[2-4]

新規シリアルＦｌａｓｈＲＯＭ用の定義および制御プ
ログラムファイル「FromTemp.c」を開きます。

１）「FromTemp.c」に新規シリアルＦｌａｓｈＲＯＭのセクター情報を定義します。
[2-5｣「SECTOR_MAX」に使用するシリアルＦｌａ
ｓｈＲＯＭのセクター（ブロック）数を定義します。

変数宣言の順番は変更しないで下さい。データ管理上、最初にセクター（ブロック）数が入るルールになっています。

変数「SectorTopAdr[]」に、定義したセクター（ブロック）数ごとの先頭アドレスを定義します。

最後にフラッシュＲＯＭの最終アドレス＋１したアドレスを定義します。

２）「FromTemp.c」に新規シリアルＦｌａｓｈＲＯＭの「オープン」「クローズ」関数を作成します。
[2-6]

関数「FromOpen()」は、ターゲット RAM に、このプログラムがダウンロードされた時、最初に 1 回コール(Call)されます。
このプログラム例は、プロテクト解除（アンロック）しています。必要無い場合は、「return(Ok);」のみ記述します。
[IoInitRSPI0()¥sh7264_rspi.c] RSPI0 の初期化関数[sFlashUnProtect()¥sfflashrom.c] アンプロテクト関数

関数「FromClose()」は、フラッシュ ROM に全データ書き込み終了後の最後に 1 回コール(Call)されます。
このプログラム例は、プロテクト（ロック）しています。
必要無い場合は、「return(Ok);」のみ記述します。
[sFlashProrect()¥sflashrom.c]プロテクト関数

３）「FromTemp.c」に新規シリアルＦｌａｓｈＲＯＭの「セクターイレーズ」関数を作成します。
[2-7]

関数「FromSectorEraseProc(char *cmd)」には、セクターごとのイレーズプログラムを記述します。デバッガとの通信完了後、サムチェック正常の場合、この関数がコール(Call)されます。
（サム異常時はコールされません）＜引数の仕様＞
char cmd[];
cmd[0] == '%' // ヘッダー
cmd[1] == 0// 予備
cmd[2] == 4// コマンドサイズ cmd[3]->[Sum]までのサイズ
cmd[3] == 'D' // コマンド
cmd[4] == 0xn // 消去するセクター番号の H 数 最大 HIGH(1024)
cmd[5] == 0xn // 消去するセクター番号の L 数 最大 LOW(1024)
cmd[6] == 0xn // サム cmd[3]->[5]の加算値＜備考＞
全イレーズ処理にしたい場合は、セクター番号ゼロ「０」のときのみ実施
して、他ののセクターの場合は、「return(Ok);」にすれば代用できます。
[sFlashSectorErase()¥sflashrom.c]セクターイレーズ関数

４）「FromTemp.c」に新規シリアルＦｌａｓｈＲＯＭの「バイト（書き込み）」関数を作成します。
[2-8]

関数「FromWriteProc(char *cmd)」には、128 バイトごとの書き込みプログラムを記述します。デバッガから書き込みデータ 128 バイト)固定でデータを受信し完了後、サムチェック正常の場合、この関数がコール(Call)されます。
（サム異常時はコールされません）＜引数の仕様＞
char cmd[];
cmd[0] == '%' // ヘッダー
cmd[1] == 0// 予備
cmd[2] == 134 // コマンドサイズ cmd[3]->[Sum]までのサイズ
cmd[3] == 'W' // コマンド
cmd[4] == 0xn // 書き込みアドレス(HH)
cmd[5] == 0xn // 書き込みアドレス(MH)
cmd[6] == 0xn // 書き込みアドレス(ML)
cmd[7] == 0xn // 書き込みアドレス(LL)
cmd[8] == 0xn // 書き込みデータ[0]""cmd[135]== 0xn // 書き込みデータ[127] 固定 余分エリアは(0xff)
cmd[136]== 0xn // サム cmd[3]->[135]の加算値＜備考＞
このプログラム例は、128 バイトの書き込み終了後、ベリファイテストも実施しています。
[sFlashByteProgram()¥sflashrom.c]バイト書き込み関数[sFlashByteRead()¥sflashrom.c]バイト読み出し関数

５）「FromTemp.c」に新規シリアルＦｌａｓｈＲＯＭの「フルステータスチェック」関数を作成します。
[2-9]関数「FullStatusCheck(Ushort *adr,char cmd」には、フラッシュ ROM特有のステータスチェックプログラムを記述します。この関数は、上記の作成関数からのみコール(Call)されます。よって、内部処理は自由に記述して下さい。
＜引数の仕様＞
Ushort adr;// 処理しているフラッシュ ROM のアドレス
char
cmd; // 処理しているコマンド// ''O' = オープンコマンド// ''C' = クローズコマンド// ''D' = イレーズコマンド// ''W' = 書き込みコマンド// ''R' = ベリファイコマンド＜備考＞
関数「FromErrorSet(..)」は、関数デバッグ時のエラー情報を見るための一例としての関数です。仕様に関してはルールがありませんので、自由に作成して下さい。
[sFlashReadStatus()¥sflashrom.c]ステータスリード関数

３．新規シリアルＦｌａｓｈＲＯＭに依存した定義およびコマンドプログラムを作成します。
[3-1]

新規シリアルＦｌａｓｈＲＯＭに依存した定義およびコマンドプログラムファイル「sflashrom.c」を開きます。

１）「sflashrom.c」に新規シリアルＦｌａｓｈＲＯＭに依存したコマンドを定義します。
[3-2]「SFMAX_SIZE」に使用するシリアルＦｌａｓｈＲＯＭの最大サイズ（バイト）を定義します。

シリアルＦｌａｓｈＲＯＭの各コマンドを定義します。
機能
定義名
コマンド
SF_READ_ARRAY
0x0B
データの読み出し
SF_SECTOR_ERASE
0xD8
セクターイレーズ
SF_CHIP_ERASE
0xC7
チップイレーズ
SF_BYTE_PROGRAM
0x02
データの書き込み（バイト）
SF_WRITE_ENABLE
SF_WRITE_DISABLE
UNPROTECT_WR_STATUS
PROTECT_WR_STATUS
SF_READ_STATUS
SF_WRITE_STATUS

0x06
0x04
0x00
0x3C
0x05
0x01

書き込み／イレーズ／ライトステータス許可
書き込み／イレーズ／ライトステータス禁止
ライトプロテククの解除
ライトプロテクトの設定
ステータスレジスタの読み出し
ステータスレジスタの書き込み

この例は、ATMEL 社の「AT25DF041A」のコマンドです。コマンド仕様は各デバイスメーカ
ーによって異なります。使用するデバイスのデータシートを参照して下さい。

２）「sflashrom.c」に新規シリアルＦｌａｓｈＲＯＭに依存したコマンドプログラムを作成します。
下記の参考プログラム例は、ATMEL 社の「AT25DF041A」用コマンドプログラムです。コマンドパラメータ仕様は各デバイスメーカーによって異なります。使用するデバイスのデータシートを参照してから作成して下さい。
[3-3]
関数「sFlashUnProtext(void)」は、デバイスのライトプロテクトを解除します。

関数「sFlashProtext(void)」は、デバイスをライトプロテクトします。

[3-4]
関数「sFlashChipErase(void)」は、デバイス全体をイレーズします。
[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

関数「sFlashSectorErase(void)」は、セクター単位でイレーズします。
＜引数の仕様＞
Ulong adr；// イレーズするデバイスセクター内のアドレス[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

[3-5]
関数「sFlashByteProgram(....)」は、バイト書き込みします。
＜引数の仕様＞
Ulong adr；// 書き込みするデバイス内の先頭アドレス
Uchar *wdt; // 書き込みデータの先頭アドレス
Ulong wsize; // 書き込みデータのサイズ（バイト）[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

関数「sFlashByteRead(....)」は、バイト読み出しします。
＜引数の仕様＞
Ulong adr；// 読み出しするデバイス内の先頭アドレス
Uchar *rdt; // 読み出したデータを格納する先頭アドレス
Ulong rsize; // 読み出しデータのサイズ（バイト）[IoCmdExeRead()¥sh7264_rspi.c] RSPI0 コマンド（リードデータありタイプ）送信関数です。

[3-6]
関数「sFlashWriteStatus(...)」は、シリアルＦｌａｓｈＲＯＭのステータスレジスタに書き込む内部関数です。
＜引数の仕様＞
Uchar status; // ステータスレジスタに書き込むデータ[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

関数「sFlashWriteEnable(void)」は、シリアルＦｌａｓｈＲＯＭの書き込み／イレーズ／ステータスレジスタ書き込みを許可する内部関数です。
[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

関数「sFlashWriteDisable(void)」は、シリアルＦｌａｓｈＲＯＭの書き込み／イレーズ／ステータスレジスタ書き込みを禁止する内部関数です。
[IoCmdExe()¥sh7264_rspi.c] RSPI0 コマンド（リードデータなしタイプ）送信関数です。

[3-7]
関数「sFlashBusyWait(void)」は、コマンド処理終了を待つ内部関数です。

関数「sFlashReadStatus(...)」は、シリアルＦｌａｓｈＲＯＭのステータスレジスタを読み出す内部関数です。
[IoCmdExeRead()¥sh7264_rspi.c] RSPI0 コマンド（リードデータありタイプ）送信関数です。

以上で、関数の作成は終了です。

４．新規シリアルＦｌａｓｈＲＯＭライタ用プログラムをビルドします。
[4-1]

Ｈｅｗメニュー＜ビルド＞－＜すべてをビルド＞で、「0 Errors 0 Warnings」になったことを確認します。

１）新規シリアルＦｌａｓｈＲＯＭライタ用プログラム作成上のルール[4-2]＜ルール１＞
セクター情報定義のセクション名「SectTbl」の、ロケートは必ず、実行プログラムアドレス(TopAdr)の「+0x800」に割付て下さい。
＜ルール２＞
セクション「SectTbl」のデータ配置にルールがあります。
constlong SectorMax;// セクター数
constlong SectorTopAdr[SectorMax+1];// セクター毎 Top アドレス
この順番に配置されることが条件になります。
＜ルール３＞
最大セクター(ブロック)数は、「1024」です。
＜ルール４＞
スタックまで含めたオブジェクトサイズは「0x4000」16KB までです。
＜ルール５＞#define OK
0#define NG
0xee
数値変更しないで下さい。

// 変更不可// 変更不可＜ルール６＞下記 4 関数は、名称・引数・帰り値等の仕様変更は不可です。
1)int
FromOpen(void);
2)int
FromClose(void);
3)int
FromSectorEraseProc(char *cmd);
4)int
FromWriteProc(char *cmd);
以上のルールは厳守して下さい。

【作成したシリアルＦｌａｓｈＲＯＭライタプログラムのデバッグ方法】
デバッグ中は、「ブートモ－ド０」にするか、もしくは「ブートモ－ド０」に出来ない回路構成（アドレス・データバスを汎用Ｉ／Ｏに使用）の場合は、プログラムの開始アドレスを「0xFFF8_2000」にロケートしなおし DEF 設定も「0xFFF8_2000」に設定してデバッグして下さい。デバッグ終了後は「0xFFF8_000」に戻して下さい。
理由：「ブートモード１・３」のままですとリセット解除後、ブートプログラムが起動され内蔵高速ＲＡＭの先頭から「0x2000」エリアにローダプログラムがロードされてしまいます。
１．Ｈｅｗにてデバッグの準備をします。
[5-1]１）モジュール「main.c」の「#define FROM_TEST」のコメントを外します。

２）Ｈｅｗメニューの＜ビルド＞－＜ビルド＞を指示します。

３）「0 Errors 0 Warning」を確認します。

４）デバッガ使用の通信ポートと、このＦｌａｓｈＲＯＭプログラム使用の通信ポートと兼用させているため、通常のデバッグ操作でのデバッグは出来ません。
よって、上記「#define FROM_TEST」のコメントを外すことにより、通信ポートを使用せず、内部メモリ操作のみで各関数のテストできるようにテスト用プログラ
ムを用意しております。

２．デバッガ用コントロールソフト「ＤＥＦ」にてデバッグする為の設定をします。
[5-2]＜ＣＰＵ設定＞作成した「シリアル FlashROM ライタ」プログラムをターゲット側の内部ＲＡＭに転送して実行させますので、「ＲＡＭ」にチェック後、先頭アドレスとサイズを指定します。
ＳＨ７２６４の場合
開始 0xfff80000
サイズ 0x10000になります。

作成した「シリアル FlashROM ライタ」プログラムのデバッグにＢＳＣ設定が必要な場合は、スクリプトファイルを指定します。
ＳＨ７２６４の場合
インストールディレクトリ
"c:¥Program Files¥Aone¥DEF¥rom-custom¥SH7264"に、例として「SH7264-BSC-HSB.log」が用意してありますので、目的ハードにカスタマイズして下さい。

＜－「設定」をクリックします。

[5-2-1]

ＤＥＦ画面、左下隅の「Start」をクリックします。

３．作成したシリアルＦｌａｓｈＲＯＭライタソフトのデバッグを開始する準備をする。
[5-3]
ＤＥＦメニュー
＜ファイル＞－＜ダウンロード＞
で、ダウンロードします。

インストールディレクトリ
"c:¥Program Files¥Aone¥DEF¥rom-custom¥SH7264"
下の"$(ProjectName)¥Debug"に作成したアブソリュートファイルがありますので指定します。
例）$(ProjectName):AT25DF041A_Writer「AT25DF041A_Writer.abs」[5-4]＜ダウンロードが成功した初期画面＞

PC レジスタ値が「PowerON_Reset_PC()」関数の先頭アドレスになっていることが確認出来ます。

SP レジスタ値が内蔵 RAM のボトムアドレスになっていることが確認できます。

VBR レジスタ値が内蔵 RAM のトップアドレスになっていることが確認できます。

＜操作＞「CStep/CTrac」ショート PB をクリックして、関数「TestMain()」まで進めます。

[5-5]

関数「TestMain()」に進んでいるのを確認します。

＜操作１＞
このテストプログラムが動作中にエラー発生か終了したことを確認するため、このラインにブレークポイントを張っておきます。
[#74:main.c]＜操作２＞「CStep/CTrac」ショート PB をクリックして、関数「CmdWaitT()」まで進めます。

[5-6]

関数「CmdWaitT()」に進んでいるのを確認します。

＜操作＞「Watch」ショート PB をクリックします。

[5-6-1]
デバッグを進めるため、Watch 画面に変数を登録します。
1) CmdStep2) Sector
3) WriteAdr
4)FromError

関数「CmdWaitT」のコントロールステップ変数
セクターイレーズの進行カウンター
FROM 書き込み中アドレス
エラー発生時情報

以上、４変数を登録します。

４．セクターイレーズ関数「FromSectorEraseProc(char *cmd)」をデバッグします。
[5-7]

＜操作１＞
プログラム進行を確認するため、「周期サンプル」をチェックします。

＜操作２＞
変数「CmdStep」を数値「1」にします。
[Enter][1][Enter]で変更できます。
＜備考＞
関数「CmdWaitT」のソースを見てもらえれば理解できるかと思いますが、「CmdStep」を「1」にしますと、メモリー上でコマンドデータを作成して関数[5-7-1]「FromSectorEraseProc(char *cmd)」に渡す仕組みになっています。
全て正常終了しますと、登録された全セクターをイレーズした後、変数「CmdStep」が数値「0」になります。

＜操作３＞「Go」ショート PB をクリックします。

[5-8]
セクターイレーズが正常に動作していますと、変数「Sector」が、ゼロ「0」から登録セクター数までインクリメントしていきます。
最終セクターまで正常終了しますと、変数「CmdStep」がゼロ「0」になります。
異常終了しますと、[3-5]で設定したブレークポイントで停止します。

５．書き込み関数「FromWriteProc(char *cmd)」をデバッグします。
[5-10]＜操作１＞
プログラム進行を確認するため、「周期サンプル」をチェックします。

＜操作２＞
変数「CmdStep」を数値「2」にします。
[Enter][2][Enter]で変更できます。

[5-7-1]＜備考＞
関数「CmdWaitT」のソースを見てもらえれば理解できるかと思いますが、「CmdStep」を「2」にしますと、メモリー上でコマンドデータを作成して関数「FromWriteProc(char *cmd)」に渡す仕組みになっています。
全て正常終了しますと、全エリア書き込み後、変数「CmdStep」が数値「0」になります。

＜操作３＞「Go」ショート PB をクリックします。

[5-11]
書き込みが正常に動作していますと、変数「WriteAdr」が、ゼロ「0」から最終アドレスまで「0x80」ごとに加算していきます。
最終アドレスまで正常終了しますと、変数「CmdStep」がゼロ「0」になります。
異常終了しますと、[3-5]で設定したブレークポイン
トで停止します。

５．その他関数「FromOpen(void)/FromClose(void)」が必要な場合は、必要に応じてデバッグして下さい。

１）関数「FromOpen(void)」

テスト用メイン関数「TestMain()」の 60 行でコール(Call)しています。
２）関数「FromClose(void)」

テスト用関数「CmdWaitT(char *cmd)」で、コントロールステップ変数「CmdStep」を「3」以上の数値をセットしますとコール(Call)されます。
６．異常終了時のエラー情報-「long FromError[4]」の参照[5-12]＜評価・変更窓>
エラー発生にて異常終了した場合は、変数「FromError[4]」に情報が残りますので、プログラム修正の参考にして下さい。なお、この変数の仕様および名称等に規約はありませんので、自由に変更しても構いません。

【作成したシリアルＦｌａｓｈＲＯＭライタプログラムを正規リリース登録する】
１．シリアルＦｌａｓｈＲＯＭライタプログラムのデバッグが終了しましたら、Ｈｅｗにて再コンパイルします。
[６-1]１）モジュール「main.c」の「// #define FROM_TEST」をコメントします。

２）Ｈｅｗメニューの＜ビルド＞－＜ビルド＞を指示します。

３）「0 Errors 0 Warning」を確認します。

２．御願い
本説の方法で、フラッシュＲＯＭライタプログラムを追加した場合、必ず、プロジェクトのバックアップすることを御願いします。
今回は「c:\Program Files\Aone\DEF\rom_custom」で作成する例で記述しましたが「\rom_custom」をホルダごと別のディレクトリに貼り付けても作成できます。
つまり、ユーザーアプリのプロジェクトごとに管理するのも一案かもしれません。追加作成したプロジェクトは、ユーザー様の責任のもとで管理願います。

以上で、シリアルＦｌａｓｈＲＯＭライタプログラムの追加作業が終了です。