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