テストプログラム
デバイスドライバを、カーネルにロード後、ジョイスティックを 動かしてテストするプログラムを作成します。 デバイスドライバをテストするので、できる限り単純な 構成にします。
仕様決定
仕様を決定します。 デバイスファイルから、8ビットデータを取得し、2進数で表示。 ステートマシンを、以下とします。コードに変換します。 /* 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); }
- システムコールreadで、8ビットデータを文字列で取得
- get_numを利用して、16進2けたの文字列を、数値に変換
- 2で求めた数値を、2進数に変換して表示
- 1秒間待ち
- 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); }
文字定数→数値変換
デバイスファイルからは、文字列でデータが来るので、文字 定数を数値に変換します。 ライブラリ関数もありますが、ここでは、自前で作成します。 次のシーケンスとします。コードに変換します。 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 ; }
- デフォルト値0を、変数resultに格納
- '0'〜'9'のとき、'0'を引いて変数resultに格納
- 'A'〜'F'のとき、'A'を引いてから10を加えて、変数resultに格納
- 'a'〜'f'のとき、'a'を引いてから10を加えて、変数resultに格納
2進表示
C言語では、2進数表示をサポートしていないので シフトと論理演算で、2進数に変換します。 次のシーケンスとします。コードに変換します。 void binary_display(int x) { int loop ; for ( loop = 7 ; loop > -1 ; loop-- ) { putchar( '0' + ((x >> loop) & 1) ); } putchar( '\r' ); putchar( '\n' ); }
- 指定ビット数分、右にシフト
- LSBをマスク
- '0'を加えて、1か0に変換
- putcharで表示
全ソースファイル
ファイルとしてまとめます。 /* * 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