テストプログラム
デバイスドライバを、カーネルにロード後、ジョイスティックを
動かしてテストするプログラムを作成します。
デバイスドライバをテストするので、できる限り単純な
構成にします。
仕様決定
仕様を決定します。
デバイスファイルから、8ビットデータを取得し、2進数で表示。
ステートマシンを、以下とします。
- システムコールreadで、8ビットデータを文字列で取得
- get_numを利用して、16進2けたの文字列を、数値に変換
- 2で求めた数値を、2進数に変換して表示
- 1秒間待ち
- 1にもどる
コードに変換します。
/* endless loop */
while ( TRUE ) {
/* get data from device driver */
read( fd , buffer , BSIZE);
/* string -> number */
tmp = get_num( (int)buffer[0] );
tmp = (tmp << 4) + get_num( (int)buffer[1] );
/* show binary code */
binary_display( tmp );
/* wait 1 second */
sleep(1);
}
ファイル処理
デバイスファイルは、8ビットデータ入力の場合、/dev/joysと
デバイスノードを作成してあるので、マクロ定義で指定します。
#define DEVICE_NAME "/dev/joys"
デバイスノードさえわかれば、システムコールopenを利用して
オープンする。オープンできない場合には、その時点で終了します。
コードに変換します。
/* open device driver */
fd = open( DEVICE_NAME, O_RDONLY );
/* check */
if ( fd < 0 ) {
perror( DEVICE_NAME );
exit(1);
}
文字定数→数値変換
デバイスファイルからは、文字列でデータが来るので、文字
定数を数値に変換します。
ライブラリ関数もありますが、ここでは、自前で作成します。
次のシーケンスとします。
- デフォルト値0を、変数resultに格納
- '0'〜'9'のとき、'0'を引いて変数resultに格納
- 'A'〜'F'のとき、'A'を引いてから10を加えて、変数resultに格納
- 'a'〜'f'のとき、'a'を引いてから10を加えて、変数resultに格納
コードに変換します。
int get_num(char x)
{
int result ;
result = 0 ;
if ( '0' <= x && x <= '9' ) result = x - '0' ;
if ( 'A' <= x && x <= 'F' ) result = x - 'A' + 10 ;
if ( 'a' <= x && x <= 'f' ) result = x - 'a' + 10 ;
return result ;
}
2進表示
C言語では、2進数表示をサポートしていないので
シフトと論理演算で、2進数に変換します。
次のシーケンスとします。
- 指定ビット数分、右にシフト
- LSBをマスク
- '0'を加えて、1か0に変換
- putcharで表示
コードに変換します。
void binary_display(int x)
{
int loop ;
for ( loop = 7 ; loop > -1 ; loop-- ) {
putchar( '0' + ((x >> loop) & 1) );
}
putchar( '\r' );
putchar( '\n' );
}
全ソースファイル
ファイルとしてまとめます。
/*
* joytest.c
* CAT760 test push switches and joystick
* 2006.7.6 Kensuke Ooyu
*/
#include <stdio.h>
#include <fcntl.h>
#define FALSE 0
#define TRUE FALSE+1
#define BSIZE 32
#define DEVICE_NAME "/dev/joys"
/* function prototype */
int get_num(char x);
void binary_display(int x);
int main(void)
{
int fd;
char buffer[BSIZE];
int tmp;
/* open device driver */
fd = open( DEVICE_NAME, O_RDONLY );
/* check */
if ( fd < 0 ) {
perror( DEVICE_NAME );
exit(1);
}
/* endless loop */
while ( TRUE ) {
/* get data from device driver */
read( fd , buffer , BSIZE);
/* string -> number */
tmp = get_num( (int)buffer[0] );
tmp = (tmp << 4) + get_num( (int)buffer[1] );
/* show binary code */
binary_display( tmp );
/* wait 1 second */
sleep(1);
}
close( fd );
return 0 ;
}
int get_num(char x)
{
int result ;
result = 0 ;
if ( '0' <= x && x <= '9' ) result = x - '0' ;
if ( 'A' <= x && x <= 'F' ) result = x - 'A' + 10 ;
if ( 'a' <= x && x <= 'f' ) result = x - 'a' + 10 ;
return result ;
}
void binary_display(int x)
{
int loop ;
for ( loop = 7 ; loop > -1 ; loop-- ) {
putchar( '0' + ((x >> loop) & 1) );
}
putchar( '\r' );
putchar( '\n' );
}
コンパイル、リンク
SH−4用のロードモジュールを作成します。
コンパイルは、簡単です。
$ sh4-linux-gcc -O2 -o joytest joytest.c