REX-5055 DIO PC Card用 Linuxドライバです。
| WrtCtrl:0xDD\n | Write コントロールレジスタ |
| WrtMask:0xDD\n | Writeマスクレジスタ |
| ReadMask:0xDD\n | Read割込みステータスレジスタ |
| ReadLowByte\n | Read Low Data |
| ReadHighByte\n | Read High Data |
| ReadWord\n | Read Word Data |
| GetBit:DD\n | Get Bit status 指定したビットの状態を読み出す |
| WriteLowByte:0xDD\n | Write Low Data |
| WriteHighByte:0xDD\n | Write High Data |
| WriteWord:0xDD\n | Write Word Data |
| SetBitOn:DD\n | Set Bit 指定したビットをセットする |
| SetBitOff:DD\n | Set Bit 指定したビットをクリアする |
| PollIrqStat\n | IRQ Ststusをポーリングする |
| SetIrqResponse\n | 割り込み処理での出力データを設定する |
| L:0xNN\n | ポートから読出したデータレジスタ下位バイトデータ
先頭が"L:" と"0x"で始まる2桁の16進数 |
| H:0xNN\n | ポートから読出したデータレジスタ上位バイトデータ
先頭が"H:" と"0x"で始まる2桁の16進数 |
| W:0xNNNN\n | ポートから読出したワードデータ
先頭が"W:" と"0x"で始まる4桁の16進数 |
| B:DD:sss\n | 指定したビットの状態
先頭が"B:" でDDにはビット番号を現す"00"〜"15"の2桁の10進数、 sssには"On"または"Off"の文字列 |
| M:0xNN\n | マスクデータ 先頭が"M:" と"0x"で始まる2桁の16進数 |
| S:0xNN\n | IRQステータス 先頭が"S:" と"0x"で始まる2桁の16進数 |
| シンボル | 機能 |
| REXDIO_WRTCTRL | Writeコントロールレジスタ |
| REXDIO_SETMASK | Writeマスクレジスタ |
| REXDIO_GETMASK | Readマスクレジスタ |
| REXDIO_OUT_HIGHBYTE | Write High Data |
| REXDIO_IN_HIGHBYTE | Read High Data |
| REXDIO_OUT_LOWBYTE | Write Low Data |
| REXDIO_IN_LOWBYTE | Read Low Data |
| REXDIO_OUT_WORD | Write Word Data |
| REXDIO_IN_WORD | Read Word Data |
| REXDIO_IRQSTAT | IRQ Ststusをポーリングする |
| REXDIO_IRQRESPONSE | 割り込み処理での出力データを設定する |
これらのシンボルはヘッダーファイル rex5055d.h で定義されている
| Writeコマンド書式 |
cmd = "WrtCtrl:0xDD\n"; write(fd, cmd, len); 0xDD : コントロールバイト |
|---|---|
| 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: 立上りエッジ |
| Writeコマンド書式 |
cmd = "WrtMask:0xDD\n"; write(fd, cmd, len) 0xDD : 割り込みマスクバイト |
|---|---|
| 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に割込み要求を発生します。 |
| Writeコマンド書式 |
cmd = "ReadMask:\n"; write(fd, cmd, len); read(fd, buf, len); buf の書式:"M:0xNN\n" |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_GETMASK, &irq_stat) irq_stat : 割り込みステータスバイト |
割り込みステータスバイト
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
|---|---|---|---|---|---|---|---|
| IntFlag | - | - | - | ICLRW3 | ICLRW2 | ICLRR3 | ICLRR2 |
割込みステータスバイトの各ビットの意味
| ビット | 内容 |
|---|---|
| B0-B3 | 割込みマスクレジスタへ設定した値がそのままリードバックされます。 |
| IntFlag | 割込み要求の有無を示します。 0: 割込み要求はありません。 1: 割込み要求が発生しています。 |
| Writeコマンド書式 |
cmd = "ReadLowByte:\n";
write(fd, cmd, len) read(fd, buf, len); buf の書式:"L:0xDD\n" |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_IN_LOWBYTE, &byte_data) byte_data:読出した下位バイトデータ |
| Writeコマンド書式 |
cmd = "ReadHighByte:\n" write(fd, cmd, len) read(fd, buf, len); buf の書式:"H:0xDD\n" |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_IN_HIGHBYTE, &byte_data) byte_data:読出した上位バイトデータ |
| Writeコマンド書式 |
cmd = "ReadWord:\n"; write(fd, cmd, len) read(fd, buf, len); buf の書式:"W:0xDDDD\n" |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_IN_WORD, &word_data) word_data:読出したワードデータ |
| Writeコマンド書式 |
cmd = "GetBit:DD\n" write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | なし |
| Writeコマンド書式 |
cmd = "WriteLowByte:0xDD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_OUT_LOWBYTE, byte_data) |
| Writeコマンド書式 |
cmd = "WriteHighByte:0xDD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_OUT_HIGHBYTE, byte_data) |
| Writeコマンド書式 |
cmd = "WriteWord:0xDDDD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_OUT_WORD, word_data) |
| Writeコマンド書式 |
cmd = "SetBitOn:DD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | なし |
| Writeコマンド書式 |
cmd = "SetBitOff:DD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | なし |
| Writeコマンド書式 |
cmd = PollIrqStat:\n"; write(fd, cmd, len); read(fd, buf, len); buf の書式: IRQステータスバイト "S:0xNN\n" 上に続いて入力データが下のいずれかの書式で: "W:0xDDDD\n", "L:0xDD\n", "H:0xDD\n" |
|---|---|
| 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の場合、データは不定となる。 |
| Writeコマンド書式 |
cmd = "SetIrqResponse:0xDD\n"; write(fd, cmd, len); |
|---|---|
| IOCTLコマンド書式 | ioctl(fd, REXDIO_IRQRESPONSE, response) response:出力データ IRQマスクデータのICLRW2, ICLRW3 の値によってデータサイズは自動的に決まる。 ICLRW2, ICLRW3 共に1の場合のみワード、それ以外はバイトデータとなる。 ICLRW2, ICLRW3 共に0の場合、データは出力されない。 |
REX-5055 はPIO0-PCIO15 の1ラインを割込み入力ラインとして使用できます。
割込みの解除は、割込みマスクレジスタB0-B3に設定した値に従って、
PIO0-7, PIO8-15 の入力または出力によって行われます。
本ドライバでは、"WrtMask:"またはREXDIO_SETMASKによって設定される設定値で
割込みの有効無効を判断し、ドライバ内で割込みクリア処理を行います。
| ICLRxn | 割込みクリア条件 | ドライバ処理 |
|---|---|---|
| ICLRR2 = 1 | PIO0-PIO7の入力 | 割込み発生時に自動的にデータレジスタからの読み込み 読み込まれたデータは、"IRQ Statusポーリング処理"で取り出せます |
| ICLRR3 = 1 | PIO8-PIO15の入力 | |
| ICLRW2 = 1 | PIO0-PIO7へ出力 | 割込み発生時に自動的にデータレジスタへ出力 出力データは、先に"割り込み処理時の出力データの設定"で行います |
| ICLRW3 = 1 | PIO8-PIO15へ出力 |
以下では、REX-5055の上位バイトを出力、下位バイトを入力に設定して、 ビット15をオンにした後、下位バイトのデータを読み出しています。
| char *ctrl_cmd = "WrtCtrl:0x02"; | コントロールレジスタへの設定値 (P0-P7:入力 P8-P15:出力) |
| char *mask_cmd = "WrtMask:0x00"; | IRQマスクレジスタへの設定値 (IRQは使用しない) |
| fd = open ("/dev/dio", O_RDWR); | mknod で作製したデバイススペシャルファイルを指定し、使用を開始する。 |
| write (fd, ctrl_cmd, strlen(ctrl_cmd)); | コントロールレジスタの設定 |
| write (fd, mask_cmd, strlen(mask_cmd)); | IRQマスクレジスタの設定 |
| write (fd, "SetBitOn:15\n", 12); | ビット15をオンに設定 |
| write (fd, "ReadLowByte:\n", 13); | 下位バイト読出し命令 |
| read (fd, buf, 6); | 下位バイトが buf に "L:0xNN\n" の書式で読み込まれる |
| close(fd) | デバイススペシャルファイルの使用を終了する。 |