Introdução

- Este trabalho tem como objetivo utilizar a plataforma PicoBlaze da Xilinx
como uma interface para a leitura dos dados de um mouse ps/2.



Design

- Estrutura Lógica
A estrutura é formada por duas descrisões de dispositivos, mouse, displays de 7 segmentos e
mais a saída para os leds que serão "colados" pela estrutura PicoBlaze resultando no seginte
esquema de hardware virtual:



Cada um dos dispositivos da placa Pegasus está conectado aos pinos do processador.
Para acessá-los dentro do hardware virtual, é necessário declarar estas ligações
com o hardware físico (displays, ps/2, leds)



Essas declarações são feitas dentro dos arquivos pegasuspicoblaze.ucf.

Após termos criado o hardware virtual, a aplicação (em linguagem assembly) é compilada
e carregada.



Mouse PS/2

"The standard PS/2 mouse supports the following inputs: X (right/left) movement,
Y (up/down) movement, left button, middle button, and right button. The mouse reads
these inputs at a regular freqency and updates various counters and flags to reflect
movement and button states. There are many PS/2 pointing devices that have additional
inputs and may report data differently than described in this document. One popular
extension I cover later in this document is the Microsoft Intellimouse, which includes
support for the standard inputs as well as a scrolling wheel and two additional buttons.
The standard mouse has two counters that keep track of movement: the X-movement counter
and the Y-movement counter. These are 9-bit 2's complement values and each has
an associated overflow flag. Their contents, along with the state of the three mouse
buttons, are sent to the host in the form of a 3-byte movement data packet
(as described in the next section.) The movement counters represent the amount of movement
that has occurred since the last movment data packet was sent to complexothe host.
When the mouse reads its inputs, it records the current state of its buttons, then checks
for movement. If movement has occurred, it increments (for +X or +Y movement) or decrements
(for -X or -Y movement) its X and/or Y movement counters. If either of the counters has overflowed,
it sets the appropriate overflow flag.

The parameter that determines the amount by which the movement counters are incremented/decremented
is the resolution. The default resolution is 4 counts/mm and the host may change that value using
the "Set Resolution" (0xE8) command.
The standard PS/2 mouse sends movement (and button) information to the host using the following 3-byte packet:


Byte 1 
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Y overflow
X overflow
Y sign bit
X sign bit
Always 1
Middle Btn
Right Btn
Left Btn
Byte 2
X Movement
Byte 3 
Y Movement

The movement counters are 9-bit 2's complement integers, where the most significant bit appears
as a sign bit in Byte 1 of the movement data packet. These counters are updated when the mouse
reads its input and finds movement has occurred. Their value is the amount of movement that has
occurred since the last movement data packet was sent to the host (ie, after a packet is sent to
the host, the movement counters are reset.) The range of values that can be expressed by the
movement counters is -255 to +255. If this range is exceeded, the appropriate overflow bit is
set and the counter is not incremented/decremented until it is reset.
As I mentioned earlier, the movement counters are reset whenever a movement data packet is successfully
sent to the host. They are also reset after the mouse receives any command from the host other than the
"Resend" (0xFE) command. [PS2MOUSE] ."

Módulos


O modulo do mouse ps/2 necessita de uma conexao de entrada/saída direta com os pinos Data(ps2d) e Clock(ps2c)
da porta ps/2. Na placa Pegasus, estes pinos da ps/2 podem ser acessados pelos pinos 34 e 35 do processador.
Alem desta conexao externa, o modulo necessita de um pulso de clock de 25 Mhz para sincronizar a conexão com o
dispositivo conectado na porta PS/2.

Este módulo tem como entrada um sinal de Reset e 4 sinais de saida: Left Button, Right Button, X axis e Y axis.
O sinal Reset faz com que o equipamento envie o comando de reset para o equipamento. Left Button e Right
Button retornam um sinal de 1 bit informando se os respectivos botões do mouse estão pressionados. X axis e
Y axis retornam cada um 8 bits informando a posição que se encontra o ponteiro do mouse.

Já o módulo 7 segments é mais simples e apenas mapeia para os segmentos a,b,c,d,e,f e g, os valores hexadecimais que irão representar. A entrada an determina qual dos display serao atualizados.

Os módulos utilizados nesta aplicação podem ser reutilizados em outra aplicação que necessite de uma interface com o mouse.

Aplicação


Para que fosse possível utilizar uma aplicação foi necessário fazer a definição de portas de I/O.
Foram definidas 4 portas: F0 para reset e botão esquerdo do mouse *, F1 para botão direito, F2 para valores do eixo X e F4 para valores do eixo Y,
Uma aplicação foi criada para testar o hardware.

Esta aplicação foi escrita em linguagem assembly e faz acesso a portas de I/O definidas no hardware para fazer a leitura
dos dados vindos do mouse, como segue:


        ;definição das portas e variáveis
        CONSTANT MOUSE_RESET, F0

        CONSTANT MOUSE_BTN_LEFT, F0
        CONSTANT MOUSE_BTN_RIGHT, F1
        CONSTANT MOUSE_Y        , F2
        CONSTANT MOUSE_X        , F4

        CONSTANT PORTA_NUMERICO0, 00
        CONSTANT PORTA_NUMERICO1, 01
        CONSTANT PORTA_NUMERICO2, 02
        CONSTANT PORTA_NUMERICO3, 03

        CONSTANT PORTA_LEDS, A0
        CONSTANT PORTA_BTNS, FF

loop:
       ;reset
       INPUT   s0, PORTA_BTNS
       ADD       s0, 00
       JUMP      Z, noreset

       LOAD      s0, 01
       OUTPUT  s0, MOUSE_RESET

noreset:
        ; após o reset 

	;leia X e escreva nos anodos 2 e 3 
        INPUT   s0, MOUSE_X

        OUTPUT  s0, PORTA_NUMERICO2
        SR0     s0
        SR0     s0
        SR0     s0
        SR0     s0
        OUTPUT  s0 , PORTA_NUMERICO3

	;leia Y e escreve nos anodos 0 e 1
        INPUT   s0, MOUSE_Y
        OUTPUT  s0, PORTA_NUMERICO0
        SR0     s0
        SR0     s0
        SR0     s0
        SR0     s0
        OUTPUT  s0 , PORTA_NUMERICO1

	; leia botoes do mouse e escreva nos leds
	
	;leia botao 1 e escreva no led 0
        LOAD    s1, 00
        INPUT   s1, MOUSE_BTN_LEFT
        SL0     s1

	;leia botao 2 e escreva no led 1
        INPUT   s2, MOUSE_BTN_RIGHT
        OR      s1, s2
;       AND       s1, 03
        OUTPUT  s1, PORTA_LEDS

        JUMP loop


      


* A porta F0 foi definida como porta de leitura e escrita, sendo possível utilizá-la
para reset e leitura do botão .

Resultados


A leitura dos eixos X e Y funcionou adequadamente. Inicialmente ocorreu problemas com o programa gerado. Porém, ao utilizar uma outra plataforma em um novo computador, estes problemas desaparaceram.
Ao serem precionados os botões do mouse, acende-se os leds 0 e 1 para os botões direito e esquerdo respectivamente.Quando se movimenta o mouse, as coordenadas do X, que é mapeado para os displays 2 e 3 ( os 2 da esquerda ), são mostrados nos display, e as coordenadas do Y, que é mapeado para os displays 0 e 1 ( os 2 da direita ).

Conclusão

O uso da plataforma Pegasus possibilita a prototipação de componentes de hardware de maneira amigável. O uso de módulos permite que partes já prontas sejam agregadas ao projeto, aumentando a produtividade de desenvolvimento.

Apesar de uma aparência simples, o mouse possiu um protocolo de comunicação complexo. Se comparado ao utilizado pelo teclado, o mouse utiliza 3 bytes de dados enquanto o teclado apenas 1. Mouses de fabricantes diferentes utilizam protocolos diferenciados.

Um dos maiores problemas enfrentados foi a falta de documentação sobre a definição do hardware. Foi utilizado como fonte de conhecimento somente a análise de códigos já existentes. Outro grande problema foi a falha em algum dos equipamentos utilizados. Nao foi detectado qual destes falhou mas quando utilizado um novo ambiente, todas as operações funcionaram como o esperado.

Em um futuro trabalho, poderia-se reimplementar o drive do mouse e estendê-lo a outros protocolos(Logitech, WheelMouse, Intelimouse) de mouses. Atualmente seu uso se limita a mouses compatíveis com o padrão Microsoft.

Fontes

Fontes do trabalho

Referências


[PS2MOUSE] PS/2 Mouse Interfacing, Adam Chapweske . Última visita em 04 de Julho de 2004.
Disponível em http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/mouse/mouse.html