delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/05/13/07:40:51

From: XXguille AT XXiies DOT XXes (Guillermo Rodriguez Garcia)
Newsgroups: comp.os.msdos.djgpp
Subject: Re: înterrupt problem
Date: Thu, 13 May 1999 11:12:28 GMT
Organization: Telefonica Transmision de Datos
Lines: 88
Message-ID: <373c1ba7.3760034@noticias.iies.es>
References: <7hcnbo$j0t$1 AT news DOT dnsg DOT net>
NNTP-Posting-Host: iies196.iies.es
Mime-Version: 1.0
X-Newsreader: Forte Agent 1.5/32.451
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

El día Wed, 12 May 1999 22:11:31 +0200, "Daniel Kadenbach"
<kadenbach DOT h AT primus-online DOT de> escribió:

>Hi all !
>
>I am just trying to program a serial-port-interface (via uart-programming)
>and therefore need to bend the
>irq of the com2 port to my own function, but i don´t get it to work ...

Some ideas:

- Make sure the desired interrupt is enabled in the PIC (programmable
interrupt controller)

- Make sure interrupts are enabled (use enable() for that)

- Make sure you allow UART interrupts by setting the relevant bits of
the appropiate UART register. These are MCR (Modem Control Register)
and IER (Interrupt Enable Register).
 
- In your interrupt handler, acknowledge the interrupt by reading from
the appropiate UART register (for example, if you interrupt was caused
by a change in the MSR, you should read the MSR until less significant
bit of IIR is set).

If you are still stuck, drop me a line and I will post some example
code.

>My code looks like this:
>
> new_handler.pm_offset   = (int)int_uart;
> new_handler.pm_selector = _go32_my_cs();
>  _go32_dpmi_get_protected_mode_interrupt_vector(0xb, &old_handler);
>  _go32_dpmi_allocate_iret_wrapper(&new_handler);
>  _go32_dpmi_set_protected_mode_interrupt_vector(0xb,&new_handler);

Everything is OK here.

>the Interrupt function:
>
>static int int_uart( void )

I would declare an interrupt handler as returning void, not int, but I
guess that this will work as well.

>{
>  asm("cli; pusha");

You don't need this! You allocated an iret_wrapper which will do all
the work of pushing / poping registers and the like. I think you still
need the EOI at the end of your function, but I'm not sure.

Try this:


#define COM_RBR    (COMbase + 0x00)
#define COM_IIR    (COMbase + 0x02)
#define COM_LSR    (COMbase + 0x05)
#define COM_MSR    (COMbase + 0x06)

static void int_uart(void)
{
	/* Acknowledge the interrupt by reading from the
  	 * appropiate UART registers. The following piece
	 * of code acknowledges _all_ possible interrupt
 	 * sources.
	 */
	while ((inportb(COM_IIR) & 0x01) == 0x00)
	{
		inportb(COM_LSR);
		inportb(COM_RBR);
		inportb(COM_MSR);
	}
	
	/* Here goes your code */
	test++;

	/* Issue an EOI to the PIC and exit */
	outportb(0x20, 0x20);
	return;
}


Regards,
GUILLE
----
Guillermo Rodriguez Garcia
XXguille AT XXiies DOT XXes (ya sabes :-)

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019