DRAMのようなメモリだけでなく、様々なコントローラのレジスタもアドレス上に存在するI/O操作方法をメモリマップI/Oという。




めんどい処理はシリアル・コントローラに投げるのだが、肝心の渡したいデータはシリアル・コントローラで湧きでるでもなくCPUが渡すし、送信・受信といった制御(このあと具体的に何を制御するか出てくると思う)はCPUから指定できないとどんな通信するんだか選択もできない。

ということでシリアル・コントローラに対して上記を実施するためのなんらかの方法が必要になる。
コントローラの持つレジスタを媒介にしてデータを受け渡すとのこと。
で、レジスタへのアクセス方法は?

レジスタ…ここ

■本の説明の段取り
DRAMのアドレス参照を紹介しシリアル・コントローラのレジスタ参照もその延長上のお話ですということを示しています。

【アドレス】
まずアドレスという概念を理解することが必要。
おなじみと言えばおなじみなのだがデータが置いてあるメモリの位置情報のこと。

【CPUはメモリにアドレス使って参照】
CPUが出力ピンとしてアドレスバスというのもあるのだが、アドレス指定をするためにCPUが持っている出力ピンのこと。
CPUの外部にあるDRAM上のデータを読み書きする際に、どの位置のデータを読みたいのかをDRAMに通知する必要があるり、アドレス・バスによってDRAMにアドレスを通知することで、指定した位置のデータを読み書きすることができる。
アドレスバスが32ビットならば約43億倍とのメモリの位置(メモリ空間)にアクセス可能。

【段取り】
①1つのDRAMチップをCPUでつなげた時について
"CPUはメモリにアドレス使って参照"で挙げたようなDRAM上へのアクセスするベースとなる考え方を説明。

②複数のDRAMチップをCPUにつなげた時について
同じDRAMを複数繋げた場合、それぞれのDRAMでのアドレス配置が同じなので、どのDRAMのアドレスに対してアクセスしているかの情報も付加しないとアドレスを識別できないという課題を出したうえで、CS(チップセレクト),CE(チップエナブル)という信号ピンを保持しており複数DRAMがあっても自分がどのように識別されるかを判別されるようにしている。回路上ではDRAM毎、CS/CEに、比較機(コンパレータ)がくっついていて自分向けのDRAMへのアクセスかを判別してそうであれば、CE/CEに対して1の信号を出すような回路を設ける。
⇒そうであるとすると、DRAMとCPUとマザーボード(比較機)の組み合わせは規定されたものでないといけない気がするなぁ★

アドレス指定とDRAMの対応は以下の通り。
アドレス指定(赤文字部分は上位12ビット) 動作する(CSが有効になる)DRAM
0x00000000~0x000fffff DRAM1
0x00100000~0x001fffff DRAM2
0x00200000~0x002fffff DRAM3
0x00300000~0x003fffff DRAM4

比較機(コンパレータ)…ここ


どのDRAMにアクセスしているかの情報の付加も含めてアドレスとして扱い、とにかくぶつからないようにする工夫をしている。これを「DRAMチップは0x00000000~0x003fffffのアドレスにマッピングされている」という。


③複数のDRAMチップとシリアル・コントローラをCPUにつなげた時について
シリアルコントローラは制御用に1ビットのレジスタを16個持っているとのこと。
4ビットのアドレスバスを持っていれば16個のレジスタを識別可能。

アドレス指定とシリアル・コントローラのレジスタの対応は以下の通り。
0x10000000 レジスタ1
0x10000001 レジスタ2
0x10000002 レジスタ3
0x10000003 レジスタ4
0x10000004 レジスタ5
0x10000005 レジスタ6
0x10000006 レジスタ7
0x10000007 レジスタ8
0x10000008 レジスタ9
0x10000009 レジスタ10
0x1000000a レジスタ11
0x1000000b レジスタ12
0x1000000c レジスタ13
0x1000000d レジスタ14
0x1000000e レジスタ15
0x1000000f レジスタ16


結論としてはDRAMとシリアルコントローラのレジスタも比較機のおかげでCPUから識別可能ということでアクセス可能でそのような仕組みをメモリマップドI/Oという。
まず組込みシステムの目的は、様々な周辺ハードウェアを制御すること。
周辺ハードウェアは、ペリフェラル、周辺インターフェース、周辺I/Oなどと呼ばれる。


インタフェースとは、データ転送の際の信号の電圧や転送速度などの決まりごとのこと、物理的なコネクタの形状も。
インタフェースは、シリアル通信やEthernet規格(LAN)などいろいろあるが、もちろんデータ転送するという目的は同じ。
⇒インタフェースなんて一番転送速度が速いのに統一してしまえ、まどろっこしいからと思ったりする。インターネットでCPUが扱うくらいの転送速度があればいいもんだ。いろんな制約(パッと思い浮かぶだけでも物理、経済、人間など)があっていくつもインタフェースあるんだろうけど、転送速度を割り出す方程式でもあればよいな。★
⇒ちなみにwikipediaだと1つ上の観点のインタフェースを紹介している。3つにわかれるとある。★
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9_(%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93)
⇒おおきくシリアルインターフェースとパラレルインターフェースがあること書いてある。★
http://job-pc.net/archives/30/34/000342.html


また、データ転送の際はデータを流す前に送信側と受信側のデータを扱える準備ができたかの確認をするための手順も必要でこういう手順のことをプロトコルと呼ぶ。
⇒wikipediaだとプロトコルもインタフェースの範疇として扱われていそう★


例えば本章で扱われるシリアル通信のインタフェースの場合。

1stステップでは、シリアル通信速度によるデータ転送速度は9600bps、つまり1秒間に9600回ON/OFFの信号を送っている。
これをCPUで行うとしたら1秒間に9600回という周期で特定の信号線をON/OFFするということでこれはソフトウェアのプログラムによって行う必要がある、が、これを実施するのは面倒で他の作業がしにくくなるとのこと。
⇒できなくはないんだなぁ。★


これらのインタフェースに関わる面倒な部分(信号の制御)をCPU以外で肩代わりしてくれるとこないかなというとこで、ICチップを用意し1秒間に9600回ON/OFFさせるものとしてハードで用意。
この面倒なことを実施してくれるICチップのことを一般にコントローラと呼ぶ。
⇒ソフトで実現するときとハードで実現するときはどのような差があるのを知るために、ソフトで実現するときの面倒加減をプログラムで見てみたいなぁ★
⇒インタフェースに関わる面倒な部分(信号の制御)として転送速度を扱っているが、電圧とかのインタフェースも同じく扱ってくれるの?★
⇒プロトコルは極めてソフトウェアで実現しそうなことだけど、コントローラ任せなの?★


シリアル通信の制御を実施するのは「シリアル・コントローラ」。
LANならば「LANコントローラ」。


インタフェースに関わる面倒な部分(信号の制御)はコントローラが行うため、CPUからはコントローラに対してデータの送信要求を出したり、コントローラからデータを受信したりするだけで済むようになる。
⇒レジスタ経由でおこなうとか書いてある。
フラッシュROMへの書き込みもできてUSBシリアル・アダプタは問題なしだったはずなのですが早速不具合発見です。

書き込みはPC起動後1度だけ可能で2度目以降は不可能。
再起動しないと書き込めないようです。
本にもこの旨記載されています。
この開発環境でも進められなくはないのですがシリアルコネクタのあるPCを買うべきか検討しないといけません。

[成功時]
$ make write
/bin/h8write -3069 -f20 kzload.mot Com4
H8/3069F is ready! 2002/5/20 Yukio Mituiwa.
writing
ignore record
ignore record
...............................................
EEPROM Writing is successed.




[失敗時]
$ make write
/bin/h8write -3069 -f20 kzload.mot Com4

これ以上メッセージが出なくなる。書き込み失敗。