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