1 /** @file 2 Using PS2 Mouse to simulation Absolution Pointer Device. 3 4 Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __COMMPS2_H__ 16 #define __COMMPS2_H__ 17 18 #define PS2_PACKET_LENGTH 3 19 #define PS2_SYNC_MASK 0xc 20 #define PS2_SYNC_BYTE 0x8 21 22 #define IS_PS2_SYNC_BYTE(byte) ((byte & PS2_SYNC_MASK) == PS2_SYNC_BYTE) 23 24 #define PS2_READ_BYTE_ONE 0 25 #define PS2_READ_DATA_BYTE 1 26 #define PS2_PROCESS_PACKET 2 27 28 #define TIMEOUT 50000 29 #define BAT_TIMEOUT 500000 30 31 // 32 // 8042 I/O Port 33 // 34 #define KBC_DATA_PORT 0x60 35 #define KBC_CMD_STS_PORT 0x64 36 37 // 38 // 8042 Command 39 // 40 #define READ_CMD_BYTE 0x20 41 #define WRITE_CMD_BYTE 0x60 42 #define DISABLE_AUX 0xa7 43 #define ENABLE_AUX 0xa8 44 #define SELF_TEST 0xaa 45 #define DISABLE_KB 0xad 46 #define ENABLE_KB 0xae 47 #define WRITE_AUX_DEV 0xd4 48 49 #define CMD_SYS_FLAG 0x04 50 #define CMD_KB_STS 0x10 51 #define CMD_KB_DIS 0x10 52 #define CMD_KB_EN 0x0 53 54 // 55 // 8042 Auxiliary Device Command 56 // 57 #define SETSF1_CMD 0xe6 58 #define SETSF2_CMD 0xe7 59 #define SETRE_CMD 0xe8 60 #define READ_CMD 0xeb 61 #define SETRM_CMD 0xf0 62 #define SETSR_CMD 0xf3 63 #define ENABLE_CMD 0xf4 64 #define DISABLE_CMD 0xf5 65 #define RESET_CMD 0xff 66 67 // 68 // return code 69 // 70 #define PS2_ACK 0xfa 71 #define PS2_RESEND 0xfe 72 #define PS2MOUSE_BAT1 0xaa 73 #define PS2MOUSE_BAT2 0x0 74 75 // 76 // Keyboard Controller Status 77 // 78 /// 79 /// Parity Error 80 /// 81 #define KBC_PARE 0x80 82 /// 83 /// General Time Out 84 /// 85 #define KBC_TIM 0x40 86 /// 87 /// Output buffer for auxiliary device (PS/2): 88 /// 0 - Holds keyboard data 89 /// 1 - Holds data for auxiliary device 90 /// 91 #define KBC_AUXB 0x20 92 /// 93 /// Keyboard lock status: 94 /// 0 - keyboard locked 95 /// 1 - keyboard free 96 /// 97 #define KBC_KEYL 0x10 98 /// 99 /// Command/Data: 100 /// 0 - data byte written via port 60h 101 /// 1 - command byte written via port 64h 102 /// 103 #define KBC_CD 0x08 104 /// 105 /// System Flag: 106 /// 0 - power-on reset 107 /// 1 - self-test successful 108 /// 109 #define KBC_SYSF 0x04 110 /// 111 /// Input Buffer Status : 112 /// 0 - input buffer empty 113 /// 1 - CPU data in input buffer 114 /// 115 #define KBC_INPB 0x02 116 /// 117 /// Output Buffer Status : 118 /// 0 - output buffer empty 119 /// 1 - keyboard controller data in output buffer 120 /// 121 #define KBC_OUTB 0x01 122 123 /** 124 Issue self test command via IsaIo interface. 125 126 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 127 128 @return EFI_SUCCESS Success to do keyboard self testing. 129 @return others Fail to do keyboard self testing. 130 **/ 131 EFI_STATUS 132 KbcSelfTest ( 133 IN EFI_ISA_IO_PROTOCOL *IsaIo 134 ); 135 136 /** 137 Issue command to enable keyboard AUX functionality. 138 139 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 140 141 @return Status of command issuing. 142 **/ 143 EFI_STATUS 144 KbcEnableAux ( 145 IN EFI_ISA_IO_PROTOCOL *IsaIo 146 ); 147 148 /** 149 Issue command to disable keyboard AUX functionality. 150 151 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 152 153 @return Status of command issuing. 154 **/ 155 EFI_STATUS 156 KbcDisableAux ( 157 IN EFI_ISA_IO_PROTOCOL *IsaIo 158 ); 159 160 /** 161 Issue command to enable keyboard. 162 163 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 164 165 @return Status of command issuing. 166 **/ 167 EFI_STATUS 168 KbcEnableKb ( 169 IN EFI_ISA_IO_PROTOCOL *IsaIo 170 ); 171 172 /** 173 Issue command to disable keyboard. 174 175 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 176 177 @return Status of command issuing. 178 **/ 179 EFI_STATUS 180 KbcDisableKb ( 181 IN EFI_ISA_IO_PROTOCOL *IsaIo 182 ); 183 184 /** 185 Issue command to check keyboard status. 186 187 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 188 @param KeyboardEnable return whether keyboard is enable. 189 190 @return Status of command issuing. 191 **/ 192 EFI_STATUS 193 CheckKbStatus ( 194 IN EFI_ISA_IO_PROTOCOL *IsaIo, 195 OUT BOOLEAN *KeyboardEnable 196 ); 197 198 /** 199 Issue command to reset keyboard. 200 201 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 202 203 @return Status of command issuing. 204 **/ 205 EFI_STATUS 206 PS2MouseReset ( 207 IN EFI_ISA_IO_PROTOCOL *IsaIo 208 ); 209 210 /** 211 Issue command to set mouse's sample rate 212 213 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 214 @param SampleRate value of sample rate 215 216 @return Status of command issuing. 217 **/ 218 EFI_STATUS 219 PS2MouseSetSampleRate ( 220 IN EFI_ISA_IO_PROTOCOL *IsaIo, 221 IN MOUSE_SR SampleRate 222 ); 223 224 /** 225 Issue command to set mouse's resolution. 226 227 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 228 @param Resolution value of resolution 229 230 @return Status of command issuing. 231 **/ 232 EFI_STATUS 233 PS2MouseSetResolution ( 234 IN EFI_ISA_IO_PROTOCOL *IsaIo, 235 IN MOUSE_RE Resolution 236 ); 237 238 /** 239 Issue command to set mouse's scaling. 240 241 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 242 @param Scaling value of scaling 243 244 @return Status of command issuing. 245 **/ 246 EFI_STATUS 247 PS2MouseSetScaling ( 248 IN EFI_ISA_IO_PROTOCOL *IsaIo, 249 IN MOUSE_SF Scaling 250 ); 251 252 /** 253 Issue command to enable Ps2 mouse. 254 255 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 256 257 @return Status of command issuing. 258 **/ 259 EFI_STATUS 260 PS2MouseEnable ( 261 IN EFI_ISA_IO_PROTOCOL *IsaIo 262 ); 263 264 /** 265 Get mouse packet . Only care first 3 bytes 266 267 @param MouseAbsolutePointerDev Pointer to PS2 Absolute Pointer Simulation Device Private Data Structure 268 269 @retval EFI_NOT_READY Mouse Device not ready to input data packet, or some error happened during getting the packet 270 @retval EFI_SUCCESS The data packet is gotten successfully. 271 272 **/ 273 EFI_STATUS 274 PS2MouseGetPacket ( 275 PS2_MOUSE_ABSOLUTE_POINTER_DEV *MouseAbsolutePointerDev 276 ); 277 278 /** 279 Read data via IsaIo protocol with given number. 280 281 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 282 @param Buffer Buffer receive data of mouse 283 @param BufSize The size of buffer 284 @param State Check input or read data 285 286 @return status of reading mouse data. 287 **/ 288 EFI_STATUS 289 PS2MouseRead ( 290 IN EFI_ISA_IO_PROTOCOL *IsaIo, 291 OUT VOID *Buffer, 292 IN OUT UINTN *BufSize, 293 IN UINTN State 294 ); 295 296 // 297 // 8042 I/O function 298 // 299 /** 300 I/O work flow of outing 8042 command. 301 302 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 303 @param Command I/O command. 304 305 @retval EFI_SUCCESS Success to execute I/O work flow 306 @retval EFI_TIMEOUT Keyboard controller time out. 307 **/ 308 EFI_STATUS 309 Out8042Command ( 310 IN EFI_ISA_IO_PROTOCOL *IsaIo, 311 IN UINT8 Command 312 ); 313 314 /** 315 I/O work flow of in 8042 data. 316 317 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 318 @param Data Data value 319 320 @retval EFI_SUCCESS Success to execute I/O work flow 321 @retval EFI_TIMEOUT Keyboard controller time out. 322 **/ 323 EFI_STATUS 324 In8042Data ( 325 IN EFI_ISA_IO_PROTOCOL *IsaIo, 326 IN OUT UINT8 *Data 327 ); 328 329 /** 330 I/O work flow of outing 8042 data. 331 332 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 333 @param Data Data value 334 335 @retval EFI_SUCCESS Success to execute I/O work flow 336 @retval EFI_TIMEOUT Keyboard controller time out. 337 **/ 338 EFI_STATUS 339 Out8042Data ( 340 IN EFI_ISA_IO_PROTOCOL *IsaIo, 341 IN UINT8 Data 342 ); 343 344 /** 345 I/O work flow of outing 8042 Aux command. 346 347 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 348 @param Command Aux I/O command 349 @param Resend Whether need resend the Aux command. 350 351 @retval EFI_SUCCESS Success to execute I/O work flow 352 @retval EFI_TIMEOUT Keyboard controller time out. 353 **/ 354 EFI_STATUS 355 Out8042AuxCommand ( 356 IN EFI_ISA_IO_PROTOCOL *IsaIo, 357 IN UINT8 Command, 358 IN BOOLEAN Resend 359 ); 360 361 /** 362 I/O work flow of in 8042 Aux data. 363 364 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 365 @param Data Buffer holding return value. 366 367 @retval EFI_SUCCESS Success to execute I/O work flow 368 @retval EFI_TIMEOUT Keyboard controller time out. 369 **/ 370 EFI_STATUS 371 In8042AuxData ( 372 IN EFI_ISA_IO_PROTOCOL *IsaIo, 373 IN OUT UINT8 *Data 374 ); 375 376 /** 377 I/O work flow of outing 8042 Aux data. 378 379 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 380 @param Data Buffer holding return value. 381 382 @retval EFI_SUCCESS Success to execute I/O work flow 383 @retval EFI_TIMEOUT Keyboard controller time out. 384 **/ 385 EFI_STATUS 386 Out8042AuxData ( 387 IN EFI_ISA_IO_PROTOCOL *IsaIo, 388 IN UINT8 Data 389 ); 390 391 /** 392 Check keyboard controller status, if it is output buffer full and for auxiliary device. 393 394 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 395 396 @retval EFI_SUCCESS Keyboard controller is ready 397 @retval EFI_NOT_READY Keyboard controller is not ready 398 **/ 399 EFI_STATUS 400 CheckForInput ( 401 IN EFI_ISA_IO_PROTOCOL *IsaIo 402 ); 403 404 /** 405 I/O work flow to wait input buffer empty in given time. 406 407 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 408 @param Timeout Wating time. 409 410 @retval EFI_TIMEOUT if input is still not empty in given time. 411 @retval EFI_SUCCESS input is empty. 412 **/ 413 EFI_STATUS 414 WaitInputEmpty ( 415 IN EFI_ISA_IO_PROTOCOL *IsaIo, 416 IN UINTN Timeout 417 ); 418 419 /** 420 I/O work flow to wait output buffer full in given time. 421 422 @param IsaIo Pointer to instance of EFI_ISA_IO_PROTOCOL 423 @param Timeout given time 424 425 @retval EFI_TIMEOUT output is not full in given time 426 @retval EFI_SUCCESS output is full in given time. 427 **/ 428 EFI_STATUS 429 WaitOutputFull ( 430 IN EFI_ISA_IO_PROTOCOL *IsaIo, 431 IN UINTN Timeout 432 ); 433 434 #endif 435 436