1

次のコードに問題があります。ポート 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です

4

1 に答える 1

0

まあ、これは単になくなる問題の1つだと思います。私は、この問題とは無関係であると確信していた小さなバグを修正したと思います。しかし、私がそれをしたとき、問題はなくなりました。

私はそれをどのように解決したかについてより良い説明をしますが、私はそれをどのように解決したのか本当にわかりません。

于 2012-06-17T22:47:44.137 に答える