スポンサーリンク

MICROSEQ(9) FreeBSD カーネル開発者マニュアル MICROSEQ(9)

名称

microseq − ppbus マイクロシーケンサ開発者ガイド

書式

#include <sys/types.h>
#include <dev/ppbus/ppbconf.h>
#include <dev/ppbus/ppb_msq.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 状態) になるこ とができます。このレジスタへの読み込みはデータ線上の値を返します。

デバイス状態レジスタ

この読取り専用レジスタはパラレルポートインタフェース上の入力を反映しま す。

ビット 名前 解説
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 - レジスタ取得
はパラレルポートレジスタの現在の値を取り出し、マスクを適用し、それをバッ ファに保存するために使用されます。

パラメータ:

1. レジスタ

2. 文字マスク

3. バッファへのポインタ

定義済みマクロ: MS_RFETCH(reg,mask,ptr)

MS_OP_RSET - レジスタ設定
は 2 つのマスクを適用された、個々のパラレルポートレジスタの幾つかのビット をアサート/クリアするために使用されます。

パラメータ:

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 減らされた結果の値が正である場合に分岐するために 使用されます。

パラメータ:

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 - 戻る
はマイクロシーケンスから戻るために使用されます。この関数は必須です。これ はマイクロシーケンサがマイクロシーケンスの終わりを検出する唯一の方法で す。 ppb_MS_microseq() の (int *) パラメータによって指される整数に、リ ターンコードが返されます。

パラメータ:

1. 整数のリターンコード

定義済みマクロ: MS_RET(code)

MS_OP_C_CALL - C 関数の呼び出し
はマイクロシーケンスの実行から C 関数を呼び出すために使用されます。これは パラレルポートからデータ文字を取り出すために非標準の入出力が実行されると きに有用かもしれません。

パラメータ:

1. 呼び出すべき C 関数

2. 関数呼び出しのために渡されるパラメータ

C 関数は int(*)(void *p, char *ptr) と宣言されることになっています。 ptr パラメータは現在走査されているバッファの中の現在位置です。

定義済みマクロ: MS_C_CALL(func,param)

MS_OP_PTR - 内部ポインタの初期化
は現在走査されているバッファへの内部ポインタを初期化します。このポインタ はあらゆる C 呼び出しに渡されます (上記を参照してください)。

パラメータ:

1. xxx_P() マイクロシーケンスの呼び出しによってアクセスされること になっているバッファへのポインタ。このポインタは xxx_P() 呼び 出しの間自動的に増やされることに注意してください。

定義済みマクロ: MS_PTR(ptr)

MS_OP_ADELAY - 非同期遅延の実行
はマイクロシーケンスの実行の間に tsleep() するために使用されます。この tsleep は PPBPRI レベルで実行されます。

パラメータ:

1. ミリ秒単位での遅延時間

定義済みマクロ: MS_ADELAY(delay)

MS_OP_BRSTAT - 状態による分岐
は状態レジスタの状態で分岐するために使用されます。

パラメータ:

1. アサートされたビットのマスク。状態レジスタの中のアサートされる はずのビットがマスクにセットされます。

2. クリアされたビットのマスク。状態レジスタの中のクリアされるはず のビットがマスクにセットされます。

3. 現在実行された (サブ) マイクロシーケンスの整数のオフセット。オ フセットは次に実行されるマイクロインストラクションのインデック スに追加されます。

定義済みマクロ: MS_BRSTAT(asserted_bits,clear_bits,offset)

MS_OP_SUBRET - サブマイクロシーケンスから戻る
はサブマイクロシーケンスの呼び出しから戻るために使用されます。この行動は RET の呼び出しの前に必須です。幾つかのマイクロインストラクション (PUT, GET) はサブマイクロシーケンスの内部では呼び出し可能ではないかもしれませ ん。

パラメータはありません。

定義済みマクロ: MS_SUBRET()

MS_OP_CALL - サブマイクロシーケンスの呼び出し
はサブマイクロシーケンスを呼び出すために使用されます。サブマイクロシーケ ンスは SUBRET の呼び出しを伴なうマイクロシーケンスです。

パラメータ:

1. 実行されるべきサブマイクロシーケンス

定義済みマクロ: MS_CALL(microseq)

MS_OP_RASSERT_P - 内部 PTR からレジスタへのアサート
は内部の PTR ポインタによって現在指されているデータでレジスタをアサートす るために使用されます。

パラメータ:

1. レジスタに書込むためのデータ量

2. レジスタ

定義済みマクロ: MS_RASSERT_P(iter,reg)

MS_OP_RFETCH_P - 内部 PTR へのレジスタフェッチ
はレジスタからデータを読込むために使用されます。データは内部の 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),
/* 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 レイヤで実行されます。

バグ

1 レベルのサブマイクロシーケンスのみが認められています。

ポートのトリガ時は、許可されている最大の遅延は 255 マイクロ秒です。

関連項目

ppbus(4), ppc(4), vpo(4)

歴史

microseq のマニュアルページは FreeBSD 3.0 ではじめて登場しました。

作者

このマニュアルページは Nicolas Souchu が書きました。

FreeBSD 10.0 June 6, 1998 FreeBSD 10.0

スポンサーリンク