• 検索結果がありません。

インタフェースモジュール使用例

ドキュメント内 MDH-J0005 (ページ 117-123)

第 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 }

ドキュメント内 MDH-J0005 (ページ 117-123)