I get segmentation faults when accessing ports.
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.
I can't find the
in*()
,
out*()
functions defined anywhere, and gcc complains about undefined references.
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.
out*()
doesn't do anything, or does something weird.
Check the order of the parameters; it should be
outb(value, port)
, not
outportb(port, value)
as is common in MS-DOS.
I want to control a standard RS-232 device/parallel printer/joystick...
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.