Tech Support > Computer Hardware > Microprocessors > kernel programming serial uart problem
kernel programming serial uart problem
Posted by gxatzipavlis on January 19th, 2006


hello ppl

i have programed a kernel module for linux to communicate with devices
through serial port. I don't use the linux serial layer abstraction cause
i want to have a time-check timeout for byte to byte in the communication.
So i use the inb,outb commands in my module. The problem is that my module
is only running in my PC (amd athlon 1000 chipset via kt133a). in all
other pc's although i can see in /proc/interrupts that my module is there

e.x 4: 0 XT-PIC my_module

when i send a character out to the serial port with outb my interrupt
handler routine isn't executed. in the lab i use an old pentium 2 400 with
intel 440bx chipset and it doesn't work.
i have also tried in pc with sis and nvidia chipset and in all of them i
have the same problem. Are the uart registers in all motherboards in the
same addresses or this changes through manufacturer?

thanks

Posted by Tauno Voipio on January 19th, 2006


gxatzipavlis wrote:
I assume that you do register the interrupts to
the kernel correctly.

There are four common address bases for serial chips in PC:

- 0x2e8
- 0x2f8
- 0x3e8
- 0x3f8

The commonly used interrupts are 3 and 4.

For PCI-based interfaces you have to read the addresses
from the PCi configuration space. To have a look:

cat /proc/pci

HTH

--

Tauno Voipio
tauno voipio (at) iki fi


Posted by gxatzipavlis on January 19th, 2006


On Thu, 19 Jan 2006 17:26:38 +0000, Tauno Voipio wrote:


i do all the necessery work. the fact is that it works in my pc so i
register interrupts. i use the 03f8/4 io_base/irq combination. I have
tried with serial support on and off from kernel and it works so my driver
doesn't infect the kernel if it has serial support.



static int driver_init_module(void){
...
request_region(eib_io, BYTE , eib_dev);
//eib_io=0x03f8 BYTE=8 eib_dev=eib0
//eib_irq=4
retval = request_irq(eib_irq,interrupt_handler,SA_INTERRUPT ,eib_dev,NULL);
if(retval) {
release_region(eib_io, BYTE);
return retval;
}
//eib_major=61 experimental eib_node=/dev/eib0
retval = register_chrdev( eib_major , eib_node , &eib_fops );
if(retval<0) {
release_region( eib_io, BYTE );
free_irq(eib_irq, NULL);
return retval;
}
init_serial();
...
}

static void init_serial(void){
outb( UART_LCR_DLAB , eib_io + UART_LCR ); //set d_lab
outb(0X06,eib_io+UART_DLL);
outb(0X00,eib_io+UART_DLM); //set_baud 19200
outb( 0x00 , eib_io + UART_LCR ); //unset dlab

outb(UART_LCR_WLEN8|UART_LCR_PARITY|UART_LCR_EPAR, eib_io+UART_LCR);
//set 8E1 for the communication

outb( UART_IER_RLSI | UART_IER_RDI | UART_IER_THRI , eib_io+UART_IER);
//set receive and transmit interrupts

outb( 0x00 ,eib_io+UART_FCR );
//no fifo

//printk(KERN_INFO"%d %d\n",inb(eib_io+UART_IIR),inb(eib_io+UART_IIR));
}

if i insmod the module the interrupt is registered and can be seen from
the proc file system

in my PC after init_serial() executed, the uart transmiter has no data, so
it generates an interrupt. ISR routine is then executed and continue...

in other pc after init_serial() executed the ISR routine isn't executed
for the very simple reason that the uart hasn't interrupt the cpu. if i
printk the UART_IIR register 2 times (in comments) i get 2 1 which means
that the first time interrupt was pending and in the first time that no
interrupt is pending.So i guess that uart has send the interrupt but the
cpu hasn't been interrupted...

any ideas?

Posted by Tauno Voipio on January 19th, 2006


gxatzipavlis wrote:
Good ...

I'd next try the 0x2f8 / 3 combination.

--

Tauno Voipio
tauno voipio (at) iki fi

Posted by Wil Taphoorn on January 19th, 2006


gxatzipavlis wrote:

You didn't forget to set OUT2 in the MCR register? (that is used to
gate the IRQ line on standard PC platforms)

--
Wil

Posted by Alfie on January 19th, 2006




Have you turned on the OUT2 line on the UART? In PC architecture this
is used as a gate for the UART interrupt sources. It's bit 3 of the
Modem Control Register.

There are a few chipsets that don't honour this scheme - but I think
most do.

Regards.


Posted by gxatzipavlis on January 20th, 2006


On Thu, 19 Jan 2006 23:44:38 +0000, Alfie wrote:

my friend u save me!!!!!!!!!!!!!!!!!!

i spend 1,5 month in that stupid think!!!
another time i should read the specs with more attention
by the way do u know in what i/o chips the out2 works and in what it don't?


Similar Posts