wiki:jazz/09-05-08

Version 4 (modified by jazz, 15 years ago) (diff)

--

2009-05-08

  • [專案] 在 Windows 底下常用的 inportb() 跟 outportb(),在 Linux 底下可以用 port I/O (有很多種 outb(), outw(), outl(), outsb(), outsw(), outsl(), inb(), inw(), inl(), insb(), insw(), insl() ) 來實現。而在 VxWorks 則用 sysInByte() 跟 sysOutByte() 來實現
    static int outportb(unsigned int port, unsigned int val, int size)
    {
        static int iopldone = 0;
    
    #ifdef DEBUG
        printf("outportb(0x%04x)<=0x%02x\n", port, val);
    #endif
    
        if (port > 1024) {
      if (!iopldone && iopl(3)) {
          fprintf(stderr, "iopl(): %s\n", strerror(errno));
          return 1;
      }
      iopldone++;
        } else if (ioperm(port,size,1)) {
      fprintf(stderr, "ioperm(%x): %s\n", port, strerror(errno));
      return 1;
        }
    
        if (size == 4)
      outl(val, port);
        else if (size == 2)
      outw(val&0xffff, port);
        else
      outb(val&0xff, port);
        return 0;
    }
    
    static int inportb(unsigned int port, int size)
    {
        static int iopldone = 0;
    
    #ifdef DEBUG
        printf("inportb(0x%04x)\n", port);
    #endif
    
        if (port > 1024) {
      if (!iopldone && iopl(3)) {
          fprintf(stderr, "iopl(): %s\n", strerror(errno));
          return 1;
      }
      iopldone++;
        } else if (ioperm(port,size,1)) {
      fprintf(stderr, "ioperm(%x): %s\n", port, strerror(errno));
      return 1;
        }
    
        if (size == 4)
      return inl(port);
        else if (size == 2)
      return inw(port) & 0xffff;
        else
      return inb(port) & 0xff;
    }
    

Attachments (5)

Download all attachments as: .zip