Mouse Input: Difference between revisions
[unchecked revision] | [unchecked revision] |
Content deleted Content added
→External Links: IBM doc |
m fixed typo |
||
(25 intermediate revisions by 15 users not shown) | |||
Line 1:
==PC Mouse Interfaces==
Current PCs generally use PS2 mice, or a similar format that emulates a PS2 mouse. Serial mice are a much
older technology that is no longer common.
===USB Mouse===
A USB mouse generally emulates a PS2 mouse, except that it generates IRQs from the USB bus, and not IRQ 12. Good idea is to also select the checkbox "enable mouse capture". "Mouse toggle method" enables you to choose from a list hotkey to switch between mouse capture enabled or disabled.
===Bochs===
If you use bochs, and want your mouse to emulate PS2 mouse, you need to edit keyboard & mouse settings and set mouse type to either "ps2" (this is the mouse without mouse wheel button) or "imps2" (this is the mouse with mouse wheel button).
===PS2 Mouse -- Basic Operation (Microsoft compliant)===
Once a mouse has been initialized (see below), a mouse sends 3 or 4 byte packets to communicate mouse
movement, and mouse button press/release events. These packets show up asynchronously as data on IO port 0x60.
Line 21:
which is which. To tell if there is any available data on port 0x60 at all, it is necessary
to read a byte from port 0x64. In that byte from port 0x64, bit number 0 (value=1) indicates that a byte is
available to be read on port 0x60. An additional bit, bit number 5 (value=0x20 or 0b00100000), indicates that this next byte
came from the mouse, if the bit is set. If you look at [[RBIL]], it says that this "mouse bit" is MCA specific,
but this is no longer true. All PCs that support PS2 mice use this bit to indicate that the incoming byte was
generated by the auxiliary PS2 input port.
==== PS2 Mouse Subtypes====
There are several types of mice, but they can be separated into two groups, depending on whether they have a scroll wheel.
Mice with scroll wheels can send an additional byte in each mouse packet,
indicating the status of mouse wheels and extra buttons.
Mice with no scroll wheels use 3 byte packets exclusively. Mice with scroll
5 buttons (currently) can send 4 byte packets, if they are initialized properly.
====Mouse Packet Info====
For even greater detail on Microsoft compliant PS2 mouse packets than what is presented next: reference the links below,
or search for the Adam Chapweske article. For mice that are not MS-compliant, see the Linux article.
=====Timing/Generation of Mouse Packets=====
A mouse is usually initialized to
per second
or released. If the mouse is not moving
packets.
Line 49 ⟶ 50:
for deltaX and deltaY are one or two for slow movement, and perhaps 20 for very fast movement. Maximum possible
values are +255 to -256 (they are 9-bit quantities, two's complement).
<br>
<br>
byte 1:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Y overflow
! X overflow
! Y sign bit
! X sign bit
! Always 1
! Middle Btn
! Right Btn
! Left Btn
|}
<br>
byte 2:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! X movement
|}
<br>
byte 3:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Y movement
|}
The top two bits of the first byte (values 0x80 and 0x40) supposedly show Y and X overflows, respectively. They
Line 68 ⟶ 92:
=====Formats of Optional 4th Packet Byte=====
If the mouse has been initalized so that its mouseID is 3 or 4, it will send a 4th byte in each packet. On all current
mice, the top two bits should be ignored. On some mice, the bits will flip between 0 and 1, based on scroll
movement. If the mouse has a 4th and 5th mouse button, then their state is indicated by bit 4 (value=0x10), and bit
5 (value=0x20), respectively. Note: if the buttons <i>do not</i> exist, then these bits may flip based on scroll
Line 74 ⟶ 98:
do not exist.)
* 0 -- no scroll wheel movement
* 1 -- vertical scroll up one click
Line 80 ⟶ 104:
* 2 -- horizontal scroll right one click
* 0xE -- horizontal scroll left one click
When only the vertical scrollwheel exists or has been activated, the 4th packet byte simply contains:
<br>
byte 4:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Z movement
|}
However, if the mouse has extra buttons and gets initialized properly, then it will look like this:
<br>
byte 4:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Mostly 0
! Mostly 0
! 5th btn down (pressed)
! 4th btn down (pressed)
! Z3
! Z2
! Z1
! Z0
|}
Where Z0 though Z3 is a 4 bit signed value of the Z movement (scrollwheel), with the values mentioned above (0, 1, 2, 0xE, 0xF)
and with the meanings listed above.
====Non-Linear Movement====
When a user is trying to point at something on a screen, they will quickly move the mouse in the general direction
of the target, and then slow down to accurately point at it. The deltaX/Y values from the mouse packets
can be used directly, but doing that will force the user to move the mouse very far to get the cursor from one area of the
screen to another.
A better answer may be to scale the mouse movement by additional multiples, based on how fast the mouse is moving.
If the mouse is moving slowly, the scale factor can be 1 -- to allow the highest possible sensitivity. When the mouse
is (or has been) moving fast, the scale factor could be 5 or 10, to allow the cursor to move across large distances on
the screen
There are many ways to do such scaling, obviously. If you are coding the driver in assembler, one suggestion might
be to use the BSR command to generate an approximate log base2 of deltaX
====Doubleclicks====
Line 102 ⟶ 149:
====Timeouts/Mouse Disconnect====
If a mouse is operating normally
it will also not send any packets. If you want to support "hot plugging" of PS2 mice, then you
become disconnected, because you will need to reinitialize it. If you have not seen any packets from the mouse for awhile,
a mouse packet (with everything set to 0, probably). Please note that you need to make sure that the 0xFA does not
cause a misalignment of your input mouse packet. Also please note that if the contents of the mouse packet are <i>not</i> 0,
Line 115 ⟶ 162:
===PS2 Mouse Commands===
After the PS2 Aux port has been enabled, you can send commands to the mouse. It is recommended to disable automatic packet
streaming mode while "reprogramming" the mouse. You can do this by either sending command 0xF5 to the mouse, or disabling
the "master mouse clock" by setting bit 5 of the Compaq Status byte (see below).
====Waiting to Send Bytes to Port 0x60 and 0x64====
All output to port 0x60 or 0x64 must be preceded by waiting for bit 1 (value=2) of port 0x64 to become clear. Similarly,
bytes cannot be read from port 0x60 until bit 0 (value=1) of port 0x64 is set. See [[PS2 Keyboard]] for further details.
====
waits on port 0x64, bit 1, before sending each output byte). Note: this 0xD4 byte does <i>not</i> generate any ACK, from
either the keyboard or mouse.
====Wait for ACK from Mouse====
It is required to wait until the mouse sends back
data byte, and both bytes will generate an ACK.
====
*Note:
*Note2: the commands given in the table are sent to port 0x60. If a command needs additional byte (like sampling rate), this byte goes to port 0x60 too.
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Hex value
! Meaning
! Description
|-
! 0xFF
! Reset
! The mouse probably sends ACK (0xFA) plus several more bytes, then resets itself, and always sends 0xAA.
|-
! 0xFE
! Resend
! This command makes the mouse send its most recent packet to the host again.
|-
! 0xF6
! Set Defaults
! Disables streaming, sets the packet rate to 100 per second, and resolution to 4 pixels per mm.
|-
! 0xF5
! Disable Packet Streaming
! The mouse stops sending automatic packets.
|-
! 0xF4
! Enable Packet Streaming
! The mouse starts sending automatic packets when the mouse moves or is clicked.
|-
! 0xF3
! Set Sample Rate
! Requires an additional data byte: automatic packets per second (see below for legal values).
|-
! 0xF2
! Get MouseID
! The mouse sends sends its current "ID", which may change with mouse initialization.
|-
! 0xEB
! Request Single Packet
! The mouse sends ACK, followed by a complete mouse packet with current data.
|-
! 0xE9
! Status Request
! The mouse sends ACK, then 3 status bytes. See below for the status byte format.
|-
! 0xE8
! Set Resolution
! Requires an additional data byte: pixels per millimeter resolution (value 0 to 3)
|}
====Additional Useless Mouse Commands====
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Hex value
! Meaning
! Description
|-
! 0xF0
! Set Remote Mode
! The mouse sends ACK (0xFA) and then reset its movement counters, and enters remote mode
|-
! 0xEE
! Set Wrap Mode
! The mouse sends ACK (0xFA) and then reset its movement counters, and enters wrap mode
|-
! 0xEC
! Reset Wrap Mode
! The mouse sends ACK, and then enters the last mode, before entering wrap mode, it also resets its movement counters
|-
! 0xEA
! Set Stream Mode
! The mouse sends ACK (0xFA) and then reset its movement counters, and enters reporting mode
|-
! 0xE7
! Set Scaling 2:1
! The mouse sends ACK and sets non-linear scaling "2:1"
|-
! 0xE6
! Set Scaling 1:1
! The mouse sends ACK and sets normal linear scaling "1:1"
|}
<br>
The status bytes look like this:
<br>
Byte 1:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Always 0
! mode
! enable
! scaling
! Always 0
! left btn
! middle
! right btn
|}
Byte 2:
{| border="1" cellspacing="0" cellpadding="5" align="center"
!resolution
|}
Byte 3:
{| border="1" cellspacing="0" cellpadding="5" align="center"
!sample rate
|}<br>
Mode: if it is 1, the current mode is remote mode; if 0 then it is stream mode <br>
Enable: if it is 1, then data reporting is enabled; if 0 then data reporting is disabled<br>
Scaling: if it is 1, scaling 2:1 is enabled; if 0 then scaling 1:1 is enabled.<br>
=====Resolution, Scaling and Sample Rate=====
Definitions:
*Resolution: DeltaX or DeltaY for each millimeter of mouse movement.
*Scaling: Apply a simple non-linear distortion to mouse movement (see Non-Linear Movement, above).
*Sampling Rate: Packets the mouse can send per second.
Resolution:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! value
! resolution
|-
!0x00
!1 count /mm
|-
!0x01
!2 count /mm
|-
!0x02
!4 count /mm
|-
!0x03
!8 count /mm
|}
<br>
Scaling can either be "1:1" (linear = no scaling) or "2:1" (non-linear). This is the non-linear scaling:
{| border="1" cellspacing="0" cellpadding="5" align="center"
! Movement Counter
! Reported Movement
|-
!0
!0
|-
!1
!1
|-
!2
!1
|-
!3
!3
|-
!4
!6
|-
!5
!9
|-
!more than 5
!2 * Movement Counter
|}
Sample Rate can have the following values: (all values are Decimal, NOT hex)<br>
{| border="1" cellspacing="0" cellpadding="5" align="center"
! value
! Samples pr second
|-
!10
!10
|-
!20
!20
|-
!40
!40
|-
!60
!60
|-
!80
!80
|-
!100
!100
|-
!200
!200
|}
*Note: human eyes don't see movement faster than 30 samples per second, and human fingers cannot click a button
that fast either. A sample rate lower than 30 will cause visibly jerky mouse movement, and may miss mousedown events.
A sample rate significantly higher than 30 will waste precious I/O bus bandwidth. You may test these things for
yourself, but sample rates of 10, 20, 100, or 200 are generally not recommended.
===Initializing a PS2 Mouse===
The PS2 mouse port on a PC is attached to the auxiliary input of the PS2 keyboard controller. That input
might be disabled at bootup, and needs to be enabled. It is usually also desirable to have the mouse generate
Line 151 ⟶ 382:
====PS/2 Device Unplugging/Hot Plugging====
while the computer remains turned on ("hot plugging"). A long time ago, some other
be slightly damaged if PS2 hot plugging occurs. However, mice and keyboards have cords that were made to be tripped over,
and sometimes it is very logical to try moving a mouse from one machine to another, temporarily, without powering
When a mouse is plugged into a running system
=====Set Compaq Status/Enable IRQ12=====
Line 175 ⟶ 402:
=====Aux Input Enable Command=====
Send the Enable Auxiliary Device command (0xA8) to port 0x64. This will generate an ACK response from the <i>keyboard</i>,
which you must wait to receive. Please note that using this command is not necessary if
successful -- but it does no harm, either.
====Mouse State at Power-on====
Line 181 ⟶ 409:
the following default state:
* packets disabled
* emulate 3 button mouse (buttons 4, 5, and scroll wheels disabled)
Line 191 ⟶ 418:
During initialization, a mouse indicates that it has various features (a scroll wheel, a 4th and 5th mouse
button) by changing its mouseID in response to initialization commands. So you send a set of mouse commands,
and then ask for the mouseID byte
the ACK for the Read MouseID command. At initialization, the mouseID is always 0. Other current legal values are
3 and 4.
====Init/Detection Command Sequences====
If you would like more than just 3 buttons, you will have to use the following sequence(s).
If the first sequence is accepted: the number of bytes in the mouse packets changes to 4, the scroll wheel on the
mouse becomes activated, and the mouseID changes from 0 to 3.
The first magic sequence goes like this:
* set sample rate to 200
* set sample rate to 100
* set sample rate to 80
* get the new id to verify acceptance
<br>
<b>After using the above sequence to activate the scroll wheel</b>, the 4th and 5th mouse buttons can be activated
with the following additional magic sequence:
* set sample rate to 200
* set sample rate to 200
* set sample rate to 80
* get the new id to verify acceptance
<br>
If this second sequence is accepted, the returned mouse ID value changes from 3 to 4.
====Enable Packets====
After the mouse has been initialized to
its Resolution is probably 4 pixels/mm, and packets are still disabled. You may want to modify the Samplerate
and Resolution, and then
====Streaming Advantages and Disadvantages====
Instead of enabling automatic streaming packet mode, it is possible to request mouse packets one at a time. Doing this
has some advantages over streaming packet mode. You may see that you need to send or receive at least 4
extra bytes over the I/O bus in order to get each 0xEB command to the mouse, and the I/O bus is very slow. On the other
hand, a typical streaming mode probably sends hundreds more mouse packet bytes over the I/O bus than you need, every second
-- so if there is a disadvantage, it is probably small.
One of the biggest problems with streaming mode is "alignment" -- the packets were never defined to have an obvious boundary.
This means that it is very easy to lose track of which mouse byte is supposed to be the first byte of the next packet.
This problem is completely avoided if you specifically request single packets (instead of using streaming mode) because
every packet begins with an ACK (0xFA), which is easily recognizable.
===PC Serial Mouse===
For info on running a serial mouse on an RS232 port, see [http://freedos-32.sourceforge.net/showdoc.php?page=sermouse this document from the freedos documentation].
==Mac Mouse Interface==
{{Stub}}
==See Also==
===Threads===
* [
* [[topic:24277|Mouse driver code in assembly]]
* [
* [[topic:6942|PS2 mouse links]]
===External Links===
* [http://os-development.000webhostapp.com/mys.html Tutorial on page os-development]
* [https://www.avrfreaks.net/sites/default/files/PS2%20Keyboard.pdf Adam Chapweske on PS/2 Mouse and Keyboard protocols]
* [http://www.win.tue.nl/~aeb/linux/kbd/scancodes-13.html Linux PS2 mouse article with non-Microsoft mouse info]
* [http://houbysoft.
* [http://www.mcamafia.de/pdf/ibm_hitrc07.pdf IBM's Keyboard and Auxiliary Device (mouse) Controller documentation]
[[Category:Human Interface Device]]
[[de:PS/2-Maus]]
|