- Q1.
I get segmentation faults when accessing ports.
- A1.
Either your program does not have root privileges, or the
ioperm() call failed for some other reason. Check the return
value of ioperm(). Also, check that you're actually accessing the
ports that you enabled with ioperm() (see Q3). If you're using
the delaying macros (inb_p(), outb_p(), and so on), remember
to call ioperm() to get access to port 0x80 too.
- Q2.
I can't find the in*(), out*() functions defined
anywhere, and gcc complains about undefined references.
- A2.
You did not compile with optimisation turned on (-O),
and thus gcc could not resolve the macros in asm/io.h. Or you
did not #include <asm/io.h> at all.
- Q3.
out*() doesn't do anything, or does something weird.
- A3.
Check the order of the parameters; it should be
outb(value, port), not outportb(port, value) as is common in
MS-DOS.
- Q4.
I want to control a standard RS-232 device/parallel
printer/joystick...
- A4.
You're probably better off using existing drivers (in the
Linux kernel or an X server or somewhere else) to do it. The drivers
are usually quite versatile, so even slightly non-standard devices
usually work with them. See the information on standard ports above
for pointers to documentation for them.