2012-06-13 2 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); 
} 

곳 PCHECK = 0x307을.

나는 이것을 테스트 한 결과 포트를 보낸 후 포트에서 값 0xAA를 검색 할 수 있지만 inb()가 0xAA를 반환하기 때문에 두 번째 포트 (0x55)가 실패합니다.

뭐가 잘못 되었나요? 하드웨어 문제 일 수 있습니까? inb()에 대한 모든 호출에 대해 ioperm() 함수를 호출해야합니까? 아니면 iopl()을 사용해야합니까? 그런데

, 내가 사용하고있는 보드는 그럼 내가이 단순히 도망 간다 이러한 문제 중 하나입니다 생각 어드밴텍의 PCM-3342

+1

'inp (2)'맨 페이지는 IO가 완료 될 때까지 일시 중지되는'_p' 변형이 있음을 언급합니다. 대신에 이것을 사용해야합니까? (당신은'ioperm()'이나'iopl()'을 사용할 때마다 호출 할 필요가 없다. 이것은 프로세스의'thread_struct'에 플래그를 설정한다.) – sarnold

+0

당신은 inb가 호출 될 때 멈추지 않는다는 것을 의미 하는가? 어떻게 작동합니까? 내가 시도하고있는 목적은이 프로그램을 도스에서 리눅스로 옮기는 것이다. DOS에서 funcntions inp() 및 outp()와 동일한 유형의 성능을 가지기 위해 이러한 포트에 액세스하는 방법이 필요합니다. * _p 함수를 살펴 보겠습니다. –

+0

나는 단지 여기에 어둠 속에서 촬영하고 있기 때문에 대답 대신에'_p' 변종에 대한 질문을 답장으로 남겼습니다. 그러나 IO 포트에 글쓰기가 약간의 시간이 걸린다면 놀랄 일이 아니며'outb_p() '는'outb()'보다 실행하는 데 시간이 오래 걸리지 만 출력이 실제로 작동하기를 기다린 후에 장치는 다음'inb()'와 함께 업데이트 된 값을보고 할 수 있습니다. 큰 추측이지만 잘하면 쉽게 테스트 할 수 있습니다 ... – sarnold

답변

0

입니다. 나는 내가이 문제와 관련이 없다는 것이 확실한 작은 버그를 수정했다고 생각한다. 그러나 내가 그것을했을 때 문제는 사라졌습니다.

나는 그것을 어떻게 풀 었는지 더 잘 설명 할 것이지만 실제로 어떻게했는지는 모른다.