自作エミュレータに外部とのアクセス手段を足そうと思い、ARM Versatileに載っており、かつLinuxのドライバが存在するハードを調べてみたら、
NORフラッシュなら簡単かなーと思って調べ始めたら、ちょっと甘かったです。
Versatileのメモリコントローラの仕様書には16bitフラッシュの型番が載っていて「対応してる」と書いてあります。つまり16bitフラッシュをエミュレーションすれば良いはずです。
NORフラッシュにはコマンドという概念があって、特殊なアドレス+特殊なデータをwriteすると、コマンドとして解釈されます。コマンドによって、容量とか8bitなのか16bitなのか調べたり、ブロックをEraseしたりできるわけです。
試しにLinuxのドライバを動かして、CFIというJEDECの規格に載っているQueryコマンド(CPUからFlashへ、容量やらビット幅を尋ねるコマンド)を送るとき、どんな動きをしているか見ると、
このように一見32bitに見えて、コマンドのデータが全然違う値なので、最初はさっぱり意味がわかりませんでした。
もしデータ幅と同じ32bitフラッシュが接続されているのであれば、下記の図のように接続されていて、使用するコマンドは32bitフラッシュ用のデータになるはずです。
しかし仕様書にはどう見ても16bitフラッシュの品番が書いてありますし、実際に発行しているコマンドも16bitフラッシュ用のデータです。
ハードに詳しい方はお気づきかもしれませんが、おそらくCPUとNORフラッシュの間にいるメモリコントローラが一枚噛んでいて、下記の図のように16bitフラッシュに2発同時アクセスして、32bitデータを扱えるようにしていると思われます。
アドレス線は共通(ただし下位1bitは捨てる)で、データはコントローラ側で分割(Write時)、結合(Read時)される仕様です。
CPUから見ると1度に32bitのデータを扱えるように見えますが、あくまでも接続されているのは16bitフラッシュですので、アドレスとデータは16bitフラッシュ用のものにしなければなりません。1つ目のフラッシュと2つ目のフラッシュ双方にデータを送る必要があるため、上位bitと下位bitの両方にデータを入れていた訳です。
とまあ、こんな具合でreadは簡単(?)に出来ましたが、writeを調べたらerase, writeのパターンが多くて、ちょいと大変そうです…。
Flash ROMのハードウェア仕様上のアドレスは、ワードアドレス(つまり2バイトでアドレスが1増える)ですが、仕様書のコマンドの説明はバイトオフセットで書いてありました。少なくともIntelとMicronの仕様書は。
従ってエミュレーションする際はバイトアドレスを使った方が、仕様書と数字が一致して読みやすいです。ハードウェアのアドレス線がどうなっていようが、ほとんど気にする必要はありません…。
< | 2015 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.18.
using GD 2.3.3(png support.)