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.