Re: Segmentation fault with outb()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Raja.Hayek@xxxxxxxxxxxxxx wrote:


I am trying to to set up my ports for IO with the low level inb() and outb() in the code below. However, as soon as I write to the COM port, I get a segmentation fault. The hardware uses a lava card with 8 COM ports available.


I know that similar code works in module form, whereby I insmod the module, and set up my ports using in the init_module() function. Here, however, I am trying to build it into a regular executable. But is that the reason?

TIA.

Raja Hayek.


// some includes up here...

#define COM3 0x100 // the address given to COM3 as per setserial

static const int BRDL = 0; // Baud rate divisor register offset
static const int BRDH = 1;
static const int IER = 1;
static const int LCR = 3; // line control register


static const int LCR_data = 0x03; // 8 bits, no parity, 1 stop bit
static const int LCR_access_baudrate = 0x80; // allow access to the baud rate divisor registers


static const int baud19200high  = 0;
static const int baud19200low   = 6;

static const int IER_data = 0; // disable all COM interrupts

int main()
{
outb(LCR_access_baudrate, COM3+LCR); // COM3: this line causes segmentation fault
outb(baud19200low, COM3+BRDL); // Setup the baud rate divisor
outb(baud19200high, COM3+BRDH);
outb(LCR_data, COM3+LCR); // Access TX and RX data ports
outb(IER_data, COM3+IER); // Setup interrupt masks


// more code down here...

Are you using iopl or ioperm to first get access to the ports? In a user space program you should do something like:
/* Get access to the ports. */
if (iopl(3) == -1) {
printf("errno: %d", errno);
exit(1);
}
// outb/inb stuff
/* Close the ports. */
if (iopl(0) == -1) {
printf("errno: %d", errno);
exit(1);
}


This howto is very helpful:
http://www.tldp.org/HOWTO/IO-Port-Programming-9.html

Bill




-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux