Page 1 of 1

Serial Mouse Problem...

Posted: Sat Oct 23, 2004 11:00 pm
by ComputerPsi
Hello. I tried to create an interrupt handler for a serial mouse, but it doesn't seem to work correctly. Here is the code of the handler:

Code: Select all

INT_0xC:		;COM1 (Serial Mouse) Interrupt Called.
	sti

	push dx
	push ax
	push si

	push cs
	pop ds

	mov	si, mouse
	call	Print_String	;Write a "M"

	mov al,0x20	;Make the interrupt vector happy, and
	out 0x20,al	;tell it this interrupt is done with its job ;-)

	pop si
	pop ax
	pop dx

	IRET
As you can see, it only writes a "M" on the screen, when the interrupt is called. (Not really a driver).

Here is the initialization code for the serial:

Code: Select all

mouse2:

		mov	si,0x3f8

		mov	dx,si		;SET DLAB ON
		add	dx,3
		mov	al,0x80
		out	dx,al
		nop

		mov	dx,si		;set Baud rate (low)
		mov	al,0x60
		out	dx,al
		nop
					;/* Default 0x03 =  38,400 BPS */
					;/*         0x01 = 115,200 BPS */
					;/*         0x02 =  57,600 BPS */
					;/*         0x06 =  19,200 BPS */
					;/*         0x0C =   9,600 BPS */
					;/*         0x18 =   4,800 BPS */
					;/*         0x30 =   2,400 BPS */
					;/*         0x60 =   1,200 BPS */

		mov	dx,si		;set Baud rate (high)
		inc	dx
		mov	al,0
		out	dx,al
		nop

		mov	dx,si		;8 Bits, No Parity, 1 Stop Bit
		add	dx,3
		mov	al,0x3
		out	dx,al
		nop

		mov	dx,si		;FIFO Control Register
		add	dx,4
		mov	al,0xb
		out	dx,al
		nop

		mov	dx,si		;Turn on DTR, RTS, and OUT2
		add	dx,2
		mov	al,0xc7
		out	dx,al
		nop

		mov	dx,si		;Interrupt when data received
		inc	dx
		mov	al,1
		out	dx,al
		nop
For some reason, when I run the code, the interrupt is only called once, when the computer boots up. If I move the mouse, or click, it doesn't call the interrupt. Does anybody know what is the problem? The serial mouse is on COM1 (int C-IRQ4).

Re: Serial Mouse Problem...

Posted: Sun Oct 24, 2004 11:00 pm
by slasher
Have you tried sending 0x20 to the slave pic as well?

mov al,0x20
out 0xa0,al

Re: Serial Mouse Problem...

Posted: Tue Oct 26, 2004 11:00 pm
by ComputerPsi
Why would you do that if you are not using the slave pic??

Re: Serial Mouse Problem...

Posted: Wed Oct 27, 2004 11:00 pm
by Anton
I thinkthat you need to read the mouse data(from ports), or else the mouse will not know that you are able to receive more data.(It's buffers are overfull)

Re: Serial Mouse Problem...

Posted: Wed Oct 27, 2004 11:00 pm
by Daidalos
Anton wrote:I thinkthat you need to read the mouse data(from ports), or else the mouse will not know that you are able to receive more data.(It's buffers are overfull)
Exactly. You've informed the PIC that you're done handling the interrupt, but you haven't informed the serial chip. The serial chip isn't going to send you any more interrupts until you handle the first one.

Re: Serial Mouse Problem...

Posted: Thu Oct 28, 2004 11:00 pm
by ComputerPsi
OK.. I fixed it by using this code:

Code: Select all

INT_0xC:		;COM1 (Serial Mouse) Interrupt Called.

	pusha		;backup everything

	push cs
	pop ds

        mov dx,3fdh			;line status register.
        in al,dx
	sub dx,5
;	test al,2
;	jz @nooverrun		; jump if no overrun occured
;
;	in al,dx			; else flush receive buffer,
;	jmp @exitIRQh		;  and exit

;@nooverrun:
        in al,dx			;Receive the incoming byte.

	mov si, msgmouse
	call print_string	;Write a "M"

	mov al,0x20	;Make the interrupt vector happy, and
	out 0x20,al	;tell it this interrupt is done with its job ;-)

@exitIRQh:
	popa		;Put back everything how it was.
	IRET
When I run this, then when I move the mouse, "M" appears. The problem is that the mouse keeps sending the message non-stop.
If I uncomment the commented lines, then the M never gets shown, which probably means that the sent message is overrun. Does anybody know how to fix this?

Re: Serial Mouse Problem...

Posted: Thu Oct 28, 2004 11:00 pm
by Anton
First of all the last lines of code
mov si, msgmouse
call print_string ;Write a "M"

mov al,0x20 ;Make the interrupt vector happy, and
out 0x20,al ;tell it this interrupt is done with its job ;-)

@exitIRQh:
popa ;Put back everything how it was.
IRET

should look like this(you forgot to do mov al,0x20 out 0x20,al in case of a overrun!)
mov si, msgmouse
call print_string ;Write a "M"

@exitIRQh:
mov al,0x20 ;Make the interrupt vector happy, and
out 0x20,al ;tell it this interrupt is done with its job ;-)

popa ;Put back everything how it was.
IRET


Anton.

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by ComputerPsi
Thanks for the response, I didn't see that error. When I fixed it, M still appears when a message is sent, with the uncommented lines. But... the original problem still continues.... when I move the mouse, "M" gets drawn on the screen, but it keeps on getting drawn, non-stop. Does anybody know what is the problem?

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by ComputerPsi
OK, I found out that there seems to be some type of "Framing Error" from LSR line status. I'm not sure what that is.. I'm trying to figure it out right now... Does anybody know what this is?

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by ComputerPsi
OK, thanks everybody. I understood what was wrong. As soon as the mouse started sending messages, it continued to send them, even if the mouse was not moving. This happens to be a normal behavior. "Framing Error" was something completely different, that I made a mistake on. *Starts writing mouse driver*

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by smiddy
Out of curiosity what information is the mouse sending?

Does it continue to tell that it hasn't moved? Perhaps you can change your printing of the 'M' only when ther is movement or a button press or wheel movement? But then you'd almost have a complete driver,eh? ;-)

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by ComputerPsi
Actually, any time the mouse gets moved or clicked. A message sent, from a Logitech mouse is a 5 byte message, containing the button information (3 buttons), and x,y positions, between the first time and the second time it was moved. If it is from a microsoft mouse, 3 bytes are send, with similar information, just with only 2 buttons. I actually almost have a driver... but there is a long time to finishing it. I still have to write some code that would detect a mouse on COM2, COM3, COM4, PS/2, and BUS.... But, I'll only do that, when I already have a decent OS, that needs to support such features.

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by Anton
ComputerPsi wrote:As soon as the mouse started sending messages, it continued to send them, even if the mouse was not moving. This happens to be a normal behavior.
It is not. The mouse is not supposed to be sending any information unless you move it.
Do you know what FIFO is?(You seem to be using it) I think that FIFO is for modem connections and not for the mouse.(And that's what making these interrupts since it can't wakeup the DMA(you are supposed to use it, if you use FIFO))

Re: Serial Mouse Problem...

Posted: Fri Oct 29, 2004 11:00 pm
by ComputerPsi
Anton, Well, maybe it's not, but everything else is acting normal. When the mouse is not moving, it sends NULL bytes. When it is moving, or sending some message, it is sent. About the FIFO, I originally though it was needed, but after I looked at some other codes, I saw that it can work without FIFO, so I removed that.

Edit:
OK, sorry, my mistake. The mouse only sends messages when it is moved, or clicked.

Re: Serial Mouse Problem...

Posted: Sat Oct 30, 2004 11:00 pm
by Anton
ComputerPsi wrote:The mouse only sends messages when it is moved, or clicked.
Exactly. :) This is the way it should be.