title: Communicating with ports using ioperm() in embedded device
body: <p>There is a problem with the following code. I need it to give access to the ports 0x300 to 0x307 so i do this:</p>
  
  <pre><code>#ifdef LINUX
  if(ioperm(PORT1,9,1)==-1) printf("Error in ioperm()");
  #endif
  </code></pre>
  
  <p>Where PORT1=0x300.</p>
  
  <p>then i do this:</p>
  
  <pre><code>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);
   }
  </code></pre>
  
  <p>where PCHECK=0x307.</p>
  
  <p>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.</p>
  
  <p>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() ?</p>
  
  <p>by the way, the board i am using is the advantech PCM-3342</p>