Linux I/O port programming mini-HOWTO: Troubleshooting

Next Previous Contents

## 8. Troubleshooting

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.

Next Previous Contents