FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMAのプログラミング
Previous: DMA操作モードとその設定
Next: DMAポートのマップ

23.3.4. DMAのプログラミング

プログラムされるDMAチャネルは, 通常, 設定を行う前に 「マスクする」べきです. これはハードウェアが予期せずそのチャンネルに対してDRQを有効に した場合, たとえ全てのパラメータが 満たされてない場合や更新されていない場合でも, DMACは それに応答してしまう可能性があるからです.

マスクを行ってから,ホストは転送の方向(メモリからI/O, もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード (シングル, ブロック, デマンド, カスケードなど)を設定し, 最後に アドレスや転送の長さを設定します. 設定される長さはDMACに転送させたい量よりも1少なくなります. アドレスや転送長のLSBとMSBは同じ8ビットI/Oポートに書き込まれます. そのためDMACが最初のバイトをLSBとして, 2番目のバイトをMSBとして 受け取ることを保証するために, 最初に別のポートに書き込みを行なって LSBとMSBの判別を行なうフリップフロップをクリアしておく必要があります.

そして,DMAのページレジスタを更新します. これはDMACの外部にあり I/Oポートの別のセットを通してアクセスされます.

すべての設定ができると, DMAチャネルはマスクを解除することができます. そのDMAチャネルは「準備ができた」とみなされ, そのチャンネルのDRQが 有効になると応答します.

8237のプログラミングの正確な詳細については, ハードウェアデータブックを参照してください. PCシステムにおけるI/Oマップについても参照する必要があるでしょう. このマップにはDMAおよびページレジスタのポートがどこに位置するのかを 書いてあります. 以下に完全なポートのマップテーブルを示します.


FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMAのプログラミング
Previous: DMA操作モードとその設定
Next: DMAポートのマップ