仕様に従ってdio_read
関数を作成する。
宣言されたbdata
はバイトデータを格納する変数である。
宣言されたpdio_res
はリソース情報構造体(DIO_RESOURCE
)を指す
ポインタ型の変数である。
dio_open
内で登録したリソース情報構造体のアドレスを確認する。
リソース情報構造体のアドレスが正常に登録されていなければ、すなわち
NULL
ならばエラー(-ENODEV
)を返して終了する。
正常に登録されていたらDIO_RESOURCE
のポインタ型にキャストして
pdio_res
に格納する。
カウント(count
)は、読み出しを行うデータのバイトサイズである。
負の場合はエラー(-EINVAL)を返して終了する。1バイト以上を要求された
場合は仕様と異なるので1バイトに切りつめる処理を行う。
pdio_res
ポインタが指すI/Oポートのデータをinb
関数で読み出す。
pdio_res->io_address[0]
はI/Oポートアドレスである。
最後に、ユーザ空間のバッファを示すbuff
にカーネル空間で取得した汎
用入力データをコピーする。
カーネル空間内のデータをユーザ空間へコピーするばあいには、
copy_to_user
関数を使用する。
コピー完了後、転送を行なったデータサイズを戻り値としてdio_read
関
数を終了する。今回の実験ではcount
の値は1である。
以上の処理を全て使えば、1バイト入力のdio_read
関数は完成する。