第 5 章 インタフェースモジュール制御 80
5.6 インタフェースモジュール使用例
インタフェースモジュールを直接制御するために以下の処理について個別に説明します。
1) ハードウェアのリソース(I/Oポートまたはメモリ, 割り込み番号)取得 2) I/Oポートまたはメモリへのアクセス
3) 割り込みの制御
本項では弊社製インタフェースモジュールを例に、一連の処理をご紹介します。
使用インタフェースモジュール型式 サンプルプログラムの制御内容 総合ライブラリ
CTP-3170 I/Oポート入出力
メモリアクセス CPZ-360112
割り込み
IFCMxx.LIB
5.6.1 I/O ポート入出力制御
アナログ入力インタフェースモジュールCTP-3170を使用した、I/OマップドI/OのI/Oポート入出力 制御の例です。
サンプルプログラムの内容
CTP-3170のハードウェアリソース情報を取得し、I/Oポートアクセスを行います。
CTP-3170のレジスタにアクセスし、任意の値をライトし、同じレジスタをリードして、値が書き 込めているかどうか、リードした結果を表示して確認します。
サンプルプログラムソース
01 #include <stdio.h>
02 #include <conio.h>
03 #include "IFCM.h" /* 総合ライブラリヘッダファイル */
04 void main (void) 05 {
06 unsigned long bar[6]; /* ベースアドレスを格納する配列 */
07 unsigned short adr; /* I/Oポートアドレスを格納する変数 */
08 int dat; /* リードした値を格納する変数 */
09 char irq; /* 割り込み番号を格納する変数*/
10 PciGetConfigReg(1, 0x1147, 3170, bar, &irq); /* リソース取得 */
11 adr = (unsigned short) bar[0] & 0xfffc; /* I/Oポートアドレス抽出 */
12 outp(adr + 0x16 , 0x55); /* adr + 0x0cに0x55をライトする */
13 dat = inp(adr + 0x16); /* adr + 0x0cの値をリードする */
14 /* 取得したデータの表示 */
15 printf("I/O PORT ADDRESS : %04xh¥n", adr); /* I/Oポートアドレスの表示 */
16 printf("INTERRUPT NUMBER : %xh¥n", irq); /* 割り込み番号の表示 */
17 printf("WRITE + adr 16h : 55h¥n"); /* ライトした値の表示 */
18 printf("READ + adr 16h : %xh¥n", dat); /* リードした値の表示 */
19 return;
20 }
5.6.2 メモリアクセス制御
アナログ入出力インタフェースモジュールCPZ-360112を使用した、メモリマップドI/OのI/Oポー ト入出力制御の例です。
CPZ-360112はメモリマップドI/O方式なので、I/Oアクセスにはメモリアクセス関数を使用します。
サンプルプログラムの内容
CPZ-360112のハードウェアリソース情報を取得し、I/Oポートアクセスを行います。
CPZ-360112のレジスタにアクセスし、任意の値をライトし、同じレジスタをリードして、値が書
き込めているかどうか、リードした結果を表示して確認します。
アクセスは、バイトアクセス, ワードアクセス, ダブルワードアクセスを行います。
サンプルプログラムソース
01 #include <stdio.h>
02 #include <stdio.h>
03 #include <stdlib.h>
04 #include "IFCM.h" /* 総合ライブラリヘッダファイル */
05 void main (void) 06 {
07 unsigned long bar[6]; /* ベースアドレスを格納する配列 */
08 unsigned long adr; /* I/Oポートアドレスを格納する変数 */
09 char irq; /* 割り込み番号を格納する変数 */
10 unsigned char bReadData; /* バイトアクセスメモリリード用変数 */
11 unsigned int wReadData; /* ワードアクセスメモリリード用変数 */
12 unsigned long dwReadData; /* ダブルワードアクセスメモリリード用変数*/
13 int ret = 0; /* 関数の戻り値を格納する変数 */
14 ret = PciGetConfigReg(1, 0x1147, 3601, bar, &irq); /*リソース取得 */
15 adr = bar[0] & 0xfffffff0L; /* I/Oポートアドレス抽出 */
16 printf("I/O PORT ADDRESS: %08lxh¥n", adr); /* I/Oポートアドレスの表示 */
17 system("fbimem4g.com"); /* 4GBメモリアクセスユーティリティ */
→ 次ページへ続きます。
18 if(ret == 0){
19 /* バイトアクセス */
20 UioPokeByte(adr + 0x0b , 0x01); /* バイト出力 */
21 bReadData = UioPeekByte(adr + 0x0b); /* バイト入力 */
22 /* ワードアクセス */
23 UioPokeWord(adr + 0x08 , 0x0101); /* ワード出力 */
24 wReadData = UioPeekWord(adr + 0x08); /* ワード入力 */
25 /* ダブルワードアクセス */
26 UioPokeDword(adr + 0x34 , 0x01010101L); /* ダブルワード出力 */
27 dwReadData = UioPeekDword(adr + 0x34); /* ダブルワード入力 */
28 /* リードデータの表示 */
29 printf("BYTE DATA : %02Xh ¥n", bReadData); /* バイト入力データ表示 */
30 printf("WORD DATA : %04Xh ¥n", wReadData); /* ワード入力データ表示 */
31 printf("DWORD DATA: %08lXh ¥n", dwReadData);/* ダブルワード入力データ表示 */
32 }else{
33 printf("GET RESOURCE ERROR Error_No:%d", ret);
34 } 35 return;
36 }
5.6.3 割り込み制御
アナログ入出力インタフェースモジュールCPZ-360112を使用した、割り込み制御の例です。
CPZ-360112はメモリマップドI/O方式なので、I/Oアクセスにはメモリアクセス関数を使用します。
サンプルプログラムの内容
CPZ-360112のハードウェアリソース情報を取得し、I/Oポートアクセスを行います。
CPZ-360112のレジスタにアクセスし、任意の値をライトし、同じレジスタをリードして、値が書
き込めているかどうか、リードした結果を表示して確認します。
アクセスは、バイトアクセス, ワードアクセス, ダブルワードアクセスを行います。
サンプルプログラムソース
01 #include <conio.h>
02 #include "IFCM.h" /* 総合ライブラリヘッダファイル */
03 int IRQ_Count; /* 割り込み回数カウント用変数 */
04 int far user_func(int handle, short user1, long user2)/* 割り込み処理関数 */
05 {
06 unsigned char stat; /* 割り込みステータスを格納する変数 */
07 unsigned short adr; /* I/Oポートアドレスを格納する変数 */
08 adr = user1; /* I/Oポートアドレスを代入 */
09 stat = inp(adr + 0x02); /* 割り込み要因の確認 */
10 if(stat == 0x10) /* 割り込みステータスの確認 */
11 {
12 IRQ_Count++; /* 割り込み処理 */
13 return 1; /* 割り込み処理の終了 */
14 }
15 return 0;
16 }
→ 次ページへ続きます。
17 void main (void) 18 {
19 unsigned long bar[6]; /* ベースアドレスを格納する配列
20 unsigned short handle; /* 割り込みハンドル番号を格納する変数 */
21 char irq; /* 割り込み番号を格納する変数 */
22 PciGetConfigReg(1, 0x1147, 3601, bar, &irq); /* リソース取得 */
23 adr = bar[0] & 0xfffffff0L; /* I/Oポートアドレス抽出 */
24 printf("I/O PORT ADDRESS: %08lxh¥n", adr); /* I/Oポートアドレスの表示*/
25 IRQ_Count = 0; /* カウント値の初期化 */
26 handle = PciSetInterrupt(irq, user_func, adr, 0L);
27 if(handle != 0xffff){
28 outp(adr + 0x04, 0x00); /* タイマ設定 */
29 outp(adr + 0x05, 0x00);
30 outp(adr + 0x06, 0x01);
31 outp(adr + 0x03, 0x10); /* 割り込みマスクオープン */
32 outp(adr + 0x07, 0x02); /* タイマ開始 */
33 while(1){
34 printf("COUNTER = %04Xh¥n", IRQ_Count);
35 if(kbhit()){
36 getch(); break;
37 } 38 }
39 outp(adr + 0x07, 0x00); /* タイマ停止 */
40 outp(adr + 0x03, 0x00); /* 割り込みマスククローズ */
41 PciKillInterrupt(handle);
42 } 43 }