There is a problem with the following code. I need it to give access to the ports 0x300 to 0x307 so i do this:
#ifdef LINUX
if(ioperm(PORT1,9,1)==-1) printf("Error in ioperm()");
#endif
Where PORT1=0x300.
then i do this:
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);
}
where PCHECK=0x307.
I have tested this and i found that i am able to retrieve the value 0xAA from the port after i sent it, but the second one (0x55) fails because inb() still returns 0xAA.
Am i doing anything wrong? can this be a hardware problem? Should i try calling the ioperm() function for every call to inb() or should i try using iopl() ?
by the way, the board i am using is the advantech PCM-3342
Well i guess this is one of those problems that simply goes away. I believe i corrected a little bug that i was sure was unrelated to this problem. But when i did it the problem went away.
I would give a better description of how i solved it but i don’t really know how i did it.