MICROSEQ(9) FreeBSD カーネル開発者マニュアル MICROSEQ(9)
名称
microseq − ppbus マイクロシーケンサ開発者ガイド |
書式
#include <sys/types.h> |
解説
ppbus の解説およびマイクロシーケンサについての一般的な情報は ppbus(4) を 参照してください。 この文書の目的は以下を得るために、開発者がマイクロシーケンサ機構を使用す るように支援することです。 |
1. 統一的なプログラミングモデル
2. 効率的なコード マイクロシーケンスを使用する前に、 ppc(4) マイクロシーケンサの実装および vpo(4) の中のこれをどのように使用するかの例を見ることが、奨励されていま す。 PPBUS レジスタモデル |
背景 |
ppbus のために選択されたパラレルポートモデルは PC パラレルポートモデルで す。従って、後で解説されるあらゆるレジスタは、PC パラレルポートの対になる ものと同じセマンティクスを持ちます。より多くの ISA/ECP プログラミングにつ いての情報については、 "Extended Capabilities Port Protocol and ISA interface Standard" として参照される Microsoft 標準を入手してください。後 述するレジスタは標準のパラレルポートレジスタです。 マスクマクロは、パラレルポートレジスタの個々の有効なビットのために標準 ppbus インクルードファイルの中で定義されています。 |
データレジスタ |
コンパチブルモードまたはニブルモードでは、このレジスタへの書き込みはパラ レルポートのデータ線へ出力されます。その他のモードでは、出力段は制御レジ スタ内の方向ビット (PDC) の設定によって、トライステート (3 状態) になるこ とができます。このレジスタへの読み込みはデータ線上の値を返します。 |
デバイス状態レジスタ |
この読取り専用レジスタはパラレルポートインタフェース上の入力を反映しま す。 ビット 名前 解説 その他は予約済みで、読込み時の結果は未定義です。 |
デバイス制御レジスタ |
このレジスタは直接的に幾つかの機能の有効化はもちろん、幾つかの出力信号を 制御します。 ビット 名前 解説 |
マイクロインストラクション
解説 |
マイクロインストラクションはパラレルポートのアクセス、プログラムの繰り返 し、サブマイクロシーケンスまたは C の呼び出しです。パラレルポートは ppbus(4) で解説されている論理モデルとみなされなければなりません。 利用可能なマイクロシーケンスは以下のとおりです。 #define MS_OP_GET 0 /* get <ptr>, <len> */ |
#define MS_OP_PUT 1 |
/* put <ptr>, <len> |
*/ |
|||||||
#define MS_OP_RFETCH |
2 |
/* rfetch <reg>, <mask>, <ptr> |
*/ |
||||||
#define MS_OP_RSET |
3 |
/* rset <reg>, <mask>, <mask> |
*/ |
||||||
#define MS_OP_RASSERT |
4 |
/* rassert <reg>, <mask> |
*/ |
||||||
#define MS_OP_DELAY 5 |
/* delay <val> |
*/ |
|||||||
#define MS_OP_SET 6 |
/* set <val> |
*/ |
|||||||
#define MS_OP_DBRA 7 |
/* dbra <offset> |
*/ |
|||||||
#define MS_OP_BRSET 8 |
/* brset <mask>, <offset> |
*/ |
|||||||
#define MS_OP_BRCLEAR 9 |
/* brclear <mask>, <offset> |
*/ |
|||||||
#define MS_OP_RET 10 |
/* ret <retcode> |
*/ |
|||||||
#define MS_OP_C_CALL |
11 |
/* c_call <function>, <parameter> |
*/ |
||||||
#define MS_OP_PTR |
12 |
/* ptr <pointer> |
*/ |
||||||
#define MS_OP_ADELAY |
13 |
/* adelay <val> |
*/ |
||||||
#define MS_OP_BRSTAT |
14 |
/* brstat <mask>, <mask>, <offset> |
*/ |
||||||
#define MS_OP_SUBRET |
15 |
/* subret <code> |
*/ |
||||||
#define MS_OP_CALL |
16 |
/* call <microsequence> |
*/ |
||||||
#define MS_OP_RASSERT_P |
17 |
/* rassert_p <iter>, <reg> |
*/ |
||||||
#define MS_OP_RFETCH_P |
18 |
/* rfetch_p <iter>, <reg>, <mask> |
*/ |
||||||
#define MS_OP_TRIG |
19 |
/* trigger <reg>, <len>, <array> |
*/ |
実行コンテキスト |
マイクロインストラクションの 実行コンテキストは以下のとおりです。 |
• メインのマイクロシーケンスの中またはサブコールの中の、実行するための次のマイクロインストラクションを指し示す プログラムカウンタ
• 送る/受け取るための次の文字を指し示す ptr の現在の値 • 内部の 分岐レジスタの現在の値 このデータは全てではない幾つかのマイクロインストラクションによって変更さ れます。 MS_OP_GET および MS_OP_PUT MS_OP_RFETCH - レジスタ取得 パラメータ: 1. レジスタ 2. 文字マスク 3. バッファへのポインタ 定義済みマクロ: MS_RFETCH(reg,mask,ptr) MS_OP_RSET - レジスタ設定 パラメータ: 1. レジスタ 2. アサートされるべきビットのマスク 3. クリアされるべきビットのマスク 定義済みマクロ: MS_RSET(reg,assert,clear) MS_OP_RASSERT - レジスタアサート パラメータ: 1. レジスタ 2. アサートされるべきバイト 定義済みマクロ: MS_RASSERT(reg,byte) MS_OP_DELAY - マイクロ秒の遅延 パラメータ: 1. マイクロ秒単位の遅延時間 定義済みマクロ: MS_DELAY(delay) MS_OP_SET - 内部分岐レジスタの設定 パラメータ: 1. 整数値 定義済みマクロ: MS_SET(accum) MS_OP_DBRA - 分岐の実行 パラメータ: 1. 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オ フセットは次に実行されるマイクロインストラクションのインデック スに追加されます。 定義済みマクロ: MS_DBRA(offset) MS_OP_BRSET - セット時に分岐 パラメータ: 1. 状態レジスタのビット 2. 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オ フセットは次に実行されるマイクロインストラクションのインデック スに追加されます。 定義済みマクロ: MS_BRSET(mask,offset) MS_OP_BRCLEAR - クリア時に分岐 パラメータ: 1. 状態レジスタのビット 2. 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オ フセットは次に実行されるマイクロインストラクションのインデック スに追加されます。 定義済みマクロ: MS_BRCLEAR(mask,offset) MS_OP_RET - 戻る パラメータ: 1. 整数のリターンコード 定義済みマクロ: MS_RET(code) MS_OP_C_CALL - C 関数の呼び出し パラメータ: 1. 呼び出すべき C 関数 2. 関数呼び出しのために渡されるパラメータ C 関数は int(*)(void *p, char *ptr) と宣言されることになっています。 ptr パラメータは現在走査されているバッファの中の現在位置です。 定義済みマクロ: MS_C_CALL(func,param) MS_OP_PTR - 内部ポインタの初期化 パラメータ: 1. xxx_P() マイクロシーケンスの呼び出しによってアクセスされること になっているバッファへのポインタ。このポインタは xxx_P() 呼び 出しの間自動的に増やされることに注意してください。 定義済みマクロ: MS_PTR(ptr) MS_OP_ADELAY - 非同期遅延の実行 パラメータ: 1. ミリ秒単位での遅延時間 定義済みマクロ: MS_ADELAY(delay) MS_OP_BRSTAT - 状態による分岐 パラメータ: 1. アサートされたビットのマスク。状態レジスタの中のアサートされる はずのビットがマスクにセットされます。 2. クリアされたビットのマスク。状態レジスタの中のクリアされるはず のビットがマスクにセットされます。 3. 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オ フセットは次に実行されるマイクロインストラクションのインデック スに追加されます。 定義済みマクロ: MS_BRSTAT(asserted_bits,clear_bits,offset) MS_OP_SUBRET -
サブマイクロシーケンスから戻る パラメータはありません。 定義済みマクロ: MS_SUBRET() MS_OP_CALL -
サブマイクロシーケンスの呼び出し パラメータ: 1. 実行されるべきサブマイクロシーケンス 定義済みマクロ: MS_CALL(microseq) MS_OP_RASSERT_P - 内部 PTR
からレジスタへのアサート パラメータ: 1. レジスタに書込むためのデータ量 2. レジスタ 定義済みマクロ: MS_RASSERT_P(iter,reg) MS_OP_RFETCH_P - 内部 PTR
へのレジスタフェッチ パラメータ: 1. レジスタから読込むためのデータ量 2. レジスタ 3. 読込まれたデータに適用されるマスク 定義済みマクロ: MS_RFETCH_P(iter,reg,mask) MS_OP_TRIG - レジスタのトリガ パラメータ: 1. レジスタに書込まれるデータ量 2. レジスタ 3. 配列の大きさ 4. unsigned char の配列。個々の u_char の組はレジスタに書込むべき データおよびマイクロ秒単位でのウェイトするべき遅延時間です。遅 延時間は簡単化および配列の大きさの縮小のために 255 マイクロ秒 までに制限されています。 定義済みマクロ: MS_TRIG(reg,len,array) マイクロシーケンス |
C 構造体 |
union ppb_insarg { int i; char c; void *p; int (* f)(void *, char *); }; struct ppb_microseq { int opcode; /* マイクロインストラクション opcode */ union ppb_insarg arg[PPB_MS_MAXARGS]; /* 引数 */ }; |
マイクロシーケンスの使用 |
マイクロシーケンスを実体化するためには、ppb_microseq 構造体の配列を宣言し て必要に応じて初期化するだけです。定義済みのマクロまたは ppb_microseq の 定義に従った独自のマイクロインストラクションのいずれかを使用できます。例 えば、 struct ppb_microseq select_microseq[] = { |
/* パラメータリスト |
||
*/ |
||
#define SELECT_TARGET MS_PARAM(0, 1, MS_TYP_INT) |
||
#define SELECT_INITIATOR MS_PARAM(3, 1, MS_TYP_INT) |
||
/* 出力するための選択コマンドの送信 */ |
||
MS_DASS(MS_UNKNOWN), |
||
MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE), |
||
MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE), |
||
MS_DASS(MS_UNKNOWN), |
||
MS_CASS( H_AUTO | H_nSELIN | H_nINIT | H_STROBE), |
||
/* 出力の準備ができるまで待ちます */ |
||
MS_SET(VP0_SELTMO), |
/* loop: */ MS_BRSET(H_ACK, 2 /* ready */), |
MS_DBRA(-2 /* loop */), |
/* error: */ MS_RET(1), ここで、幾つかのパラメータが未定義でマイクロシーケンスの実行の前に満たさ れなければなりません。個々のマイクロシーケンスを初期化するため に、ppb_MS_init_msq() 関数を以下のように使用するべきです。 ppb_MS_init_msq(select_microseq, 2, |
SELECT_TARGET, 1 << target, |
|||
SELECT_INITIATOR, 1 << initiator); |
それからマイクロシーケンスを実行します。 |
マイクロシーケンサ |
マイクロシーケンサは ppbus レベルまたはアダプタレベル (ppbus のシステムレ イヤについての情報は ppbus(4) を参照してください) のいずれかで実行されま す。マイクロシーケンサの殆んどは、ppbus からアダプタへの関数呼び出しの オーバヘッドを避けるために、ppc レベルで実行されます。しかし、その転送は IEEE1284-1994 に合致しているのに反して、いくつかの決まりきった様な機能は ppbus レイヤで実行されます。 |
バグ
1 レベルのサブマイクロシーケンスのみが認められています。 ポートのトリガ時は、許可されている最大の遅延は 255 マイクロ秒です。 |
関連項目
歴史
microseq のマニュアルページは FreeBSD 3.0 ではじめて登場しました。 |
作者
このマニュアルページは Nicolas Souchu が書きました。 FreeBSD 10.0 June 6, 1998 FreeBSD 10.0 |