この章の目次にもどる
前頁:第6章 KB / PDにもどる
次頁:第8章 電源管理(パワーマネージメント)にすすむ

第7章 RS-232C

7.1 対象デバイス

PC/AT 版の場合

"rsa"COM1 (Port 0x3f8/IRQ4)
"rsb"COM2 (Port 0x2f8/IRQ3)
"rsc"PC カード
"rsd"PC カード

7.2 固有機能

7.3 付加機能ドライバー

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 を設定する。

7.4 ドライバー起動パラメータ

IMS より、次のように起動する。

[IMS]% kerext rsdrv [-w#] [!#]
                                     デフォルト
-w  カード初期化待ち時間(ミリ秒単位)    500 ms
!   RS ドライバーのタスク優先度          25

DEVCONF から次のパラメータを使用する。

RSCARD_WAIT wait_ms
    カード初期化待ち時間(ミリ秒単位)
    -w パラメータと同じ。-w パラメータより優先される。

RSCARD_POWER    n
    n = 0   電源制御を行う。(デフォルト)
        1   電源制御を行わない。

7.5 属性データ

以下の属性データをサポートする。

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 :
PC カード情報 (R)
data:   PCMCIAInfo

typedef struct {
    UB  major;      /* 仕様バージョン(上位) */
    UB  minor;      /* 仕様バージョン(下位) */
    UB  info[40];   /* 製品情報 */
} PCMCIAInfo;
現在挿入されている PC カードから、 カード属性情報の製品情報を読み出す。
info は、'\0' で終わる ASCII 文字列である。
PC カードが挿入されていない場合には、エラー ( ER_NOMDA )となる。
DN_RSMODE :
通信モード (RW)
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:7bit3:8bit
stopbits :0:1bit 1:1.5bit2:2bit3:-
baud :通信速度 ( bps )
通信モードを設定する / 取り出す。
サポートしていない設定をした場合はエラーとなる。
設定(書き込み)により通信環境はすべて初期化される。
DN_RSFLOW :
フロー制御 (RW)
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 :
XOFF を受信して送信停止状態であることを示す。
書き込みにより強制的に状態を変更できる。
csflow :
送信に対して CS 信号によるフロー制御
1:
CS 信号が OFF の時は送信しない。
0:
CS 信号に無関係に送信する。
  • 標準的には1を使用する。
rsflow :
受信に対して RS 信号によるフロー制御を行う。
受信バッファがフルに近くなると、RS 信号を OFF にして相手からの送信を停止させる。 バッファに空きができると RS 信号を ON に戻す。
xonany :
XOFF を受信して送信停止状態である時に、 XON でない任意の文字を受信しても XOFF 状態を解除する (sxflow = 1 のときのみ有効)。
sxflow :
送信に対して XON / XOFF によるフロー制御を行う。
即ち、XOFF を受信すると、XON を受信するまで送信しない。
rxflow :
受信に対して XON / XOFF によるフロー制御を行う。
即ち、受信バッファがフルに近くなると XOFF を送信し、 バッファに空きができると XON を送信する。

フロー制御を設定する / 取り出す。

DN_RSSTAT :
回線状態 (R)
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 :
BREAK 送信 (W)
data:   UW  ( = 0 の時は何もしない)
書き込みにより、指定したミリ秒だけ BREAK 信号を送出する。 送出終了まで指定したミリ秒間待たされる。
DN_RSSNDTMO :
送信タイムアウト (RW)
data:   UW  ( = 0 はタイムアウトなし)
送信タイムアウトをミリ秒単位で指定する。
指定した時間内に送信レディとならなかった時にタイムアウトする。 1 回の write 全体の送信時間に対するタイムアウトではなく、 直前の 1 バイトの送信から次のバイトの送信までのタイムアウトとなる。
DN_RSRCVTMO :
受信タイムアウト (RW)
data:   UW  ( = 0 はタイムアウトなし)
受信タイムアウトをミリ秒単位で指定する。
指定した時間内にデータが 1 つも受信できなかった時にタイムアウトする。 1 回の read 全体の受信時間に対するタイムアウトではなく、 直前の 1 バイトの受信から次のバイトの受信までのタイムアウトとなる。
DN_RSADDIN :
付加機能 (RW)
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 :
ハードウエア設定 ( 16450 用 ) (RW)
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)となる。
通常はドライバー自身が自動的にデフォルトを設定する。
PC カードの場合、PC カードが挿入されるまで未使用状態 ( iostep = 0 ) となっている。PC カードが挿入されると、ドライバーが自動的に設定する。
拡張ボードなどを使用する場合で、そのボードの設定に合わせて変更する場合に、 この属性データへの書き込みで設定を変更できる。 正しいデータを設定するのは呼び出し側の責任である。 誤ったデータを設定した場合の動作は保証されない。

7.6 固有データ

データ番号:
0に固定
データ数 :
R(読み込み) / W (書き込み)のバイト数
RS232C ポートから実際のデータの R / W を行う。
データ数 = 0 の時:
R:
受信済み(受信バッファに溜まっている) バイト数を有効データ長さとして戻す。
W:
常に 0 を戻す。
wait モードの時:
R :
指定されたバイト数を読み込み完了後に戻る。
W :
指定されたバイト数を書き込み完了後に戻る。
nowait モードの場合:
R :
既にバッファに溜まっているバイト数だけを読み込んで戻る ( 待ちに入らない )。
W :
指定されたバイト数を書き込み完了後に戻る ( wait モードと同じ )。

7.7 事象通知

なし

7.7.1 RS ドライバの位置付け

シリアルポートの実際の IO 操作はシリアル IO ドライバで行い、 RS ドライバはデバイス管理とのインタフェース機能を実現する。

したがって、RS ドライバの実際の操作はほとんど対応するシリアル IO ドライバの関数のコールで実現される。

PC カードの設定処理等は、RS ドライバーが行う。

rsdriver
図 12 : rsdriver

7.8 シリアル IO ドライバ

シリアル IO ドライバは中心核の下で動作する低レベルの IO ドライバであり、 以下の機能を専用の拡張SVCで提供する。

ERR serial_in(W port, B* buf, W len, W *alen, W tmout)

port で指定したポートから len バイトのデータを読み込み、実際に読み込んだバイト数を *alen に戻す。

len <= 0 の時は、 実際の読み込みは行わずに受信済みのバイト数を *alen に戻す。

tmout はタイムアウト指定 ( ミリ秒 ) で、

> 0 :
len バイト読み込む、エラーが発生する、またはタイムアウトするまで待たされる。
= 0 :
受信済みのデータを最大 len バイト読み込み、待ちにならない。
< 0 :
タイムアウトなし

関数値=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 はタイムアウト指定 ( ミリ秒 ) で、

> 0 :
len バイト書き込む、エラーが発生する、またはタイムアウトするまで待たされる。
= 0 :
エラー
< 0 :
タイムアウトなし

書き込みが完了、またはエラーが発生するまで待たされる。

関数値=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   −      サスペンド状態から復帰
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;

7.9 エラーコード

回線に関するエラーはずべて ER_IO とし、エラー詳細情報には、 シリアル IO ドライバから戻された RsError を設定する。
その他のエラーについては、デバイスドライバ共通仕様を参照。


この章の目次にもどる
前頁:第6章 KB / PDにもどる
次頁:第8章 電源管理(パワーマネージメント)にすすむ