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) | デバイススペシャルファイルの使用を終了する。 |