- 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.