第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 |
デバイスリストへのポインタ |
|
戻り値 |
エラーコード |