テストプログラム

 デバイスドライバを、カーネルにロード後、ジョイスティックを
 動かしてテストするプログラムを作成します。

 デバイスドライバをテストするので、できる限り単純な
 構成にします。


仕様決定

 仕様を決定します。  デバイスファイルから、8ビットデータを取得し、2進数で表示。  ステートマシンを、以下とします。
  1. システムコールreadで、8ビットデータを文字列で取得
  2. get_numを利用して、16進2けたの文字列を、数値に変換
  3. 2で求めた数値を、2進数に変換して表示
  4. 1秒間待ち
  5. 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); }

文字定数→数値変換

 デバイスファイルからは、文字列でデータが来るので、文字  定数を数値に変換します。  ライブラリ関数もありますが、ここでは、自前で作成します。  次のシーケンスとします。
  1. デフォルト値0を、変数resultに格納
  2. '0'〜'9'のとき、'0'を引いて変数resultに格納
  3. 'A'〜'F'のとき、'A'を引いてから10を加えて、変数resultに格納
  4. '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進数に変換します。  次のシーケンスとします。
  1. 指定ビット数分、右にシフト
  2. LSBをマスク
  3. '0'を加えて、1か0に変換
  4. 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

戻る