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