第5回 デバイスドライバとのインタフェース



この文章は、OS-9000/80386(OS-9/x86)およびOS-9/PowerPCに対応しています。



第4回で示したように、デバイスドライバにはInit(初期化&開始)、Read(入力)、Write(出力)、Getstat(オプション取得)、Setstat(オプション設定)、Terminate(終了&後始末)6つのエントリを用意します。これら6つのエントリのインタフェース(引数と戻り値)について仕様を決定します。

Init

Initエントリは_os_attach()でデバイスがアタッチされる際に呼び出されますので、必須パラメタのデバイスリストのほかに、パスリストとアクセスモードを引数とします。

error_code Init(dev_list *dl, u_char *path, u_int16 mode);
dl デバイスリストへのポインタ
path アタッチするデバイスのパス名へのポインタ
mode アクセスモード
戻り値 エラーコード


Read

Readエントリはread()やreadln()でデバイスからデータを入力する際に呼び出されますので、引数もread()やreadln()に合わせておきます。パスディスクリプタ、バッファのアドレス、入力データ長を引数とします。入力データ長がポインタで渡されるのは、実際に入力したデータ長を返せるようにするためです。

error_code Read(path_desc *pd, u_char *buf, u_int32 *len);
pd パスディスクリプタへのポインタ
buf 入力バッファへのポインタ
len 入力データ長格納領域へのポインタ
戻り値 エラーコード

Write

Writeエントリはwrite()やwriteln()でデバイスからデータを入力する際に呼び出されますので、引数もwrite()やwriteln()に合わせておきます。パスディスクリプタ、バッファのアドレス、出力データ長を引数とします。出力データ長がポインタで渡されるのは、実際に出力したデータ長を返せるようにするためです。

error_code Write(path_desc *pd, u_char *buf, u_int32 *len);
pd パスディスクリプタへのポインタ
buf 出力バッファへのポインタ
len 出力データ長格納領域へのポインタ
戻り値 エラーコード

Getstat

デバイスオプションはデバイス毎に固有な情報なので、ファイルマネージャではパラメタを解析する事が出来ません。結局、機能コード以外はシステムコールを呼び出した時のパラメタをそのままデバイスドライバへ渡すしかありませんので、パスディスクリプタ、機能コード、パラメタテーブルへのポインタを引数とします。

error_code Getstat(path_desc *pd, u_int16 code, void *param);
pd パスディスクリプタへのポインタ
code 機能コード
param パラメタテーブルへのポインタ
戻り値 エラーコード

Setstat

デバイスオプションはデバイス毎に固有な情報なので、ファイルマネージャではパラメタを解析する事が出来ません。結局、機能コード以外はシステムコールを呼び出した時のパラメタをそのままデバイスドライバへ渡すしかありませんので、パスディスクリプタ、機能コード、パラメタテーブルへのポインタを引数とします。

error_code Setstat(path_desc *pd, u_int16 code, void *param);
pd パスディスクリプタへのポインタ
code 機能コード
param パラメタテーブルへのポインタ
戻り値 エラーコード

Terminate

Terminateエントリは_os_detach()でデバイスがデタッチされる際に呼び出されます。引数はデバイスリストだけとします。

error_code Terminate(dev_list *dl);
dl デバイスリストへのポインタ
戻り値 エラーコード

前へ 戻る