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
'inp (2)'맨 페이지는 IO가 완료 될 때까지 일시 중지되는'_p' 변형이 있음을 언급합니다. 대신에 이것을 사용해야합니까? (당신은'ioperm()'이나'iopl()'을 사용할 때마다 호출 할 필요가 없다. 이것은 프로세스의'thread_struct'에 플래그를 설정한다.) – sarnold
당신은 inb가 호출 될 때 멈추지 않는다는 것을 의미 하는가? 어떻게 작동합니까? 내가 시도하고있는 목적은이 프로그램을 도스에서 리눅스로 옮기는 것이다. DOS에서 funcntions inp() 및 outp()와 동일한 유형의 성능을 가지기 위해 이러한 포트에 액세스하는 방법이 필요합니다. * _p 함수를 살펴 보겠습니다. –
나는 단지 여기에 어둠 속에서 촬영하고 있기 때문에 대답 대신에'_p' 변종에 대한 질문을 답장으로 남겼습니다. 그러나 IO 포트에 글쓰기가 약간의 시간이 걸린다면 놀랄 일이 아니며'outb_p() '는'outb()'보다 실행하는 데 시간이 오래 걸리지 만 출력이 실제로 작동하기를 기다린 후에 장치는 다음'inb()'와 함께 업데이트 된 값을보고 할 수 있습니다. 큰 추측이지만 잘하면 쉽게 테스트 할 수 있습니다 ... – sarnold