next up previous
次へ: ドライバの作成 上へ: システムコールの再実装(dio_write) 戻る: システムコールの再実装(dio_write)

dio_write関数の作成

ビット単位でデータをwriteできる関数を考える。

このdio_write関数の各機能を次のように作成していく。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}ssize_t dio_write(struct fil...
... pdio_res = (PDIO_RESOURCE)filp->private_data;\end{verbatim}
\end{boxedminipage}

dio_read関数の時と同じように、まずリソース情報をfile構造体からとりだ す。



\begin{boxedminipage}{\textwidth}
\begin{verbatim}if (count < 0)
return -EINVAL;if (count > 32)
count = 32;\end{verbatim}
\end{boxedminipage}

次に、書き込みデータサイズの確認と設定を行なう。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}if (copy_from_user(bdata, buff, count))
return -EFAULT;\end{verbatim}
\end{boxedminipage}

dio_read関数の時とは逆に、ユーザ空間内のデータをカーネル空間にコ ピーする必要があるので、copy_from_user関数を使う。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}uldata = 0;
for (i = 0; i ...
...a, pdio_res->io_address[0]);return count;
}\end{verbatim}
\end{boxedminipage}

最後に、先ほど取り出したI/Oポートアドレスを介して、outl関数を使っ てデータの書き込みを行ない、書き込み完了後、書き込んだデータサイズを戻り 値としてdio_write関数を終了する。

以上の処理を全て使えば、ビット単位でデータを出力する dio_write関数が作成できる。



MANOME Yoichi 平成18年12月26日