PC/AT 版の場合
"rsa" | COM1 (Port 0x3f8/IRQ4) |
"rsb" | COM2 (Port 0x2f8/IRQ3) |
"rsc" | PC カード |
"rsd" | PC カード |
TRON キーボードなど特定デバイスをシリアルポートに接続した場合の専用デバイスドライバー ( 付加機能ドライバー ) を RS ドライバー内に組み込む。 付加機能ドライバーには、 RS デバイスのサブユニットとしてアクセスする。
ユニット | rsX | 通常の汎用シリアルポート |
サブユニット | rsX0 | 特定デバイス専用 |
特定デバイス用付加機能ドライバーを有効にするためには、下記のような手順で行う。
/* 対象デバイスのサブユニットを排他オープンする */ opn_dev(L"rsa0", D_UPDATE|D_EXCL, NULL); /* 付加機能を選択し、有効とする */ addin = RSAD_TRONKB; wri_dev(dd, DN_RSADDIN, &addin, sizeof(addin), &sz, NULL); cls_dev(dd, 0, NULL);
付加機能ドライバーを有効にすると、
そのデバイスのユニット ( rsX
) はオープンできなくなり、
汎用シリアルポートとしては使用できなくなる。
付加機能ドライバーを解除するには、同様の手順で RSAD_NONE
を設定する。
DN_RSADDIN
および現在有効となっている付加機能ドライバーが認めているもの以外へアクセスした場合の動作については保証されない。
IMS より、次のように起動する。
[IMS]% kerext rsdrv [-w#] [!#] デフォルト -w カード初期化待ち時間(ミリ秒単位) 500 ms ! RS ドライバーのタスク優先度 25
DEVCONF
から次のパラメータを使用する。
RSCARD_WAIT wait_ms カード初期化待ち時間(ミリ秒単位) -w パラメータと同じ。-w パラメータより優先される。 RSCARD_POWER n n = 0 電源制御を行う。(デフォルト) 1 電源制御を行わない。
以下の属性データをサポートする。
R | 読み込みのみ可 |
W | 書き込みのみ可 |
RW | 読み込み / 書き込み可 |
/* RS データ番号 */ typedef enum { /* 共通属性 */ DN_PCMCIAINFO = -4, /* 個別属性 */ DN_RSMODE = -100, DN_RSFLOW = -101, DN_RSSTAT = -102, DN_RSBREAK = -103, DN_RSSNDTMO = -104, DN_RSRCVTMO = -105, DN_RSADDIN = -150, /* 機種別属性 */ DN_RS16450 = -300 } RSDataNo;
DN_PCMCIAINFO
:
data: PCMCIAInfo typedef struct { UB major; /* 仕様バージョン(上位) */ UB minor; /* 仕様バージョン(下位) */ UB info[40]; /* 製品情報 */ } PCMCIAInfo;現在挿入されている PC カードから、 カード属性情報の製品情報を読み出す。
info
は、'\0'
で終わる ASCII 文字列である。ER_NOMDA
)となる。
ER_PAR
) となる。
DN_RSMODE :
data: RsMode typedef struct { UW parity:2; /* パリティー */ UW datalen:2; /* データ長 */ UW stopbits:2; /* ストップビット長 */ UW rsv:2; /* 予約 */ UW baud:24; /* 通信速度 */ } RsMode;
parity : | 0:なし | 1:奇数 | 2:偶数 | 3:- |
datalen : | 0:5bit | 1:6bit | 1:7bit | 3:8bit |
stopbits : | 0:1bit | 1:1.5bit | 2:2bit | 3:- |
baud : | 通信速度 ( bps ) |
DN_RSFLOW :
data: RsFlow typedef struct { UW rsv:26; /* 予約 */ UW rcvxoff:1; /* XOFF 状態・強制変更 */ UW csflow:1; /* CTS 制御 */ UW rsflow:1; /* RTS 制御 */ UW xonany:1; /* 任意文字による XON */ UW sxflow:1; /* 送信 XON/XOFF 制御 */ UW rxflow:1; /* 受信 XON/XOFF 制御 */ } RsFlow;
rcvxoff :
csflow :
rsflow :
xonany :
sxflow = 1
のときのみ有効)。
sxflow :
rxflow :
フロー制御を設定する / 取り出す。
DN_RSSTAT :
data: RsStat typedef struct { UW rsv1:20; /* 予約 */ UW BE:1; /* Recv Buffer Overflow Error*/ UW FE:1; /* Framing Error */ UW 0E:1; /* Overrun Error */ UW PE:1; /* Parity Error */ UW rsv2:2; /* 予約 */ UW XF:1; /* Recv XOFF */ UW BD:1; /* Break Detect */ UW DR:1; /* Dataset Ready (DSR) */ UW CD:1; /* Carrier Detect DCD) */ UW CS:1; /* Clear to Send (CTS) */ UW CI:1; /* Calling Indicator(RI)*/ } RsStat;RS 回線の信号状態を示す。
FE, OE, PE : | エラーの発生状況を示し、読み込みによりクリアされる。 |
BD, CD, CS, CI : | (入力)信号の現在の状態を示す。 |
XF : | RsFlow.rcvxoff と同じ |
DN_RSBREAK :
data: UW ( = 0 の時は何もしない)書き込みにより、指定したミリ秒だけ BREAK 信号を送出する。 送出終了まで指定したミリ秒間待たされる。
DN_RSSNDTMO :
data: UW ( = 0 はタイムアウトなし)送信タイムアウトをミリ秒単位で指定する。
write
全体の送信時間に対するタイムアウトではなく、
直前の 1 バイトの送信から次のバイトの送信までのタイムアウトとなる。
DN_RSRCVTMO :
data: UW ( = 0 はタイムアウトなし)受信タイムアウトをミリ秒単位で指定する。
read
全体の受信時間に対するタイムアウトではなく、
直前の 1 バイトの受信から次のバイトの受信までのタイムアウトとなる。
data: RsAddIn typedef enum { RSAD_NONE = 0, /* 付加機能無し */ RSAD_TRONKB = 1, /* TRON キーボード*/ RSAD_ARTPAD = 2, /* Art Pad */ RSAD_IBMKB = 3, /* IBM キーボード */ RSAD_TOUCHPNL = 4, /* タッチパネル */ RSAD_SMOUSE = 5, /* シリアルマウス */ RSAD_TRACKBALL = 6 /* トラックボール */ } RsAddIn;シリアルポートに特定デバイスを接続して使用する場合に、 RS ドライバー内に組み込まれたそれ専用のデバイスドライバーを機能させるための指定である。
RSAD_NONE
以外が設定されている時 ( 付加機能有効時 ) には、
デバイスユニット ( rsX
) のオープンは禁止され ER_BUSY
を返す。DN_RS16450 :
data: RsHwConf_16450 typedef struct { UW iobase; UW iostep; IntVector intvec; } RsHwConf_16450;
iobase : | 16450 の I/O 空間の先頭アドレス |
iostep : | 16450 の各レジスタの I/O アドレスの間隔 |
intvec : | 16450 の割込レベル |
iostep = 0
でデバイスの使用を停止する。
この場合、他のフィールドの値は無効である。
また、他の属性データのアクセスや送受信等の要求もエラー(ER_NOMDA)となる。iostep = 0
)
となっている。PC カードが挿入されると、ドライバーが自動的に設定する。wait
モードの時:
nowait
モードの場合:
wait
モードと同じ )。
なし
シリアルポートの実際の IO 操作はシリアル IO ドライバで行い、 RS ドライバはデバイス管理とのインタフェース機能を実現する。
したがって、RS ドライバの実際の操作はほとんど対応するシリアル IO ドライバの関数のコールで実現される。
PC カードの設定処理等は、RS ドライバーが行う。
シリアル IO ドライバは中心核の下で動作する低レベルの IO ドライバであり、 以下の機能を専用の拡張SVCで提供する。
ERR serial_in(W port, B* buf, W len, W *alen, W tmout)
port
で指定したポートから len
バイトのデータを読み込み、実際に読み込んだバイト数を *alen
に戻す。
len <= 0
の時は、
実際の読み込みは行わずに受信済みのバイト数を *alen
に戻す。
tmout
はタイムアウト指定 ( ミリ秒 ) で、
len
バイト読み込み、待ちにならない。
関数値 | =0: | 正常 |
<0: | エラー発生 ( alen に戻されたバイト数のデータは読み込んでいる)ER_PAR ER_IO + ( エラー情報 ) |
ERR serial_out(W port, B* buf, W len, W *alen, W tmout)
port
で指定したポートに len
バイトのデータを書き込み、
実際に書き込んだバイト数を *alen
に戻す。
len <= 0
の時は何もしない。
tmout
はタイムアウト指定 ( ミリ秒 ) で、
len
バイト書き込む、エラーが発生する、またはタイムアウトするまで待たされる。
書き込みが完了、またはエラーが発生するまで待たされる。
関数値 | =0: | 正常 |
<0: | エラー発生 ( alen に戻されたバイト数のデータは書き込んでいる)ER_PAR ER_IO + ( エラー情報 ) |
ERR serial_ctl(W port, W kind, UW *arg)
port
で指定したポートに対して各種の操作を行う。
typedef enum { RS_ABORT = 0, RS_SUSPEND = -200, RS_RESUME = -201, RS_RCVBUFSZ = -202, RS_LINECTL = -203 } SerialControlNo; <kind> <arg> RS_ABORT − アボート(待ちを解除する) RS_SUSPEND − サスペンド状態へ移行 RS_RESUME − サスペンド状態から復帰
RS_RESUME
以外の要求 ( serial_in/out
も含む )
はないものとする。RS_RESUME
以外の要求の動作は不定となる。
DN_RSMODE RsMode 通信モードの設定 - DN_RSMODE RsMode 通信モードの取得 DN_RSFLOW RsFlow フロー制御の設定 - DN_RSFLOW RsFlow フロー制御の取得 - DN_RSSTAT RsStat 回線状態の取得 DN_RSBREAK UW (ミリ秒) BREAK 信号送出(待たされる) RS_RCVBUFSZ UW (バイト) 受信バッファサイズの設定 - RS_RCVBUFSZ UW (バイト) 受信バッファサイズの取得
RS_LINECTL UW 制御線の ON/OFF 設定 RSCTL_DTR 0x00000001 DTR 信号 RSCTL_RTS 0x00000002 RTS 信号 RSCTL_SET 0x00000000 全信号の設定 RSCTL_ON 0xc0000000 指定信号の ON RSCTL_OFF 0x80000000 指定信号の OFF ( RSCTL_SET ‖ RSCTL_ON ‖ RSCTL_OFF ) | [ RSCTL_DTR ] | [ RSCTL_RTS ] (例) RSCTL_SET|RSCTL_DTR DTR = ON, RTS = OFF RSCTL_ON |RSCTL_DTR DTR = ON, RTS 無変更 RSCTL_OFF|RSCTL_DTR DTR = OFF, RTS 無変更 DN_RS16450 RsHwConf_16450 ハードウエア構成の設定 - DN_RS16450 RsHwConf_16450 ハードウエア構成の取得
関数値 | =0: | 正常 |
<0: | エラー発生ER_PAR ER_IO + (エラー情報) |
シリアル IO ドライバはシステム起動時に自動的に立ち上がり、 各ポートのハードウエア構成の自動設定 ( デフォルト設定 ) およびハードウエアの初期設定を行う。
PC カード用のポートは未使用状態とする。
ポート番号 ( port
) は、0 から ポート数 -1
の連続した整数値となる。ポートの数は固定となり、
その数はインプリメント依存である。
ポート番号とデバイス名の対応は、RS ドライバーが決定する。
RS ドライバは、
適当な serial_ctl()
にコールによりポートの存在をチェックしてデバイスとして登録する。
エラー情報は以下の通り :
typedef struct { UW ErrorClass:16; /* エラークラス = EC_IO */ UW rsv:2; UW Aborted:1; /* アボートされた */ UW Timout:1; /* タイムアウトした */ /* 以下は RsStat に同じ */ UW BE:1; /* Recv Buffer Overflow Error */ UW FE:1; /* Framing Error */ UW 0E:1; /* Overrun Error */ UW PE:1; /* Parity Error */ UW rsv:2; UW XF:1; /* Recv XOFF */ UW BD:1; /* Break Detect */ UW DR:1; /* Dataset Ready (DSR) */ UW CD:1; /* Carrier Detect DCD) */ UW CS:1; /* Clear to Send (CTS) */ UW CI:1; /* Calling Indicator(RI)*/ } RsError;
回線に関するエラーはずべて ER_IO
とし、エラー詳細情報には、
シリアル IO ドライバから戻された RsError
を設定する。
その他のエラーについては、デバイスドライバ共通仕様を参照。