第 3 章 インタフェースモジュール制御 9
3.6 インタフェースモジュール使用例
3.6.1 I/Oポート入出力制御
アナログ入力インタフェースモジュールCTP-3170を使用した、I/OマップドI/OのI/Oポート入出力制 御の例です。
サンプルプログラムの内容
CTP-3170のハードウェアリソース情報を取得し、I/Oポートアクセスを行います。
CTP-3170のレジスタにアクセスし、任意の値をライトし、同じレジスタをリードして、値が書き込 めているかどうか、リードした結果を表示して確認します。
サンプルプログラムソース
03 #include "IFDOS.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 printf("I/O PORT ADDRESS : %04xh¥n", adr); /* I/Oポートアドレスの表示 */
15 printf("INTERRUPT NUMBER : %xh¥n", irq); /* 割り込み番号の表示 */
16 printf("WRITE + adr 16h : 55h¥n"); /* ライトした値の表示 */
17 printf("READ + adr 16h : %xh¥n", dat); /* リードした値の表示 */
18 return;
19 }
01 #include <stdio.h>
02 #include <conio.h>
3.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 "IFDOS.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 }
3.6.3 割り込み制御
アナログ入出力インタフェースモジュールCPZ-360112を使用した、割り込み制御の例です。
CPZ-360112はメモリマップドI/O方式なので、I/Oアクセスにはメモリアクセス関数を使用します。
サンプルプログラムの内容
CPZ-360112のハードウェアリソース情報を取得し、I/Oポートアクセスを行います。
CPZ-360112のレジスタにアクセスし、任意の値をライトし、同じレジスタをリードして、値が書き
込めているかどうか、リードした結果を表示して確認します。
アクセスは、バイトアクセス, ワードアクセス, ダブルワードアクセスを行います。
サンプルプログラムソース
01 #include <conio.h>
02 #include "IFDOS.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 long adr; /* I/Oポートアドレスを格納する変数 */
21 unsigned short handle; /* 割り込みハンドル番号を格納する変数 */
22 char irq; /* 割り込み番号を格納する変数 */
23 PciGetConfigReg(1, 0x1147, 3601, bar, &irq); /* リソース取得 */
24 adr = bar[0] & 0xfffffff0L; /* I/Oポートアドレス抽出 */
25 printf("I/O PORT ADDRESS: %08lxh¥n", adr); /* I/Oポートアドレスの表示*/
26 IRQ_Count = 0; /* カウント値の初期化 */
27 handle = PciSetInterrupt(irq, user_func, adr, 0L);
28 if(handle != 0xffff){
29 outp(adr + 0x04, 0x00); /* タイマ設定 */
30 outp(adr + 0x05, 0x00);
31 outp(adr + 0x06, 0x01);
32 outp(adr + 0x03, 0x10); /* 割り込みマスクオープン */
33 outp(adr + 0x07, 0x02); /* タイマ開始 */
34 while(1){
35 printf("COUNTER = %04Xh¥n", IRQ_Count);
36 if(kbhit()){
37 getch(); break;
38 } 39 }
40 outp(adr + 0x07, 0x00); /* タイマ停止 */
41 outp(adr + 0x03, 0x00); /* 割り込みマスククローズ */
42 PciKillInterrupt(handle);
43 } 44 }