/* * x86 port IO routines * Copyright (c) 2001, David H. Hovemeyer * $Revision: 1.2 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". */ #include /* * Write a byte to an I/O port. */ void Out_Byte(ushort_t port, uchar_t value) { __asm__ __volatile__ ( "outb %b0, %w1" : : "a" (value), "Nd" (port) ); } /* * Read a byte from an I/O port. */ uchar_t In_Byte(ushort_t port) { uchar_t value; __asm__ __volatile__ ( "inb %w1, %b0" : "=a" (value) : "Nd" (port) ); return value; } /* * Write a word to an I/O port. */ void Out_Word(ushort_t port, ushort_t value) { __asm__ __volatile__ ( "outw %w0, %w1" : : "a" (value), "Nd" (port) ); } /* * Read a word from an I/O port. */ ushort_t In_Word(ushort_t port) { ushort_t value; __asm__ __volatile__ ( "inw %w1, %w0" : "=a" (value) : "Nd" (port) ); return value; } /* * Write a double word to an I/O port. */ void Out_DWord(ushort_t port, uint_t value) { __asm__ __volatile__ ( "outl %0, %1" : : "a" (value), "Nd" (port) ); } /* * Read a double word from an I/O port. */ uint_t In_DWord(ushort_t port) { uint_t value; __asm__ __volatile__ ( "inl %1, %0" : "=a" (value) : "Nd" (port) ); return value; } /* * Short delay. May be needed when talking to some * (slow) I/O devices. */ void IO_Delay(void) { uchar_t value = 0; __asm__ __volatile__ ( "outb %0, $0x80" : : "a" (value) ); }