アルファーボードでフラッシュROMにデータを書き込む方法について

このQ&Aのポイント
  • アルファーボード上のCPU-SH4AをC言語で書いたプログラムから動かす設計をしています。
  • アルファーボードには8MBのフラッシュROMが搭載されており、そのフラッシュROM上の「あるセクタ」に対して、外部からデータを書き込むルーチンを作成していますが書き込めません。
  • 具体的な動作は、232Cより取り込んだデータをRAMに蓄えて、フラッシュ1セクタ(32kワード)を丸ごとRAMに展開し、232Cからのデータとマージし、もとのフラッシュ1セクタへ書きもどしてやる。
回答を見る
  • ベストアンサー

アルファーボード AP-AH4A

現在、アルファーボード上のCPU-SH4AをC言語で書いたプログラムから動かす設計をしています。 アルファーボードには8MBのフラッシュROMが搭載されており、そのフラッシュROM上の「あるセクタ」に対して、外部からデータを書き込むルーチンを作成していますが書き込めません。 具体的な動作は、232Cより取り込んだデータをRAMに蓄えて、フラッシュ1セクタ(32kワード)を丸ごとRAMに展開し、232Cからのデータとマージし、もとのフラッシュ1セクタへ書きもどしてやる。 「ROM化支援機能」を使って、実際の消去、書き込みルーチンはRAM上で動作させ、処理終了後、ROM領域のルーチンへ復帰する。 こんな事を行った経験のある方がいらっしゃったら、ヒントでもサンプルでも良いので御教え頂けないでしょうか?

noname#105217
noname#105217

質問者が選んだベストアンサー

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

ALPHA PROJECTさんのボードだからと特に注意すべき点は無いと思います。 記述の内容から察するに特に問題の無い設計だと思いますが、どこまでできていて、どこが問題なのか検討がつかないですね。 FlashRomの書き込みについて29LVのJEDEC準拠品であれば、私のユーザプロフィールから過去解答した内2件が参考になるかもしれません。 それほど解答量もないので興味があったら見て下さい。 他気になるとこを挙げるなら、OSレスだと仮定してSH-4ならば、MMUやキャッシュ関連の勘違い、RAM上駆動への遷移をアセンブラで書いているなら遅延分岐等あるとまずいのでパイプラインのフラッシュとか。 (1)RAM上でのプログラム駆動が問題なくできているか (2)FlashRomへのコマンド発行がきちんとできているか この2点が確認できれば、問題なくできそうですけどね。 実装する内容はファームウェアのアップデートなどと大して変わらないので、CPU,Flashそれぞれの駆動さえきちんとできれば実現できますね。 どこでトラぶっているのか現状を把握できれば、実のあるアドバイスが可能かもしれません。

noname#105217
質問者

お礼

御教えいただき、有難う御座います。過去解答の内容を拝見いたします。 OSレスです。マルチや、スレッドが動くプログラムでもありません。シリーズに上から下へ流れる、テストプログラムです。 (1)RAM上でのプログラム駆動が問題なくできているか ・マップがRAMアドレスになっている点と、RAM上プログラムの頭にブレークポイントを仕掛け、アドレスを確認するとRAMアドレスになっています。 (2)FlashRomへのコマンド発行がきちんとできているか ・セクタアドレス上に発行していると思うのですが、確認する手段がわかりません。プログラムを見て頂けませんでしょうか? ハード上フラッシュROMは16ビットアクセスになっていますので、コマンド書き込み、データ書き込みともにアドレスは偶数へセットしなければなりません。マニュアルにあるコマンド発行時のAAA、555番地指定ではアドレスが偶数にならないので1ビット左シフトして使用しています。 //以降RAMプログラム srcdata = (USHORT*)FLASHWORK; //RAM WORK:0xD010000 wrtadr = (USHORT*)sctadr; //セクタの先頭アドレス //Unlock Bypassを使って連続モードにする adr = (USHORT*)(sctadr); //セクタの先頭アドレス adr1 = (USHORT*)(sctadr | 0x00000AAA); //1STアドレス + 555 adr2 = (USHORT*)(sctadr | 0x00000554); //2NDアドレス + 2AA *adr1 = 0xAA; *adr2 = 0x55; *adr1 = 0x20; //連続書込み中、終了アドレスまで以下を繰り返す for( i=0; i<SECT32KWORD; i++ ) { *adr = 0xA0; //PROGRAM COMMAND save = *srcdata; *wrtadr = save; //データ書き込み //ポーリング if( FlashDataPolling( wrtadr, save ) ) { rtncd = 2; //Fail break; } else{ //ベリファイ if( *wrtadr != save ) { rtncd = 3; //Fail break; } } } /* 連続モード解除・リセット */ *adr = 0x90; *adr = 0xF0; //------------------------------------------------------- アルゴリズムが妥当だと言うことが判っただけでも助かります。 感謝いたします。

その他の回答 (2)

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.3

> この様にフラッシュROMを使うのが始めてでして では軽くよくあるNOR型FlashRomデバイスの特性でも ・SRAMアクセスと同様にリードは可能 ・ビットを0にセットはできるが1を書き込むことは内部構造的に無理 ・ビップイレース、セクタイレースを使用して領域単位で0xFFに戻した後書き込むことが必要 以上、FlashRomを使用する以前に把握しておかなければならない内容です。 次に書き込み完了のポーリングの点ですが、DQ6のトグルビットを利用することをお勧めします。 リードアクセスが発生するたびにトグルするDQ6を利用すれば、 //アンチョコ実装 void busy_wait( ULONG addr ) { volatile USHORT *p, *q; p = q = (volatile USHORT *)addr; while ( *p != *q ); } 書き込み完了前はリードするたびにDQ6がトグルするのでwhile条件式は真 書き込み完了後は書き込んだデータがリードできるので条件式は偽となります。 volatile は必須。 内容は2度デバイスにデータを取得しに行って、同じデータが取得できたらFlashRomの処理が終了したと判断しているだけです。 イレースシーケンス、プログラムシーケンスそれぞれの完了確認に利用可能です。 リトライもタイムアップも動作が確認できた後で実装すれば良いでしょう。 > 標準とはどういったコマンドでしょう? programコマンド(4-cycle)とSector Eraseコマンド(6-cycle)を指しています。 volatileが一切入ってないことに疑問を感じましたが、 アセンブラレベルでレジスタ再利用してないかを調べる必要があったり、手間ばっかり増えちゃいますね 以下、駄文。 余計なアドバイスですが、関数のインターフェイスについて モジュールの機能的な境界を意識した宣言ができると手間も減りますし可読性も良くなります。 例えば、FlashRomデバイスを駆動するドライバ部分ではアドレス値をULONG型で扱います。 内部でオフセット加算やアドレスインクリメントなど直感的に書けるのがメリットです。それに対して、外部のモジュールへ機能を提供するインターフェイスにはポインタ形式を使用すれば、利用上の制限を型として提示することが可能です。 ドライバの機能を利用する側も、渡すデータのバッファを用意して先頭アドレスさえ渡せばドライバが利用できるので、いちいち型変換を明示的に記述する必要がなくなります。 一応、そんなことを意識しながらサンプルはアクセスするアドレスをULONG型で受けています。 インターフェイスについては全体を俯瞰しないと決定することは難しいですけどね。

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.2

一応基板上のFlashRomデバイスの型番を確認しましょう。 ボードのリビジョン違いでデバイスが違ったら動かないだろうなぁって話です。 Web掲載の基板画像から手元ではEN29LVのデータシートを参照していますが、 UnlockBypassコマンドを使った連続書き込みシーケンスとして //ポーリング コメントまでは問題が無さそうです。 FlashDataPollingの内部処理と戻り値の定義が分かりませんので憶測ですが タイムアウトで真、トグル完了で偽でしょうか。それ以外なら予期せぬ挙動を起こすと思います。 加えてwrtadr, srcadr共にインクリメントもされていないようです。 前回提示の2点についてですが、 (1)リンク時に出力されるMAPファイル上で該当ラベルがRAM領域に割付けられている のを確認したら、以降、再度ROMへジャンプするまでの間に呼び出す関数、定数がROM上にあっては いけません。すべて確認する必要があります。 もっともこのことが原因だった場合、この関数を呼び出した途端プログラムは正常動作しなくなるか 例外でリセットが掛かったりすると思います。 RAMに余裕があるのであれば、スタートアップ内ですべてRAM上へ展開し駆動した方が、リンカ上の設定は楽チンですね。 (2)デバイス依存のプログラムコマンドを使用せず、 標準のセクタイレースコマンド、プログラムコマンドで デバイスの駆動を確認することをお勧めします。 > セクタアドレス上に発行していると思うのですが、確認する手段がわかりません。 波形を確認するとなるとロジアナが必要になってしまうので、市販のデバッガを用意するか、簡易なシリアルデバッグコマンドを実装することをお勧めします。 FlashRom駆動に限らず、CPUアドレス空間上の情報を外部から参照できる準備をしておくことはデバッグ上必須でしょう。 なんとなくですが、全部いっぺんに実装してしまって、どこが原因か分からない悪循環に陥ってる気配がします。 2度手間ですが、RAM上でのプログラム駆動、FlashRomデバイスの駆動それぞれ順に動作を確認した方が、結果的に問題解決への近道になると思いますよ。

noname#105217
質問者

お礼

多くの事を御教えいただき、有難う御座います。 この様にフラッシュROMを使うのが始めてでして、暗中模索状態です。 貴重なアドバイス、大変、助かります。 ボード上のフラッシュROMは、仰せのとおり「EN29LV320」です。 「本当だ、インクリメントしていませんね。」 これが原因かなー。せっかく書いた所に上書きしてしまいますよね。 ポーリング確認用の「FlashDataPolling」はプログラムを見て下さい。 DQ7とDQ5を使用し、確認失敗時、リトライしています。 ポーリング関数からエラーで抜けてきます。 (またプログラムを見て頂いてすみません) USHORT FlashDataPolling( USHORT *adr, USHORT data ) { USHORT dummy[3]; USHORT rtncd = 0; UCHAR flg = 0; dummy[0] = *adr; //データの補数か判定する while( (dummy[0] & 0x0080) != (data & 0x0080) ) {//DQ7 //タイミングリミットの判定 if( dummy[0] & 0x0020 ) { // DQ5 flg = 1; break; } else { dummy[1] = *adr; dummy[0] = dummy[1]; } } if( flg ) { //再チェック dummy[2] = *adr; if( (dummy[2] & 0x0080) == (data & 0x0080) ) rtncd = 0; else rtncd = 1; } return rtncd; } (1)リンク時に出力されるMAPファイル上で該当ラベルがRAM領域に割付けられているのを確認したら、以降、再度ROMへジャンプするまでの間に呼び出す関数、定数がROM上にあってはいけません。 すべて確認する必要があります。 この文章の意味は、RAMプログラム(関数)が稼動中はROM上の関数や 定数は使ってはいけないと解釈しました、確認致します。 また、RAMの余裕がありません。(カメラ画像が格納される予定です) (2)デバイス依存のプログラムコマンドを使用せず、標準のセクタイレース コマンド、プログラムコマンドでデバイスの駆動を確認することをお勧め します。 標準とはどういったコマンドでしょう? 御恥ずかしい話、知りません。 使って見たいので御教えいただけないでしょうか? まだ、取り掛かったばかりなのでROM上のプログラムと言っても大した 量が乗っていません、RAM上のプログラムに落ちが無いか確認いたしま す。もう少し、御付き合い下さい。 アドバイスを御願い致します。よろしく御願い致します。

関連するQ&A

  • 組み込みソフト。ROM領域にデータ

    C でデータに const 属性をつけて、初期値を設定して定義すると、初期値は ROMにテーブルが作られますがデータ自体は RAM領域に配置されます。 RAMの節約のため、ROM領域にデータを配置する方法はないのでしょうか。

  • FPGAボードにROMを実装したい

    CQ出版の”FPGAボードで学ぶ論理回路設計”を購入し学習中のほぼ初心者です。よろしくお願いします。 この本に付属のFPGAボードですが、一度データを書き込んだら、あとは電源OFFして再度ONしたあとも、 パソコンからの再書き込みをすることなく動作するようにしたいのですが、 空いている”U2”のところにソケット&ROM(フラッシュ?)を実装してやれば実現可能でしょうか? たぶん実装するのは難しくないと思いますが、その後パソコンから新しいデータを書き込むにはどうすればよいのかなど、 あまり理解できていません。 どなたかご教授いただけますでしょうか。よろしくお願い致します。

  • 代替セクタの情報消去

    下記URLには http://dnes.jp/ss/erase/faq2.htm >Erase@ctionはすべてのハードディスク領域(代替セクタ領域を含む)に書込みをすることでデータを残らず消しています。 と書いてありますが、わざわざ「代替セクタ領域を含む」と書いているということは一般に使われているHDD消去ソフトでは代替セクタの情報は消去されていないということでしょうか? よろしくお願いします。

  • NORTiプログラムのROM化

    OS    :NORTi4 1.18a 開発環境 :HEW4 コンパイラ:SHC C/C++ Compiler ver.9.01 CPUボード :AP-SH4A-0A(アルファプロジェクト社製) 1.ROMにプログラムを焼く 2.パワーオンリセットでバスの設定、ROMとSDRAMを使用可 3.ROM上の初期化関数へジャンプ 4.初期化領域をゼロクリア、初期化領域データのメモリコピー、  ROM上のプログラムをSDRAMへコピー 5.Cのmain()関数を呼び出し(RAMへジャンプ) http://www007.upp.so-net.ne.jp/SY-Firm-Ware/hew/hew.html http://hitachisoft.jp/Products/SH-C/support/faq_21.html 上記のサイト等を参考に行いましたがうまく動きません。 どこで問題が起きているか確認できるようにモトローラSフォーマット ファイルではなくabsファイルをROMに書き込みデバッグしながら行っています。(ROM上でのデバッグはよくないようなのですが、原因がつかめないので。。。どうしようもなくて。。) リセットベクターからいきなりGOするとmainに飛んでくれないんです。 付属のサンプルプログラムで試した時もいきなりGOするとmainにいってくれません。 ステップ実行で1ステップづつ実行していってmainループの中を一通り動かしてからGOすると動くような状況です。 初期化領域のゼロクリアや、データコピー、プログラムのコピーはちゃんと行われています。 何が悪いのかわからず困っています。 宜しくお願いします。

  • SH2を使いたいです

    SH2の7045を使いたいですが、なかなか動きません。コンパイラはYellowSoftのコンバインをつかってます。今回はSH2のROMのかわりにRAMにプログラムを書き込むことをしました。プログラムはとりあえずマニュアルに載せてるサンプルを使いました。

  • HDDの代替領域とは?

    http://homepage2.nifty.com/ADSN3/ryusyutu.html このページなどに書かれてあるのですが、HDDで代替領域というものがあり、バッドセクタなどが出たときにこの部分の容量を使うことで、 容量を補填するためのもので、DOS/V機ではこの部分にアクセスすることは出来ないため完全消去は出来ないと書かれています。 でもこれって矛盾していませんか? 要はバッドセクタが出ることで、この代替領域というのは使用可能になるわけですが、となるとデータが書き込まれている代替領域というのはすでにバッドセクタが出て、読み書き可能になった領域ということになります。読み書き出来ないクラスタはバッドセクタが出ておらず、まだ何のデータも書き込まれていないということになります。 ということは、普通の物理フォーマットはどうか知りませんが、 単純に0000と書かれたファイルをHDD全体に貼り付ければ、自動的にデータの入った代替領域のデータも削除されるのではないのでしょうか?

  • HDDデータを完全に消去する方法を教えてください

    http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%AE%8C%E5%85%A8%E6%B6%88%E5%8E%BB ↑を見ると、アクセスできない[ディスク上の隠しエリアや代替セクタ処理で退避された領域]を含めたディスクの全領域のデータを消去することで[完全消去]が成立するようですが、具体的にはどのような手順を踏めば、[完全消去]できるのでしょうか? フリーのデータ消去ソフトや完全消去を謳う有料のソフトでは、[完全消去]は無理なのでしょうか?

  • iTron上で、ファームウェアダウンロード機能の実装

    組込みの初心者です。 CPU:SH7706 O S:NORTi ファームウェアダウンロード(セルフアップデート?)機能を実現したいと考えています。 考えている手段は 1.シリアル通信にて、バイナリを取得 2.RAMに展開 3.RAMに書込みプログラムをロード 4.すべての割込み、タスク停止 (OS停止?) 5.RAMの書込みプログラムを開始 6.フラッシュROMに書込み 7.再起動 ですが、これは実現可能なのでしょうか? 一般的な手段を知ることができるとうれしいです。

  • SH 内蔵RAMを無効化したい

    こんにちは。 SH2を使用しています。タイトルの通り、単純に内蔵RAMを無効化したいのですが、その方法をご教授頂けたらと思います。 ルーチンで: RAMCR.BIT.RAME = 0; と書くと、その時点でプログラムがハングされてしまいます。 何が足りないのでしょうか?ちなみにモードは内部ROM有効、外部にSRAMが接続されています。

  • グラフィックボードとRAMサイズ

    お世話になります。 DELL T3500を購入しました。4GbyteのRAMです。標準のグラフィックボードのオンボードメモリが512Mbyteあります。WindowsXP 32ビットを選択したところ、マイコンピュータの右クリック プロパティー で表示されます、システムのプロパティーでのRAMのサイズが、約2.5Gbyteほどになりました。 DELL T3400の時にも、RAMサイズは少なく表示されていましたが、ここまで少なくはなく、約3Gbyteでした。こちらのボードは、256Mbyteのオンボードメモリです。 DELLサポートでは、「仕様です。」とのこと。「表示だけで、実RAMサイズは4Gbyteあるので、問題はありません。」とのことでした。 ところが、アプリケーションがOSも含め使えるメモリも、実際この表示サイズしかありません。 「グラフィックボードのRAMが、画面の表示切り替えを実行する際に、本体のRAMを使うために、OSが使えないRAM領域を強制的に確保している」とも聞いたのですが、この件について、解説のあるリンク等あれば、ご紹介いただければ幸いです。 追記: 画像処理のライブラリを使用しています。ライブラリがOSを排他制御できるRAM領域が別に512Mbyteあります。従って、いずれのパソコンでも実際の稼動では、2Gbyte前後のRAMしか、OSとアプリケーションは使うことが出来ていません。ただし、ディスクスワップなどの現象は起きていません。LAN接続、その他常駐ソフトは一切なく、OSのアップデートもSP3までです。自作の画像処理ソフトと、画像の閲覧のためのエクスプローラー、画像圧縮ソフト(自作)などわずかなプログラムが動作している程度で、通常のRAM使用量は500~600Mbyteに押さえ込まれています。 従って、実害は今のところありません。 よろしくお願いいたします。