2012-06-13 65 views
1

以下代碼存在問題。我需要它來訪問端口0x300到0x307,所以我這樣做:在嵌入式設備中使用ioperm()與端口進行通信

#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); 
} 

其中P確認= 0x307。

我測試了這一點,我發現我能夠從端口檢索值0xAA我發送後,但第二個(0x55)失敗,因爲inb()仍然返回0xAA。

我做錯了什麼?這可能是硬件問題嗎?我應該嘗試調用Ioperm()函數爲每個調用inb()或者我應該嘗試使用iopl()?

順便說一下,我現在用的是板是研華PCM-3342

+1

'inp(2)'手冊頁提到有'_p'變種會暫停,直到IO完成 - 您是否需要使用這些變種? (你不需要在每次使用時調用'ioperm()'或'iopl()' - 這些在進程的'thread_struct'中設置一個標誌。) – sarnold

+0

你的意思是說inb在被調用時不會暫停?這是如何運作的?我嘗試的目的是將這個程序從DOS遷移到Linux。我需要通過訪問這些端口的方式來獲得與DOS中的函數inp()和outp()相同的性能。我會研究* _p函數,謝謝。 –

+0

我將'_p'變體作爲註釋而不是回答,因爲我只是在黑暗中拍攝 - 但如果寫入IO端口需要一些時間,我不會感到驚訝,而outb_p() '會比'outb()'執行花費更長的時間,但是在等待輸出真正起作用之後,設備可能會用下一個'inb()'報告更新的值。大猜測,但希望很容易測試... – sarnold

回答

0

嗯,我想這是簡單地消失的問題之一。我相信我糾正了一個我確信與這個問題無關的小錯誤。但是當我這樣做時,問題就消失了。

我會給出一個更好的描述我如何解決它,但我真的不知道我是如何做到的。

相關問題