diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/fw/mips/jxkbd.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/fw/mips/jxkbd.c')
-rw-r--r-- | private/ntos/fw/mips/jxkbd.c | 491 |
1 files changed, 491 insertions, 0 deletions
diff --git a/private/ntos/fw/mips/jxkbd.c b/private/ntos/fw/mips/jxkbd.c new file mode 100644 index 000000000..dd1602f68 --- /dev/null +++ b/private/ntos/fw/mips/jxkbd.c @@ -0,0 +1,491 @@ +#if defined(JAZZ) + + +/*++ + +Copyright (c) 1989 Microsoft Corporation + +Module Name: + + jxkbd.c + +Abstract: + + This module implements the keyboard boot driver for the Jazz system. + +Author: + + David M. Robinson (davidro) 8-Aug-1991 + +Environment: + + Kernel mode. + + +Revision History: + +--*/ + +#include "fwp.h" +#ifdef DUO +#include "duoint.h" +#else +#include "jazzint.h" +#endif +#include "iodevice.h" +#include "string.h" + + +ARC_STATUS +KeyboardClose ( + IN ULONG FileId + ); + +ARC_STATUS +KeyboardMount ( + IN PCHAR MountPath, + IN MOUNT_OPERATION Operation + ); + +ARC_STATUS +KeyboardOpen ( + IN PCHAR OpenPath, + IN OPEN_MODE OpenMode, + IN OUT PULONG FileId + ); + +ARC_STATUS +KeyboardRead ( + IN ULONG FileId, + IN PVOID Buffer, + IN ULONG Length, + OUT PULONG Count + ); + +ARC_STATUS +KeyboardGetReadStatus ( + IN ULONG FileId + ); + +ARC_STATUS +KeyboardSeek ( + IN ULONG FileId, + IN PLARGE_INTEGER Offset, + IN SEEK_MODE SeekMode + ); + +ARC_STATUS +KeyboardWrite ( + IN ULONG FileId, + IN PVOID Buffer, + IN ULONG Length, + OUT PULONG Count + ); + +ARC_STATUS +KeyboardGetFileInformation ( + IN ULONG FileId, + OUT PFILE_INFORMATION Finfo + ); + +// +// Define static data. +// +BL_DEVICE_ENTRY_TABLE KeyboardEntryTable = { + KeyboardClose, + KeyboardMount, + KeyboardOpen, + KeyboardRead, + KeyboardGetReadStatus, + KeyboardSeek, + KeyboardWrite, + KeyboardGetFileInformation, + (PARC_SET_FILE_INFO_ROUTINE)NULL + }; + +PCHAR KeyboardDevicePath = "multi(0)key(0)keyboard(0)"; + +KEYBOARD_BUFFER KbdBuffer; + +BOOLEAN FwLeftShift; +BOOLEAN FwRightShift; +BOOLEAN FwControl; +BOOLEAN FwAlt; +BOOLEAN FwCapsLock; + + +// +// Define prototypes for all routines used by this module. +// + +UCHAR +FwInputScanCode( + VOID + ); + + +ARC_STATUS +KeyboardGetFileInformation ( + IN ULONG FileId, + OUT PFILE_INFORMATION Finfo + ) + +/*++ + +Routine Description: + + This function returns EINVAL as no FileInformation can be + returned for the Keyboard driver. + +Arguments: + + The arguments are not used. + +Return Value: + + EINVAL is returned + +--*/ + +{ + return EINVAL; +} + + +ARC_STATUS +KeyboardClose ( + IN ULONG FileId + ) + +/*++ + +Routine Description: + + This function closes the file table entry specified by the file id. + +Arguments: + + FileId - Supplies the file table index. + +Return Value: + + ESUCCESS is returned + +--*/ + +{ + + BlFileTable[FileId].Flags.Open = 0; + return ESUCCESS; +} + +ARC_STATUS +KeyboardMount ( + IN PCHAR MountPath, + IN MOUNT_OPERATION Operation + ) + +/*++ + +Routine Description: + + +Arguments: + + +Return Value: + + +--*/ + +{ + return EINVAL; +} + +ARC_STATUS +KeyboardOpen ( + IN PCHAR OpenPath, + IN OPEN_MODE OpenMode, + IN OUT PULONG FileId + ) +/*++ + +Routine Description: + + This is the open routine for the Keyboard device. + +Arguments: + + OpenPath - Supplies the pathname of the device to open. + + OpenMode - Supplies the mode (read only, write only, or read write). + + FileId - Supplies a free file identifier to use. If the device is already + open this parameter can be used to return the file identifier + already in use. + +Return Value: + + If the open was successful, ESUCCESS is returned, otherwise an error code + is returned. + +--*/ +{ + PCONSOLE_CONTEXT Context; + + Context = &BlFileTable[*FileId].u.ConsoleContext; + if ( strstr(OpenPath, ")console(1)" ) != NULL ) { + Context->ConsoleNumber = 1; + } else { + Context->ConsoleNumber = 0; + } + return ESUCCESS; +} + +ARC_STATUS +KeyboardRead ( + IN ULONG FileId, + IN PVOID Buffer, + IN ULONG Length, + OUT PULONG Count + ) +/*++ + +Routine Description: + + This routine reads keys from the keyboard and passes along either ascii + or Unicode characters to the caller. + +Arguments: + + FileId - Supplies a file id. + + Buffer - Supplies a pointer to a buffer to receive the characters. + + Length - Supplies the length of Buffer in bytes. + + Count - Returns the count of the bytes that were received. + +Return Value: + + A value of ESUCCESS is returned. + +--*/ +{ + PCHAR OutputBuffer; + PCONSOLE_CONTEXT Context; + BOOLEAN Unicode; + + OutputBuffer = (PCHAR)Buffer; + Context = &BlFileTable[FileId].u.ConsoleContext; + + if (Context->ConsoleNumber == 1) { + if (Length & 1) { + + // + // Length is not an even number of bytes, return an error. + // + + return(EINVAL); + } + Unicode = TRUE; + } else { + Unicode = FALSE; + } + + *Count = 0; + while (*Count < Length) { + *OutputBuffer++ = FwInputScanCode(); + (*Count)++; + if (Unicode) { + *OutputBuffer++ = 0; + (*Count)++; + } + } + return ESUCCESS; +} + + +ARC_STATUS +KeyboardGetReadStatus ( + IN ULONG FileId + ) +/*++ + +Routine Description: + + This routine checks to see if a character is available from the keyboard. + +Arguments: + + FileId - Supplies a file identifier. + +Return Value: + + Returns ESUCCESS is a byte is available, otherwise EAGAIN is returned. + +--*/ +{ + if (KbdBuffer.ReadIndex == KbdBuffer.WriteIndex) { + return EAGAIN; + } else { + return ESUCCESS; + } +} + + +ARC_STATUS +KeyboardWrite ( + IN ULONG FileId, + IN PVOID Buffer, + IN ULONG Length, + OUT PULONG Count + ) + +/*++ + +Routine Description: + +Arguments: + +Return Value: + + ESUCCESS is returned. + +--*/ + +{ + return ESUCCESS; +} + +ARC_STATUS +KeyboardSeek ( + IN ULONG FileId, + IN PLARGE_INTEGER Offset, + IN SEEK_MODE SeekMode + ) + +/*++ + +Routine Description: + +Arguments: + +Return Value: + + ESUCCESS is returned. + +--*/ + +{ + return ESUCCESS; +} + +VOID +KeyboardInitialize ( + IN OUT PDRIVER_LOOKUP_ENTRY LookupTableEntry, + IN ULONG Entries + ) + +/*++ + +Routine Description: + + This routine initializes the keyboard control registers, clears the + fifo, and initializes the keyboard entry in the driver lookup table. + +Arguments: + + LookupTableEntry - Supplies a pointer to the first free location in the + driver lookup table. + + Entries - Supplies the number of free entries in the driver lookup table. + +Return Value: + + None. + +--*/ + +{ + UCHAR Byte; + // + // Initialize the driver lookup table. + // + + LookupTableEntry->DevicePath = KeyboardDevicePath; + LookupTableEntry->DispatchTable = &KeyboardEntryTable; + + // + // Initialize static data. + // + + FwLeftShift = FALSE; + FwRightShift = FALSE; + FwControl = FALSE; + FwAlt = FALSE; + FwCapsLock = FALSE; + + KbdBuffer.ReadIndex = KbdBuffer.WriteIndex = 0; + + // + // Call the selftest keyboard initialization routine. + // + InitKeyboard(); + + // + // Enable kbd interrupts in the keyboard controller. + // + SendKbdCommand(KBD_CTR_READ_COMMAND); + GetKbdData(&Byte,100); + + // + // Clear translation mode and enable Kbd interrupt. + // + Byte = (Byte & 0xBF) | KbdCommandEnableKbdInt; + SendKbdCommand(KBD_CTR_WRITE_COMMAND); + SendKbdData(Byte); + + // + // Enable keyboard interrupts in the interrupt enable register. + // + WRITE_REGISTER_USHORT(&((PINTERRUPT_REGISTERS)INTERRUPT_VIRTUAL_BASE)->Enable, + (1 << (KEYBOARD_VECTOR - DEVICE_VECTORS - 1))); + + + return; +} + +UCHAR +FwInputScanCode ( + VOID + ) + +/*++ + +Routine Description: + + This routine reads a byte from the keyboard. If no data is available, + it blocks until a key is typed. + +Arguments: + + None. + +Return Value: + + Returns the character read from the keyboard. + +--*/ + +{ + UCHAR ScanCode; + + while (KbdBuffer.ReadIndex == KbdBuffer.WriteIndex) { + } + KbdBuffer.ReadIndex = (KbdBuffer.ReadIndex+1) % KBD_BUFFER_SIZE; + ScanCode = KbdBuffer.Buffer[KbdBuffer.ReadIndex]; + + return ScanCode; +} +#endif |