次のコードに問題があります。ポート 0x300 から 0x307 へのアクセスを許可する必要があるため、次のようにします。
#ifdef LINUX
if(ioperm(PORT1,9,1)==-1) printf("Error in ioperm()");
#endif
ここで、PORT1=0x300 です。
それから私はこれをします:
int j5inp(unsigned int addr){
#ifdef DOS
return inp(addr);
#endif
#ifdef LINUX
return inb(addr);
#endif
}
void j5outp(unsigned int addr, unsigned int val){
#ifdef DOS
outp(addr,val);
#endif
#ifdef LINUX
outb(val,addr);
#endif
}
/************/
hrd_check()
{
j5outp(PCHECK,0xAA);
if (j5inp(PCHECK)!=0xAA) return(0);
j5outp(PCHECK,0x55);
if (j5inp(PCHECK)!=0x55) return(0);
return(1);
}
ここで、PCHECK=0x307 です。
これをテストしたところ、送信後にポートから値 0xAA を取得できることがわかりましたが、inb() がまだ 0xAA を返すため、2 番目の値 (0x55) は失敗します。
私は何か間違ったことをしていますか?これはハードウェアの問題でしょうか? inb() を呼び出すたびに ioperm() 関数を呼び出す必要がありますか、それとも iopl() を使用する必要がありますか?
ちなみに私が使っているボードはアドバンテックのPCM-3342です