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

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

ドキュメント内 MDH-J0004 (ページ 50-56)

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

ドキュメント内 MDH-J0004 (ページ 50-56)