ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

i8042prt.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.