Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeni8042prt.h
Go to the documentation of this file.
00001 #include <ntifs.h> 00002 #include <kbdmou.h> 00003 #include <ntdd8042.h> 00004 #include <ntddkbd.h> 00005 #include <bugcodes.h> 00006 #include <poclass.h> 00007 #include <kdfuncs.h> 00008 #include <debug.h> 00009 00010 /*----------------------------------------------------- 00011 * Structures 00012 * --------------------------------------------------*/ 00013 00014 #define I8042PRT_TAG '2408' 00015 00016 typedef enum 00017 { 00018 dsStopped, 00019 dsStarted, 00020 dsPaused, 00021 dsRemoved, 00022 dsSurpriseRemoved 00023 } DEVICE_STATE; 00024 00025 typedef struct _I8042_SETTINGS 00026 { 00027 /* Registry settings */ 00028 ULONG KeyboardDataQueueSize; /* done */ 00029 UNICODE_STRING KeyboardDeviceBaseName; 00030 ULONG MouseDataQueueSize; /* done */ 00031 ULONG MouseResolution; 00032 ULONG MouseSynchIn100ns; 00033 ULONG NumberOfButtons; 00034 UNICODE_STRING PointerDeviceBaseName; 00035 ULONG PollStatusIterations; /* done */ 00036 ULONG OverrideKeyboardType; 00037 ULONG OverrideKeyboardSubtype; 00038 ULONG PollingIterations; /* done */ 00039 ULONG PollingIterationsMaximum; 00040 ULONG ResendIterations; /* done */ 00041 ULONG SampleRate; 00042 ULONG CrashOnCtrlScroll; /* done */ 00043 } I8042_SETTINGS, *PI8042_SETTINGS; 00044 00045 typedef enum _MOUSE_TIMEOUT_STATE 00046 { 00047 NoChange, 00048 TimeoutStart, 00049 TimeoutCancel 00050 } MOUSE_TIMEOUT_STATE, *PMOUSE_TIMEOUT_STATE; 00051 00052 typedef struct _INTERRUPT_DATA 00053 { 00054 PKINTERRUPT Object; 00055 ULONG Vector; 00056 KIRQL Dirql; 00057 KINTERRUPT_MODE InterruptMode; 00058 BOOLEAN ShareInterrupt; 00059 KAFFINITY Affinity; 00060 } INTERRUPT_DATA, *PINTERRUPT_DATA; 00061 00062 #define WHEEL_DELTA 120 00063 00064 struct _I8042_KEYBOARD_EXTENSION; 00065 typedef struct _I8042_KEYBOARD_EXTENSION *PI8042_KEYBOARD_EXTENSION; 00066 struct _I8042_MOUSE_EXTENSION; 00067 typedef struct _I8042_MOUSE_EXTENSION *PI8042_MOUSE_EXTENSION; 00068 00069 /* PORT_DEVICE_EXTENSION.Flags */ 00070 #define KEYBOARD_PRESENT 0x01 /* A keyboard is attached */ 00071 #define KEYBOARD_CONNECTED 0x02 /* Keyboard received IOCTL_INTERNAL_KEYBOARD_CONNECT */ 00072 #define KEYBOARD_STARTED 0x04 /* Keyboard FDO received IRP_MN_START_DEVICE */ 00073 #define KEYBOARD_INITIALIZED 0x08 /* Keyboard interrupt is connected */ 00074 #define MOUSE_PRESENT 0x10 /* A mouse is attached */ 00075 #define MOUSE_CONNECTED 0x20 /* Mouse received IOCTL_INTERNAL_MOUSE_CONNECT */ 00076 #define MOUSE_STARTED 0x40 /* Mouse FDO received IRP_MN_START_DEVICE */ 00077 #define MOUSE_INITIALIZED 0x80 /* Mouse interrupt is connected */ 00078 00079 typedef struct _PORT_DEVICE_EXTENSION 00080 { 00081 PUCHAR DataPort; /* Usually 0x60 */ 00082 PUCHAR ControlPort; /* Usually 0x64 */ 00083 I8042_SETTINGS Settings; 00084 ULONG Flags; 00085 00086 PI8042_KEYBOARD_EXTENSION KeyboardExtension; 00087 INTERRUPT_DATA KeyboardInterrupt; 00088 PI8042_MOUSE_EXTENSION MouseExtension; 00089 INTERRUPT_DATA MouseInterrupt; 00090 PKINTERRUPT HighestDIRQLInterrupt; 00091 KSPIN_LOCK SpinLock; 00092 KIRQL HighestDirql; 00093 00094 OUTPUT_PACKET Packet; 00095 ULONG PacketResends; 00096 BOOLEAN PacketComplete; 00097 NTSTATUS PacketResult; 00098 UCHAR PacketBuffer[16]; 00099 UCHAR PacketPort; 00100 00101 PIRP CurrentIrp; 00102 PDEVICE_OBJECT CurrentIrpDevice; 00103 } PORT_DEVICE_EXTENSION, *PPORT_DEVICE_EXTENSION; 00104 00105 typedef struct _I8042_DRIVER_EXTENSION 00106 { 00107 UNICODE_STRING RegistryPath; 00108 00109 PORT_DEVICE_EXTENSION Port; 00110 LIST_ENTRY DeviceListHead; 00111 KSPIN_LOCK DeviceListLock; 00112 } I8042_DRIVER_EXTENSION, *PI8042_DRIVER_EXTENSION; 00113 00114 typedef enum _I8042_DEVICE_TYPE 00115 { 00116 Unknown, 00117 Keyboard, 00118 Mouse, 00119 PhysicalDeviceObject 00120 } I8042_DEVICE_TYPE, *PI8042_DEVICE_TYPE; 00121 00122 typedef struct _FDO_DEVICE_EXTENSION 00123 { 00124 I8042_DEVICE_TYPE Type; 00125 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead 00126 LIST_ENTRY ListEntry; 00127 // Associated device object (FDO) 00128 PDEVICE_OBJECT Fdo; 00129 // Associated device object (PDO) 00130 PDEVICE_OBJECT Pdo; 00131 // Lower device object 00132 PDEVICE_OBJECT LowerDevice; 00133 // Current state of the driver 00134 DEVICE_STATE PnpState; 00135 00136 PPORT_DEVICE_EXTENSION PortDeviceExtension; 00137 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; 00138 00139 typedef struct _I8042_KEYBOARD_EXTENSION 00140 { 00141 FDO_DEVICE_EXTENSION Common; 00142 CONNECT_DATA KeyboardData; 00143 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook; /* FIXME: IsrWritePort ignored */ 00144 KDPC DpcKeyboard; 00145 00146 KEYBOARD_ATTRIBUTES KeyboardAttributes; 00147 00148 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators; 00149 00150 KEYBOARD_SCAN_STATE KeyboardScanState; 00151 BOOLEAN KeyComplete; 00152 PKEYBOARD_INPUT_DATA KeyboardBuffer; 00153 ULONG KeysInBuffer; 00154 00155 /* Power keys items */ 00156 ULONG ReportedCaps; 00157 ULONG NewCaps; 00158 ULONG LastPowerKey; 00159 UNICODE_STRING PowerInterfaceName; 00160 PIO_WORKITEM PowerWorkItem; 00161 PIRP PowerIrp; 00162 00163 /* Debug items */ 00164 ULONG ComboPosition; 00165 PIO_WORKITEM DebugWorkItem; 00166 BOOLEAN TabPressed; 00167 } I8042_KEYBOARD_EXTENSION; 00168 00169 typedef enum _I8042_MOUSE_TYPE 00170 { 00171 GenericPS2, 00172 Intellimouse, 00173 IntellimouseExplorer, 00174 Ps2pp 00175 } I8042_MOUSE_TYPE, *PI8042_MOUSE_TYPE; 00176 00177 typedef struct _I8042_MOUSE_EXTENSION 00178 { 00179 FDO_DEVICE_EXTENSION Common; 00180 CONNECT_DATA MouseData; 00181 INTERNAL_I8042_HOOK_MOUSE MouseHook; 00182 KDPC DpcMouse; 00183 00184 MOUSE_ATTRIBUTES MouseAttributes; 00185 00186 MOUSE_STATE MouseState; 00187 BOOLEAN MouseComplete; 00188 MOUSE_RESET_SUBSTATE MouseResetState; 00189 PMOUSE_INPUT_DATA MouseBuffer; 00190 ULONG MouseInBuffer; 00191 USHORT MouseButtonState; 00192 ULARGE_INTEGER MousePacketStartTime; 00193 00194 KTIMER TimerMouseTimeout; 00195 KDPC DpcMouseTimeout; 00196 MOUSE_TIMEOUT_STATE MouseTimeoutState; 00197 BOOLEAN MouseTimeoutActive; 00198 00199 UCHAR MouseLogiBuffer[3]; 00200 I8042_MOUSE_TYPE MouseType; 00201 } I8042_MOUSE_EXTENSION; 00202 00203 typedef struct _I8042_HOOK_WORKITEM 00204 { 00205 PIO_WORKITEM WorkItem; 00206 PIRP Irp; 00207 } I8042_HOOK_WORKITEM, *PI8042_HOOK_WORKITEM; 00208 00209 /*----------------------------------------------------- 00210 * Some defines 00211 * --------------------------------------------------*/ 00212 00213 #define MAX(a, b) ((a) >= (b) ? (a) : (b)) 00214 00215 #define KEYBOARD_POWER_CODE 0x5E 00216 #define KEYBOARD_SLEEP_CODE 0x5F 00217 #define KEYBOARD_WAKE_CODE 0x63 00218 00219 /*----------------------------------------------------- 00220 * Controller commands 00221 * --------------------------------------------------*/ 00222 00223 #define KBD_READ_MODE 0x20 00224 #define KBD_WRITE_MODE 0x60 00225 #define MOUSE_ENAB 0xA8 00226 #define MOUSE_LINE_TEST 0xA9 00227 #define CTRL_SELF_TEST 0xAA 00228 #define CTRL_WRITE_MOUSE 0xD4 00229 00230 /*----------------------------------------------------- 00231 * Keyboard commands 00232 * --------------------------------------------------*/ 00233 00234 #define KBD_CMD_SET_LEDS 0xED 00235 #define KBD_CMD_GET_ID 0xF2 00236 00237 /*----------------------------------------------------- 00238 * Keyboard responses 00239 * --------------------------------------------------*/ 00240 00241 #define KBD_SELF_TEST_OK 0x55 00242 #define KBD_ACK 0xFA 00243 #define KBD_NACK 0xFC 00244 #define KBD_RESEND 0xFE 00245 00246 /*----------------------------------------------------- 00247 * Controller status register bits 00248 * --------------------------------------------------*/ 00249 00250 #define KBD_OBF 0x01 00251 #define KBD_IBF 0x02 00252 #define MOU_OBF 0x20 00253 #define KBD_PERR 0x80 00254 00255 /*----------------------------------------------------- 00256 * Controller command byte bits 00257 * --------------------------------------------------*/ 00258 00259 #define CCB_KBD_INT_ENAB 0x01 00260 #define CCB_MOUSE_INT_ENAB 0x02 00261 #define CCB_SYSTEM_FLAG 0x04 00262 #define CCB_KBD_DISAB 0x10 00263 #define CCB_MOUSE_DISAB 0x20 00264 #define CCB_TRANSLATE 0x40 00265 00266 /*----------------------------------------------------- 00267 * LED bits 00268 * --------------------------------------------------*/ 00269 00270 #define KBD_LED_SCROLL 0x01 00271 #define KBD_LED_NUM 0x02 00272 #define KBD_LED_CAPS 0x04 00273 00274 /*----------------------------------------------------- 00275 * Mouse commands 00276 * --------------------------------------------------*/ 00277 00278 #define MOU_ENAB 0xF4 00279 #define MOU_CMD_RESET 0xFF 00280 00281 /*----------------------------------------------------- 00282 * Mouse responses 00283 * --------------------------------------------------*/ 00284 00285 #define MOUSE_ACK 0xFA 00286 #define MOUSE_ERROR 0xFC 00287 #define MOUSE_NACK 0xFE 00288 00289 /*----------------------------------------------------- 00290 * Prototypes 00291 * --------------------------------------------------*/ 00292 00293 /* createclose.c */ 00294 00295 IO_WORKITEM_ROUTINE i8042SendHookWorkItem; 00296 00297 DRIVER_DISPATCH i8042Create; 00298 00299 DRIVER_DISPATCH i8042Cleanup; 00300 00301 DRIVER_DISPATCH i8042Close; 00302 00303 /* keyboard.c */ 00304 00305 NTSTATUS NTAPI 00306 i8042SynchWritePortKbd( 00307 IN PVOID Context, 00308 IN UCHAR Value, 00309 IN BOOLEAN WaitForAck); 00310 00311 DRIVER_STARTIO i8042KbdStartIo; 00312 00313 DRIVER_DISPATCH i8042KbdDeviceControl; 00314 00315 DRIVER_DISPATCH i8042KbdInternalDeviceControl; 00316 00317 KSERVICE_ROUTINE i8042KbdInterruptService; 00318 00319 /* i8042prt.c */ 00320 00321 DRIVER_ADD_DEVICE i8042AddDevice; 00322 00323 BOOLEAN 00324 i8042PacketIsr( 00325 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00326 IN UCHAR Output); 00327 00328 NTSTATUS 00329 i8042StartPacket( 00330 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00331 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension, 00332 IN PUCHAR Bytes, 00333 IN ULONG ByteCount, 00334 IN PIRP Irp); 00335 00336 /* misc.c */ 00337 00338 DRIVER_DISPATCH ForwardIrpAndForget; 00339 00340 DRIVER_DISPATCH ForwardIrpAndWait; 00341 00342 NTSTATUS 00343 DuplicateUnicodeString( 00344 IN ULONG Flags, 00345 IN PCUNICODE_STRING SourceString, 00346 OUT PUNICODE_STRING DestinationString); 00347 00348 /* mouse.c */ 00349 00350 VOID 00351 i8042MouHandle( 00352 IN PI8042_MOUSE_EXTENSION DeviceExtension, 00353 IN UCHAR Output); 00354 00355 VOID 00356 i8042MouHandleButtons( 00357 IN PI8042_MOUSE_EXTENSION DeviceExtension, 00358 IN USHORT Mask); 00359 00360 NTSTATUS 00361 i8042MouInitialize( 00362 IN PI8042_MOUSE_EXTENSION DeviceExtension); 00363 00364 DRIVER_DISPATCH i8042MouInternalDeviceControl; 00365 00366 KSERVICE_ROUTINE i8042MouInterruptService; 00367 00368 /* pnp.c */ 00369 00370 BOOLEAN 00371 i8042ChangeMode( 00372 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00373 IN UCHAR FlagsToDisable, 00374 IN UCHAR FlagsToEnable); 00375 00376 DRIVER_DISPATCH i8042Pnp; 00377 00378 /* ps2pp.c */ 00379 VOID 00380 i8042MouHandlePs2pp( 00381 IN PI8042_MOUSE_EXTENSION DeviceExtension, 00382 IN UCHAR Input); 00383 00384 /* readwrite.c */ 00385 00386 VOID 00387 i8042Flush( 00388 IN PPORT_DEVICE_EXTENSION DeviceExtension); 00389 00390 BOOLEAN 00391 i8042IsrWritePort( 00392 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00393 IN UCHAR Value, 00394 IN UCHAR SelectCmd OPTIONAL); 00395 00396 NTSTATUS 00397 i8042ReadData( 00398 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00399 IN UCHAR StatusFlags, 00400 OUT PUCHAR Data); 00401 #define i8042ReadKeyboardData(DeviceExtension, Data) \ 00402 i8042ReadData(DeviceExtension, KBD_OBF, Data) 00403 #define i8042ReadMouseData(DeviceExtension, Data) \ 00404 i8042ReadData(DeviceExtension, MOU_OBF, Data) 00405 00406 NTSTATUS 00407 i8042ReadDataWait( 00408 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00409 OUT PUCHAR Data); 00410 00411 NTSTATUS 00412 i8042ReadStatus( 00413 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00414 OUT PUCHAR Status); 00415 00416 NTSTATUS NTAPI 00417 i8042SynchReadPort( 00418 IN PVOID Context, 00419 OUT PUCHAR Value, 00420 IN BOOLEAN WaitForAck); 00421 00422 NTSTATUS NTAPI 00423 i8042SynchWritePort( 00424 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00425 IN UCHAR Port, 00426 IN UCHAR Value, 00427 IN BOOLEAN WaitForAck); 00428 00429 BOOLEAN 00430 i8042Write( 00431 IN PPORT_DEVICE_EXTENSION DeviceExtension, 00432 IN PUCHAR addr, 00433 IN UCHAR data); 00434 00435 /* registry.c */ 00436 00437 NTSTATUS 00438 ReadRegistryEntries( 00439 IN PUNICODE_STRING RegistryPath, 00440 OUT PI8042_SETTINGS Settings); Generated on Sat May 26 2012 04:26:31 for ReactOS by
1.7.6.1
|