8
2. Device Configuration
During this time the host will
set the standard PS/2
parameters such as scaling,
resolution, stream mode, and
eventually enabling stream
mode for data reports. For a
list of the valid PS/2
commands that this mouse
recognizes see Appendix G.
3. Wheel Enable (optional)
Since the wheel is not part of
the standard PS/2
specification, there is a
sequence of commands that
enable the wheel. Wheel-
aware drivers, such as those
for Microsoft and Linux
operating systems will initiate
this special sequence.
After the following sequence
of commands, the wheel
report format is enabled.
0xF3, 0xC8 Set Sampling
Rate 200 per second
0xF3, 0x64 Set Sampling Rate
100 per second
0xF3, 0x32 Set Sampling Rate
50 per second
0xF2, 0x03 Read Device Type
returns a value of 0x03
After the Read Device Type
command returns 0x03 to
indicate that this is a
Microsoft compatible three
button wheel mouse, the
wheel report format is
enabled. See Appendix G for
information on PS/2 standard
and wheel reporting formats.
4. Post Start Up Operation
After the streaming mode is
set and data reports are
enabled, the mouse will send
button, movement, and
optionally wheel reports back
to the host. Whenever the
mouse has new data to send
it will initiate a transfer to
the host.
USB Firmware Description
A function call map for USB
operation is shown in Figure 6.
The following are descriptions
of the functions in
adns-
6000.asm.
Dual USB and PS2 Functions
GetMouseType
– called in
dualMain
when the mouse is
first plugged into the PC. This
routine returns the interface of
the mouse. The following
sequences are performed by the
microcontroller to determine the
mouse type. Delay 50mS.
Initialize the PS2 BAT delay
counter. For a period of 2ms,
poll the SCLK and SDATA lines
every 10us. If we get 4 samples
in a row with non-zero data on
either line, detect a PS2
interface. If 2mS expires, enable
the USB pull up resistor and
delay 500uS. Poll the SCLK and
SDATA lines indefinitely until a
non-zero condition exists on
either line. During this polling
period, we begin to count down
the PS2 BAT delay. If SCLK(D+)
is sampled high, detect a PS2
interface. If SDATA(D-) sampled
high, disable the USB connect
resistor and Delay 100uS. If D+
and D- are both 0, detect a
USB interface, else detect a PS2
interface.
SPIInit
– This routine is called
in the
try_download
to enable
the SPI interface. The
CY7C63743-PXC is always
configured as a Master to drive
the serial clock on P0.7. The
clock is set to HIGH in idle
state, and the SCLK frequency
is set to send a bit rate of
1Mbit/s.
SensorReset
– This routine
resets the serial interface and
the ADND-6000 internal
registers by generating a pulse
on the RESET pin.
LoadSROM -
called in
try_download
after the
initialization of the SPI
interface. This routine is used
to load the SROM (Shadow
ROM) firmware into the ADNS-
6000 optical sensor. It should
be called after
SensorReset
.
AdjustLASER -
called to
calibrate the laser to the
required 506uW. This will
ensure that the LASER meets
Class 1 eye safety. Customer
must ensure that the correct
LP_CFG0 and LP_CFG1 register
values are written into the
registers for proper LASER
operation.
ProcessButtons
– This routine
is called within the infinite
usbTaskLoop
and
ps2TaskLoop
loops. The state of the buttons
are updated every one ms in
the
Dual1msTimer
Interrupt
Service Routine (ISR). This
routine compares the current
state of the buttons with their
last state to detect any changes
in the status. If the status
change of the buttons remains
until the expiration of debounce
timer (15ms), the new button
state is confirmed. This routine
will record the new button state
in the
[buttonValue]
variable
which will be reported to the
host in the main loop.
ReadProcessOptics
– This
routine returns any updates in
the X, Y and Z-wheel motion
information. The motion of the
Z-wheel is detected using the
traditional method by decoding
the quadrature signal generated
by the phototransistors. The X
and Y directions of the
movement are obtained by
calling the
ReadDeltaX
and
ReadDeltaY
routines. The X, Y,
and Z-wheel movement is
stored in the
[xCount],
[yCount],
and
[zCount]
variables
which will be sent to the host
in the main routine.