P/ECE研究室〜S1C33分室



* Tue Jul 23 12:50:00 JST 2002 Naoyuki Sawa




今回も、フラッシュメモリの話題です。

前回の「ソフトウェアIDモード」に引き続き、今回は「CFIクエリーモード」を試してみます。



「ソフトウェアIDモード」と「CFIクエリーモード」は、たいへんよく似ています。

取得できる情報の種類が違っているだけです。




前回試した「ソフトウェアIDモード」では、製造者や製品を識別する番号が取得できました。 しかしこれだけの情報では、得られた番号がどの製造者や製品を指しているのかを知らなければ、役に立ちません。 例えば、前回使ったサンプルプログラムは、SSTの製造者番号とSST39シリーズの製品番号しか判別できません。 他のメーカーのフラッシュメモリだったり、同じSSTでもぜんぜん違うシリーズだったりすると、 製造者番号や製品番号だけがわかっても、何の役にも立たないのです。 これに対して「CFIクエリーモード」では、製造者や製品といった直接的な情報ではなく、フラッシュメモリの仕様に関する詳しい情報が得られます。 実際に得られる情報は、フラッシュメモリの容量・書き換えタイミング・電圧・その他いろいろです。 前回の最後にご紹介しました、サンプルプログラムの実行結果画面を、もう一度ごらんください。
ソースはこちら 実行結果画面を見ると、次のような情報が取得できています。 これだけの情報で未知のフラッシュメモリを扱えるのかどうか、ちょっと僕にはわからないのですが、何の情報もないよりは大きな進歩といえます。
CFIクエリーモードに入る手順は、ソフトウェアIDモードのそれとたいへんよく似ています。 FMEM[0x5555] に 0x00aa を書き込む FMEM[0x2aaa] に 0x0055 を書き込む FMEM[0x5555] に 0x0098 を書き込む ←ここで書き込む値が違うだけ! CFIクエリーモードに入ると、フラッシュメモリの特定のアドレスから、情報を取り出すことができます。 FMEM[0x0010〜0x001a] を読み込む … CFIクエリー識別文字列 FMEM[0x001b〜0x0026] を読み込む … システムインターフェース情報(電圧やタイミングなど) FMEM[0x0027〜0x0034] を読み込む … デバイスジオメトリ情報(フラッシュメモリ容量など) CFIクエリーモードに入っている間は、情報を取り出せるアドレス以外からの読み込みは全て0xffffになる、という点もソフトウェアIDモードと同じです。 だから前回と同じく、必要な情報を取り出したら、すぐにCFIクエリーモードを抜けなければいけません。 CFIクエリーモードを抜ける手順は、ソフトウェアIDモードを抜ける手順とまったく同じです。 FMEM[0x5555] に 0x00aa を書き込む FMEM[0x2aaa] に 0x0055 を書き込む FMEM[0x5555] に 0x00f0 を書き込む
このように、ソフトウェアIDモードとCFIクエリーモードは、たいへんよく似ています。 わざわざ別のモードにする必要があるのか?と思えるほどです。 ・・・本当に別のモードなのでしょうか? 実験してみたところ、ソフトウェアIDモード中にFMEM[0x0010〜0x0034]を読み出すと、CFIクエリーモードと同じ情報が得られるようです。 逆に、CFIクエリーモード中にFMEM[0x0000〜0x0001]を読み出すと、ソフトウェアIDモードと同じ情報が得られるようです。 どうやら、フラッシュメモリの内部では、これら二つのモードは同じ扱いになっているみたいです。 前回、 >(厳密には、他にもちょっとだけ0xffff以外の値を返すアドレスもあるのですが…CFIクエリーモードの説明時に補足します) と書いたのは、実はこのことでした。 ではなぜ、わざわざ二つのモードを定義したのでしょうか? 片方のモードだけで製造者・製品・電圧・サイズなどの情報をすべて取得できるような仕様にしてしまえば、もう片方のモードは不要になったのでは? この謎を解く鍵(というほど大げさなものではありませんが(^^;)は、CFIクエリーモードの「CFI」という略語にありそうです。 そもそも「CFI」とは何なのでしょうか? Webで調べてみたところ、インテル社のサイトにわかりやすい記事がありました。 一部、引用します。
フラッシュメモリ大手4社が、共通フラッシュメモリ・インターフェース(CFI)仕様について合意 (前略) これら4社がCFI仕様に合意したことで、ユーザは、各メーカのフラッシュ製品間の上位及び下位互換性を提供するソフトウェア・ドライバを標準化することができます。 これにより、システムで使用中のフラッシュメモリを他のメーカのものに変更する際にも、手を加えることなく置き換えることが可能となります。 フラッシュメモリ大手4社が共通のインターフェース仕様に合意したことで、フラッシュメモリ市場の拡大がさらに加速されるものと期待されます。 本仕様では、デバイスのアーキテクチャ及びソフトウェアでのデバイスID確認方法を規定しており、 メーカ特有の制御アルゴリズムを有するフラッシュメモリを共通のソフトウェア・インターフェースで使用することが可能となります。 CFIの照会(Query)データ構造には、読み出し/書き込み/消去動作に必要な全ての情報(フラッシュメモリ・アーキテクチャ、電圧、記憶容量など)が含まれます。 今後開発される上記メーカのCFI採用フラッシュメモリ製品は、互換性が維持されるようになります。 したがって、セット機器メーカでのソフトウェアの開発手順が簡単になるとともに、大容量品への置き換えも容易になります。 (後略)
なるほど、CFI仕様とは、フラッシュメモリの製造者や製品に依存しないソフトウェア・ドライバを開発するための、共通仕様の名前みたいです。 この仕様の中で規定されている、フラッシュメモリ情報を取得するための手順が、「CFIの照会(Query)」手順。 「製造者や製品に依存しないソフトウェア・ドライバを開発する」のが目標ですから、製造者や製品を特定できるような情報を返すわけにはいきません。 だから、「CFIの照会(Query)」手順に準拠した「CFIクエリーモード」では、製造者や製品番号が取得できないようになっているのでしょう。 特定のフラッシュメモリ製品への依存をなくすというCFI仕様の目標は立派ですが、やはり直接に製品を識別したいという要求もあったのだと思います。 この要求に応えるため、各フラッシュメモリメーカー独自の製品識別方法が提供されていて、SSTの場合はそれが「ソフトウェアIDモード」なのだと推測します。 あるいは以前から「ソフトウェアIDモード」のような機能が提供されていて、「CFIクエリーモード」の方が後から追加されたのかも知れません。 ※各メーカー独自と推測しましたが、富士通のフラッシュメモリも同じような手順で、製造者番号と製品番号が取得できるようです。  もしかしたら、ソフトウェアIDモードの方も、暗黙の共通仕様に基づいているのかも知れません。
というわけで、最後のほうは推測・推測になってしまいました。 フラッシュメモリの歴史に詳しい方がいらっしゃっいましたら、このあたりの経緯を伺ってみたいところです。 CFI仕様の詳細もいまいち不明です。 Webで「CFI」を検索しても、引っかかるのは先ほどの「大手4社がCFI仕様について合意!」のニュースばっかりなんですよね(^^; CFI仕様って、本当に「CFIの照会(Query)」手順しか定めていないのでしょうか? たったこれだけの情報で、いろんなフラッシュメモリに対応するソフトウェア・ドライバが開発できるものなのでしょうか? 「CFIの照会(Query)」で正しい電圧が取得できると言っても、それではニワトリとタマゴなのでは・・・ 多くの謎を残しつつも、次回の話題は「消去モード」「書き込みモード」へと移って行きます。 (…続きます)

nsawa@piece-me.org