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

要素数4の配列を使う

配列変数を使って、入力サイズが1バイトから4バイトまでの任意のバイト数のデー タを入力できるdio_readメソッドと、それを呼び出す dio_appアプリケーションを作成する。

そのためには現在のdio_drv.cdio_app.cを変更して、1バイト から4バイトまでの任意のバイト数のデータを入力できるようにすればよい。

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


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

dio_readメソッドの \fbox{\tt unsigned char bdata[1]} \fbox{\tt unsigned char bdata[4]}に変更する。

この変更に対応して、4バイト以上の読み出し要求があったばあいに 4バイトに切り詰めるように、次の処理を変更すること。

\begin{boxedminipage}{4cm}
\begin{verbatim}if (count > 1)
count = 1;\end{verbatim}
\end{boxedminipage}


前の説明のようにI/Oポートアドレスが16進数のcc00番地であれば、そこか ら1バイトを読み出すばあいは、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0xcc00);\end{verbatim}
\end{boxedminipage}

とすればよかった。

その次の1バイトを読み出すならば、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0xcc00 + 1);\end{verbatim}
\end{boxedminipage}

とすればよい。

さらに、その次の1バイトを読み出すならば、

\begin{boxedminipage}{4cm}
\begin{verbatim}inb(0xcc00 + 2);\end{verbatim}
\end{boxedminipage}

とすればよい。

for文を使って、指定したcount数のバイトを読みだすなら、次のように すればよい。

\begin{boxedminipage}{6cm}
\begin{verbatim}int i;for (i = 0, i < count; i++)
inb(0xcc00 + i);\end{verbatim}
\end{boxedminipage}


dio_read関数が4バイトまでのデータを読み込むためには次の処理を変更 する必要がある。上記のinb関数の説明を参考にして、指定したcount数 のバイトを読み込める形式にすること。

\begin{boxedminipage}{8.5cm}
\begin{verbatim}for (i = 0; i < count; i++)
bdata[?] = inb(pdio_res->io_address[0]);\end{verbatim}
\end{boxedminipage}

? の部分は自分で考えること。

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

     # rmmod dio_drv
     # insmod dio_drv.ko

次に、dio_app.cも4バイトまで入力できるアプリケーションにするために \fbox{\tt unsigned char buff[1]} \fbox{\tt unsigned char buff[4]}に変更 する。

この変更に対応して、次のreadシステムコールも4バイト入力できる形式 に変更する。

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

? の部分は自分で考えること。

for文を使って、次の形式で4回まで繰り返し表示できるようにする。

print文は簡単にするため16進数表示だけにする。


\begin{boxedminipage}{9cm}
\begin{verbatim}if (r_count > 0) {
for (i = 0; i <...
...d data(%d) = %X h\n'', ?, ?);
}
putchar('\n');\end{verbatim}
\end{boxedminipage}

この処理におけるprint文の?の部分は自分で考えて、次のような形式で4バイ トを表示できるようにすること。

       read data(1) = xx h
       read data(2) = xx h
       read data(3) = xx h
       read data(4) = xx h

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

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

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

例えば、1列目のバイトはスイッチ番号の2,4,5(0001,1010)をONにし、 2列目のバイトはスイッチ番号の9,10,12,14(0010,1011)をONにし、 3列目のバイトはスイッチ番号の19,20,21,22(0011,1100)をONにし、 3列目のバイトはスイッチ番号の25,27,28,31(0100,1101)をONにして、

     # ./dio_app

を実行すれば、
     [dio_open] ga Yobareta.
     [dio_read] ga Yobareta.
     read data(1) = 1A h
     read data(2) = 2B h
     read data(3) = 3C h
     read data(4) = 4D h
     [dio_release] ga Yobareta.
と表示されるはずである。



MANOME Yoichi 平成19年1月6日