next up previous
次へ: 要素数4の配列を使う 上へ: デバイスドライバとアプリケーションの機能拡張 戻る: デバイスドライバとアプリケーションの機能拡張

要素数1の配列を使う

最初は、1バイトのディジタル値の入力に使用している単純変数をそのまま配列 変数に変更することにする。配列変数にしておけば、後で要素数を変更すること によって1バイト以上のデータを入力することが可能になるからである。

配列変数を使って1バイトのデータを入力するdio_readメソッドと dio_appアプリケーションを作成する。

現在のソースファイルを変更する前に、実験の失敗に備えて、これを保存しておく。


\begin{boxedminipage}{5cm}
\begin{verbatim}...

dio_readメソッドが宣言している単純変数の \fbox{\\ unsigned char bdata;}を配列変数の \fbox{\tt unsigned char bdata[1];}に変更する。

この変更に対応して、バイトデータを読み込む処理の


\begin{boxedminipage}{8cm}
\begin{verbatim}bdata = inb(pdio_res->io_address[0]);\end{verbatim}
\end{boxedminipage}

を配列変数にふさわしい形式に変更すること。(bdataの変更)

また、カーネル空間のデータをユーザ空間へコピーする処理の


\begin{boxedminipage}{8cm}
\begin{verbatim}if (copy_to_user(buff, &bdata, count))\end{verbatim}
\end{boxedminipage}

も配列変数にふさわしい形式に変更すること。(&bdataの変更)

変更が終わったらmakeでコンパイルする。
つぎのように、前のドライバを削除し、新しいドライバを格納する。

     # rmmod dio_drv
     # insmod dio_drv.ko

次に、アプリケーション(dio_app.c)も変更する。

dio_app.cが宣言している単純変数の \fbox{\tt unsigned char buff}を 配列変数の \fbox{\tt unsigned char buff[1]}に変更する。

この変更に対応して、readシステムコールの


\begin{boxedminipage}{7cm}
\begin{verbatim}r_count = read(fd, &buff, 1);\end{verbatim}
\end{boxedminipage}

を配列変数にふさわしい形式に変更すること。(&buffを変更)

また、データを画面表示する処理の

\begin{boxedminipage}{8cm}
\begin{verbatim}printf(''read data = %X h\n'', buff);
printf(''read data = %d d\n'', buff);
\end{verbatim}
\end{boxedminipage}

も配列変数にふさわしい形式に変更すること。(buffを変更)

変更が終わったらmakeでコンパイルする。

コンパイルでエラーが出なければ、実行可能イメージとしてのdio_appア プリケーションが生成されているので、念のためlsコマンドで確かめる こと。

チェッカーの入力スイッチ1から8までを使って、任意のディジタルデータを設定 する。

例えば、スイッチ1とスイッチ8までを全てONにして、次のように

     # ./dio_app

を実行すれば、

     [dio_open] ga Yobareta.
     [dio_read] ga Yobareta.
     read data = FF h
     read data = 255 d
     [dio_release] ga Yobareta.

と表示されるはずである。



MANOME Yoichi 平成19年1月6日