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の場合、データは不定となる。 |
|---|