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 |
|
Byte 3 |
|
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