MICROSEQ(9) | FreeBSD Kernel Developer's Manual | MICROSEQ(9) |
名称
microseq — ppbus マイクロシーケンサ開発者ガイド解説
ppbus の解説およびマイクロシーケンサについての一般的な情報は ppbus(4) を参照してください。この文書の目的は、以下を得るために、開発者がマイクロシーケンサ機構を使用するように支援することです。
- 統一的なプログラミングモデル
- 効率的なコード
マイクロシーケンスを使用する前に、 ppc(4) マイクロシーケンサの実装および vpo(4) の中のこれをどのように使用するかの例を見ることが、奨励されています。
PPBUS レジスタモデル
背景
ppbus のために選択されたパラレルポートモデルは PC パラレルポートモデルです。従って、後で解説されるあらゆるレジスタは、PC パラレルポートの対になるものと同じセマンティクスを持ちます。より多くの ISA/ECP プログラミングについての情報については、 "Extended Capabilities Port Protocol and ISA interface Standard"として参照される Microsoft 標準を入手してください。後述するレジスタは、標準のパラレルポートレジスタです。マスクマクロは、パラレルポートレジスタの個々の有効なビットのために標準 ppbus インクルードファイルの中で定義されています。
データレジスタ
コンパチブルモードまたはニブルモードでは、このレジスタへの書き込みはパラレルポートのデータ線へ出力されます。その他のモードでは、出力段は、制御レジスタ内の方向ビット (PDC) の設定によって、トライステート (3 状態) になることができます。このレジスタへの読み込みは、データ線上の値を返します。デバイス状態レジスタ
この読み込み専用レジスタは、パラレルポートインタフェース上の入力を反映します。
ビット | 名前 | 解説 |
7 | nBUSY | パラレルポートの Busy 信号の反転 |
6 | nACK | パラレルポートの nAck 信号 |
5 | PERROR | パラレルポートの PERROR 信号 |
4 | SELECT | パラレルポートの Select 信号 |
3 | nFAULT | パラレルポートの nFault 信号 |
その他は、予約済みで、読み込み時の結果は、未定義です。
デバイス制御レジスタ
このレジスタは、直接的に幾つかの機能の有効化はもちろん、幾つかの出力信号を制御します。
ビット | 名前 | 解説 |
5 | PCD | 拡張モード時の方向ビット |
4 | IRQENABLE | 1 で nAck の立ち上りで割り込み有効 |
3 | SELECTIN | パラレルポートの nSelect 信号の反転を出力 |
2 | nINIT | パラレルポートの nInit 信号を出力 |
1 | AUTOFEED | パラレルポートの nAutoFd 信号の反転を出力 |
0 | STROBE | パラレルポートの nStrobe 信号の反転を出力 |
マイクロインストラクション
解説
マイクロインストラクション は、パラレルポートのアクセス、プログラムの繰り返し、サブマイクロシーケンスまたは 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
は、定義済みの標準 IEEE1284-1994 転送またはプログラムされた非標準の入出力のいずれかを行なうために使用されるマイクロインストラクションです。MS_OP_RFETCH - レジスタ取得
は、パラレルポートレジスタの現在の値を取り出し、マスクを適用し、それをバッファに保存するために使用されます。パラメータ:
- レジスタ
- 文字マスク
- バッファへのポインタ
定義済みマクロ: MS_RFETCH(reg,mask,ptr)
MS_OP_RSET - レジスタ設定
は 2 つのマスクを適用された、個々のパラレルポートレジスタの幾つかのビットをアサート/クリアするために使用されます。パラメータ:
- レジスタ
- アサートされるべきビットのマスク
- クリアされるべきビットのマスク
定義済みマクロ: MS_RSET(reg,assert,clear)
MS_OP_RASSERT - レジスタアサート
は、個々のパラレルポートレジスタの全てのビットをアサートするために使用されます。パラメータ:
- レジスタ
- アサートされるべきバイト
定義済みマクロ: MS_RASSERT(reg,byte)
MS_OP_DELAY - マイクロ秒の遅延
は、マイクロシーケンスの実行の遅延のために使用されます。パラメータ:
- マイクロ秒単位の遅延時間
定義済みマクロ: MS_DELAY(delay)
MS_OP_SET - 内部分岐レジスタの設定
は、内部の分岐レジスタの値を設定するために使用します。パラメータ:
- 整数値
定義済みマクロ: MS_SET(accum)
MS_OP_DBRA - 分岐の実行
は、内部の分岐レジスタが 1 減らされた結果の値が正である場合に分岐するために使用されます。パラメータ:
- 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オフセットは、次に実行されるマイクロインストラクションのインデックスに追加されます。
定義済みマクロ: MS_DBRA(offset)
MS_OP_BRSET - セット時に分岐
は、パラレルポートの状態レジスタのビットの幾つかがセットされている場合に分岐するために使用されます。パラメータ:
- 状態レジスタのビット
- 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オフセットは、次に実行されるマイクロインストラクションのインデックスに追加されます。
定義済みマクロ: MS_BRSET(mask,offset)
MS_OP_BRCLEAR - クリア時に分岐
は、パラレルポートの状態レジスタのビットの幾つかがクリアされている場合に分岐するために使用されます。パラメータ:
- 状態レジスタのビット
- 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オフセットは、次に実行されるマイクロインストラクションのインデックスに追加されます。
定義済みマクロ: MS_BRCLEAR(mask,offset)
MS_OP_RET - 戻る
は、マイクロシーケンスから戻るために使用されます。この関数は、必須です。これは、マイクロシーケンサがマイクロシーケンスの終わりを検出する唯一の方法です。 ppb_MS_microseq() の (int *) パラメータによって指される整数に、リターンコードが返されます。パラメータ:
- 整数のリターンコード
定義済みマクロ: MS_RET(code)
MS_OP_C_CALL - C 関数の呼び出し
は、マイクロシーケンスの実行から C 関数を呼び出すために使用されます。これは、パラレルポートからデータ文字を取り出すために非標準の入出力が実行されるときに有用かもしれません。パラメータ:
- 呼び出すべき C 関数
- 関数呼び出しのために渡されるパラメータ
C 関数は int(*)(void *p, char *ptr) と宣言されることになっています。 ptr パラメータは、現在走査されているバッファの中の現在位置です。
定義済みマクロ: MS_C_CALL(func,param)
MS_OP_PTR - 内部ポインタの初期化
は、現在走査されているバッファへの内部ポインタを初期化します。このポインタは、あらゆる C 呼び出しに渡されます (上記を参照してください)。パラメータ:
- xxx_P() マイクロシーケンスの呼び出しによってアクセスされることになっているバッファへのポインタ。このポインタは xxx_P() 呼び出しの間自動的に増やされることに注意してください。
定義済みマクロ: MS_PTR(ptr)
MS_OP_ADELAY - 非同期遅延の実行
は、マイクロシーケンスの実行の間に tsleep() するために使用されます。この tsleep は PPBPRI レベルで実行されます。パラメータ:
- ミリ秒単位での遅延時間
定義済みマクロ: MS_ADELAY(delay)
MS_OP_BRSTAT - 状態による分岐
は、状態レジスタの状態で分岐するために使用されます。パラメータ:
- アサートされたビットのマスク。状態レジスタの中のアサートされるはずのビットがマスクにセットされます。
- クリアされたビットのマスク。状態レジスタの中のクリアされるはずのビットがマスクにセットされます。
- 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オフセットは、次に実行されるマイクロインストラクションのインデックスに追加されます。
定義済みマクロ: MS_BRSTAT(asserted_bits,clear_bits,offset)
MS_OP_SUBRET - サブマイクロシーケンスから戻る
は、サブマイクロシーケンスの呼び出しから戻るために使用されます。この行動は RET の呼び出しの前に必須です。幾つかのマイクロインストラクション (PUT, GET) は、サブマイクロシーケンスの内部では、呼び出し可能ではないかもしれません。パラメータは、ありません。
定義済みマクロ: MS_SUBRET()
MS_OP_CALL - サブマイクロシーケンスの呼び出し
は、サブマイクロシーケンスを呼び出すために使用されます。サブマイクロシーケンスは SUBRET の呼び出しを伴なうマイクロシーケンスです。パラメータは、次の通りです:- 実行されるべきサブマイクロシーケンス
定義済みマクロ: MS_CALL(microseq)
MS_OP_RASSERT_P - 内部 PTR からレジスタへのアサート
は、内部の PTR ポインタによって現在指されているデータでレジスタをアサートするために使用されます。パラメータは、次の通りです:- レジスタに書き込むためのデータ量
- レジスタ
定義済みマクロ: MS_RASSERT_P(iter,reg)
MS_OP_RFETCH_P - 内部 PTR へのレジスタフェッチ
は、レジスタからデータを読み込むために使用されます。データは、内部の PTR ポインタによって現在指されているバッファに保存されます。パラメータは、次の通りです:- レジスタから読み込むためのデータ量
- レジスタ
- 読み込まれたデータに適用されるマスク
定義済みマクロ: MS_RFETCH_P(iter,reg,mask)
MS_OP_TRIG - レジスタのトリガ
は、パラレルポートをトリガするために使用されます。このマイクロインストラクションは、パラレルポートのとても効率的な制御の提供を意図されています。レジスタのトリガは、データ書み込み、少しウェート、データ書み込み、少しウェート ... です。これは、ポートへマジックシーケンスを書き込むことを可能にします。パラメータは、次の通りです:- レジスタに書き込まれるデータ量
- レジスタ
- 配列の大きさ
- 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), /* ready: */ MS_RET(0) };
ここで、幾つかのパラメータが未定義でマイクロシーケンスの実行の前に満たされなければなりません。個々のマイクロシーケンスを初期化するために、 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 レイヤで実行されます。歴史
microseq のマニュアルページは、 FreeBSD 3.0 ではじめて登場しました。作者
このマニュアルページは、 によって書かれました。バグ
1 レベルのサブマイクロシーケンスのみが認められています。ポートのトリガ時は、許可されている最大の遅延は 255 マイクロ秒です。
June 6, 1998 | FreeBSD |