|
24 | 24 | #include <ghost.h> |
25 | 25 | #include <stdio.h> |
26 | 26 |
|
27 | | -uint8_t mouse_packet_number = 0; |
28 | | -uint8_t mouse_packet_buffer[4]; |
| 27 | +uint8_t mousePacketNumber = 0; |
| 28 | +uint8_t mousePacketBuffer[4]; |
| 29 | +bool intelliMouseMode = false; // 4-byte sequences |
29 | 30 |
|
30 | 31 | g_fd keyIrqIn; |
31 | 32 | g_fd mouseIrqIn; |
32 | 33 |
|
33 | | -uint32_t packets_count = 0; |
| 34 | +uint32_t packetCount = 0; |
34 | 35 |
|
35 | | -void (*registeredMouseCallback)(int16_t, int16_t, uint8_t); |
| 36 | +void (*registeredMouseCallback)(int16_t, int16_t, uint8_t, int8_t); |
36 | 37 | void (*registeredKeyboardCallback)(uint8_t); |
37 | 38 |
|
38 | | -ps2_status_t ps2Initialize(void (*mouseCallback)(int16_t, int16_t, uint8_t), |
| 39 | +void ps2HandlePacket(); |
| 40 | + |
| 41 | +ps2_status_t ps2Initialize(void (*mouseCallback)(int16_t, int16_t, uint8_t, int8_t), |
39 | 42 | void (*keyboardCallback)(uint8_t)) |
40 | 43 | { |
41 | 44 |
|
@@ -113,7 +116,7 @@ void ps2CheckForData() |
113 | 116 | ps2HandleMouseData(value); |
114 | 117 | } |
115 | 118 |
|
116 | | - ++packets_count; |
| 119 | + ++packetCount; |
117 | 120 | } |
118 | 121 | } |
119 | 122 |
|
@@ -158,56 +161,85 @@ ps2_status_t ps2InitializeMouse() |
158 | 161 | return G_PS2_STATUS_FAILED_INITIALIZE; |
159 | 162 | } |
160 | 163 |
|
| 164 | + // enable extended stuff for scrolling |
| 165 | + if(ps2WriteToMouse(0xF3) || |
| 166 | + ps2WriteToMouse(200) || |
| 167 | + ps2WriteToMouse(0xF3) || |
| 168 | + ps2WriteToMouse(100) || |
| 169 | + ps2WriteToMouse(0xF3) || |
| 170 | + ps2WriteToMouse(80)) |
| 171 | + { |
| 172 | + intelliMouseMode = false; |
| 173 | + klog("failed to enable intellimouse mode"); |
| 174 | + } |
| 175 | + else |
| 176 | + { |
| 177 | + intelliMouseMode = true; |
| 178 | + } |
| 179 | + |
161 | 180 | return G_PS2_STATUS_SUCCESS; |
162 | 181 | } |
163 | 182 |
|
164 | 183 | void ps2HandleMouseData(uint8_t value) |
165 | 184 | { |
166 | | - |
167 | | - switch(mouse_packet_number) |
| 185 | + if(mousePacketNumber == 0) |
168 | 186 | { |
169 | | - case 0: |
170 | | - mouse_packet_buffer[0] = value; |
171 | | - |
172 | | - if((value & 0x08) == 0) |
173 | | - { |
174 | | - mouse_packet_number = 0; // otherwise restart the cycle |
175 | | - } |
176 | | - else |
177 | | - { |
178 | | - mouse_packet_number = 1; |
179 | | - } |
180 | | - break; |
181 | | - |
182 | | - case 1: |
183 | | - mouse_packet_buffer[1] = value; |
184 | | - mouse_packet_number = 2; |
185 | | - break; |
186 | | - |
187 | | - case 2: |
188 | | - mouse_packet_buffer[2] = value; |
189 | | - |
190 | | - int8_t flags = mouse_packet_buffer[0]; |
191 | | - uint8_t valX = mouse_packet_buffer[1]; |
192 | | - uint8_t valY = mouse_packet_buffer[2]; |
| 187 | + mousePacketBuffer[0] = value; |
| 188 | + // The first byte must always have the 4th bit (0x08) set |
| 189 | + if((value & 0x08) == 0) |
| 190 | + { |
| 191 | + mousePacketNumber = 0; // wait for a valid starting byte |
| 192 | + } |
| 193 | + else |
| 194 | + { |
| 195 | + mousePacketNumber = 1; |
| 196 | + } |
| 197 | + } |
| 198 | + else if(mousePacketNumber == 1) |
| 199 | + { |
| 200 | + mousePacketBuffer[1] = value; |
| 201 | + mousePacketNumber = 2; |
| 202 | + } |
| 203 | + else if(mousePacketNumber == 2) |
| 204 | + { |
| 205 | + if(intelliMouseMode) |
| 206 | + { |
| 207 | + mousePacketBuffer[2] = value; |
| 208 | + mousePacketNumber = 3; |
| 209 | + } |
| 210 | + else |
| 211 | + { |
| 212 | + mousePacketBuffer[2] = value; |
| 213 | + mousePacketNumber = 0; |
| 214 | + ps2HandlePacket(); |
| 215 | + } |
| 216 | + } |
| 217 | + else if(mousePacketNumber == 3) // IntelliMouse only |
| 218 | + { |
| 219 | + mousePacketBuffer[3] = value; |
| 220 | + mousePacketNumber = 0; |
| 221 | + ps2HandlePacket(); |
| 222 | + } |
| 223 | +} |
193 | 224 |
|
194 | | - if((flags & (1 << 6)) || (flags & (1 << 7))) |
195 | | - { |
196 | | - // ignore overflowing values |
197 | | - } |
198 | | - else |
199 | | - { |
200 | | - int16_t offX = (valX | ((flags & 0x10) ? 0xFF00 : 0)); |
201 | | - int16_t offY = (valY | ((flags & 0x20) ? 0xFF00 : 0)); |
| 225 | +void ps2HandlePacket() |
| 226 | +{ |
| 227 | + int8_t flags = mousePacketBuffer[0]; |
| 228 | + uint8_t valX = mousePacketBuffer[1]; |
| 229 | + uint8_t valY = mousePacketBuffer[2]; |
| 230 | + int8_t scroll = intelliMouseMode ? (int8_t) mousePacketBuffer[3] : 0; |
202 | 231 |
|
203 | | - if(registeredMouseCallback) |
204 | | - { |
205 | | - registeredMouseCallback(offX, -offY, flags); |
206 | | - } |
207 | | - } |
| 232 | + if((flags & (1 << 6)) || (flags & (1 << 7))) |
| 233 | + { |
| 234 | + // ignore overflowing values |
| 235 | + } |
| 236 | + else |
| 237 | + { |
| 238 | + int16_t offX = (valX | ((flags & 0x10) ? 0xFF00 : 0)); |
| 239 | + int16_t offY = (valY | ((flags & 0x20) ? 0xFF00 : 0)); |
208 | 240 |
|
209 | | - mouse_packet_number = 0; |
210 | | - break; |
| 241 | + if(registeredMouseCallback) |
| 242 | + registeredMouseCallback(offX, -offY, flags, scroll); |
211 | 243 | } |
212 | 244 | } |
213 | 245 |
|
|
0 commit comments