Linux上で動作する REX-5055 DIO PC Card用 プログラムです。
IPI16と接続し、入力信号を割込みで処理します。
1秒おきに割込みステータスを読出し、割込みが発生したら
読み出された下位バイトのデータを表示します。
この処理を50回繰り返して終了します。
REX-5055からケーブルRCL-5055Tを使用してIPI16に接続します。
![]() |
あらかじめ ROOT ユーザでログインします。
# cd /root/irq_test | irq_test のソースが格納されているディレクトリへ移動します |
# cc irq_test.c -o irq_test | ccを実行してプログラムを生成します |
/root/Projects/led_ctrl/src ディレクトリにプログラム led_ctrl が作成されます。
irq_test.c | メイン |
rex5055.h | rex5055用ヘッダ |
main | mainルーチン |
CardInit | REX-5055デバイスファイルのオープンと初期化 |
CardRelease | REX-5055デバイスアファイルのクローズ |
DataIn | REX-5055割込みポーリング処理 |
main(int argc, char **argv) { int count; int val; CardInit(argc, argv); for ( count = 0; count < 50; count++ ) { printf("Count:%3d ", count); if (DataIn(&val) & 0x80) printf("Data:%04X\n", val ); printf("\n"); sleep(1); } CardRelease(); } |
void CardInit(int argc, char **argv) { int Ctrl_val = 0x88; /* mode = low & high input mode */ /* up edge , PIO-1 */ int Mask_val = 0x82; /* Int enable, high-in for clear */ if (argc > 1) Card_dev = argv[1]; else Card_dev = "/dev/dio"; Card_fd = open(Card_dev, O_RDWR); if (Card_fd == -1) { printf("%s open error ...\n", Card_dev); exit(1); } /* Set Contorl */ if ( ioctl(Card_fd, REXDIO_SETCTRL, &Ctrl_val) == 1) { printf("%s REXDIO_SETCTRL error...\n", Card_dev); exit(1); } /* Set Int mask */ if ( ioctl(Card_fd, REXDIO_SETMASK, &Mask_val) == -1) { printf("%s REXDIO_SETMASK error...\n", Card_dev); exit(1); } } |
void CardRelease(void) { close(Card_fd); } |
int DataIn( int *val ) { struct arg { short int Stat_val; short int Word_val; }; struct arg dio_arg = { 0, 0}; if ( ioctl(Card_fd, REXDIO_IRQSTAT, &dio_arg) == -1) { printf("%s REXDIO_IRQSTAT error...\n", Card_dev); exit(1); } if (dio_arg.Stat_val & 0x80) *val = dio_arg.Word_val; return dio_arg.Stat_val; } |
IOCTLコマンド書式 | ioctl(fd, REXDIO_WRTCTRL, ctrl_val) ctrl_val : コントロールバイト |
---|
コントロールバイト
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
IMD | IR3 | IR2 | IR1 | IR0 | - | DIRH | DIRL |
コントロールバイトの各ビットの意味
ビット | 内容 |
---|---|
DIRL | PIO0-PIO7 のデータ入出力方向を設定します。 0: 入力 1: 出力 |
DIRH | PIO8-PIO15 のデータ入出力方向を設定します。 0: 入力 1: 出力 |
IR0-IR3 | 割り込みソースビットを設定します。 IR0-IR3 で指定されたPIOポートにIMDで指定された信号の立ち下がり・立ち上がりがあった場合、 割り込みステータスレジスタの IntFlagビットがセットされます。 |
IMD | 割込みトリガーモードを設定します。 0: 立下りエッジ 1: 立上りエッジ |
IOCTLコマンド書式 | ioctl(fd, REXDIO_SETMASK, mask_val) mask_val : 割り込みマスクバイト |
---|
割り込みマスクバイト
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
IrEbl | - | - | - | ICLRW3 | ICLRW2 | ICLRR3 | ICLRR2 |
割込みマスクバイトの各ビットの意味
ビット | 内容 |
---|---|
B0-B3 | 割込みステータスレジスタの
IntFlag ビットクリア条件を設定します。 ICLRR2 - 1 : データレジスタの下位バイトをリードした時クリア ICLRR3 - 1 : データレジスタの上位バイトをリードした時クリア ICLRW2 - 1 : データレジスタの下位バイトをライトした時クリア ICLRW3 - 1 : データレジスタの上位バイトをライトした時クリア |
IrEbl | 割込みモードを設定します。 0: ディセーブル(リセット時のデフォルト値) 1: コントロールレジスタのIR0-IR3で指定されたPIOポートに入力があった時、 CPUに割込み要求を発生します。 |
IOCTLコマンド書式 | ioctl(fd, REXDIO_IRQSTAT, &args) args: 以下の2ワードが設定される irq_stat:IRQステータスバイト ire_data: 入力データ (割込みクリア条件がデータリードの場合) ICLRR2 = 1, ICLRR3 = 1 の場合、PIO0..PIO15 の16ビットの値。 ICLRR2 = 1, ICLRR3 = 0 の場合、PIO0..PIO7の8ビットの値。 ICLRR2 = 0, ICLRR3 = 1 の場合、PIO8..PIO15の8ビットの値。 ICLRR2, ICLRR3 共に0の場合、データは不定となる。 |
---|