summaryrefslogtreecommitdiffstats
path: root/private/ntos/fw/mips/kbdtest.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/fw/mips/kbdtest.c
downloadNT4.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/kbdtest.c')
-rw-r--r--private/ntos/fw/mips/kbdtest.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/private/ntos/fw/mips/kbdtest.c b/private/ntos/fw/mips/kbdtest.c
new file mode 100644
index 000000000..b3672dd1e
--- /dev/null
+++ b/private/ntos/fw/mips/kbdtest.c
@@ -0,0 +1,317 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ Kbdtest.c
+
+Abstract:
+
+ This module implements the Keyboard and mouse test for the self-test.
+
+Author:
+
+ Lluis Abello (lluis) 10-Feb-1991
+
+Environment:
+
+ Rom self-test.
+
+Revision History:
+
+--*/
+#include <ntos.h>
+#include "iodevice.h"
+#include "kbdmouse.h"
+#include "ioaccess.h"
+
+volatile ULONG TimerTicks;
+
+
+VOID
+ClearKbdFifo(
+ )
+/*++
+
+Routine Description:
+
+ This routine empties the Keyboard controller Fifo.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ UCHAR Trash, Stat;
+ volatile Timeout;
+
+ //
+ // wait until the previous command is processed.
+ //
+
+ while ((READ_REGISTER_UCHAR(&KEYBOARD_READ->Status) & KBD_IBF_MASK) != 0) {
+ }
+ while ((READ_REGISTER_UCHAR(&KEYBOARD_READ->Status) & KBD_OBF_MASK) != 0) {
+ Trash= READ_REGISTER_UCHAR(&KEYBOARD_READ->Data);
+ for (Timeout=0;Timeout<10000;Timeout++) {
+ }
+ }
+}
+
+BOOLEAN
+GetKbdData(
+ PUCHAR C,
+ ULONG msec
+ )
+/*++
+
+Routine Description:
+
+ This routine polls the Status Register until Data is available or timeout,
+ then it reads and returns the Data.
+
+Arguments:
+
+ C - pointer to a byte where to write the read value
+ msec - time-out time in milliseconds
+
+Return Value:
+
+ TRUE if timeout, FALSE if OK;
+
+--*/
+{
+ TimerTicks=msec;
+ while (TimerTicks) {
+ if (READ_REGISTER_UCHAR(&KEYBOARD_READ->Status) & KBD_OBF_MASK) {
+ *C = READ_REGISTER_UCHAR(&KEYBOARD_READ->Data);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+BOOLEAN
+SendKbdData(
+ IN UCHAR Data
+ )
+/*++
+
+Routine Description:
+
+ This routine polls the Status Register until the controller is ready to
+ accept a data or timeout, then it send the Data.
+
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ TRUE if timeout, FALSE if OK;
+
+--*/
+{
+ ULONG i;
+
+ for (i=0; i <KBD_TIMEOUT; i++) {
+ if ((READ_REGISTER_UCHAR(&KEYBOARD_READ->Status) & KBD_IBF_MASK) == 0) {
+ WRITE_REGISTER_UCHAR(&KEYBOARD_WRITE->Data,Data);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+BOOLEAN
+SendKbdCommand(
+ IN UCHAR Command
+ )
+/*++
+
+Routine Description:
+
+ This routine polls the Status Register until the controller is ready to
+ accept a command or timeout, then it send the Command.
+
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ TRUE if timeout, FALSE if OK;
+
+--*/
+{
+ ULONG i;
+
+ for (i=0; i <KBD_TIMEOUT; i++) {
+ if ((READ_REGISTER_UCHAR(&KEYBOARD_READ->Status) & KBD_IBF_MASK) == 0) {
+ WRITE_REGISTER_UCHAR(&KEYBOARD_WRITE->Command,Command);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+ULONG
+InitKeyboard(
+ )
+/*++
+
+Routine Description:
+
+ This routine enables amd initializes the keyboard.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ FALSE if passed,
+ TRUE if bad ACK or BAT received,
+ TIME_OUT if no response is received from the keyboard.
+
+--*/
+{
+ UCHAR Result;
+ ULONG i;
+
+ //
+ // Send Reset to Keyboard.
+ //
+
+ ClearKbdFifo();
+ for (;;) {
+ if (SendKbdData(KbdReset)) {
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ if (Result == KbdResend) {
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ continue;
+ }
+ if (Result != KbdAck) {
+ return TRUE;
+ }
+ if (GetKbdData(&Result,7000)) {
+ return TIME_OUT;
+ }
+ if (Result != KbdBat) {
+ return TRUE;
+ }
+ break;
+ }
+
+ //
+ // Enable Kbd and Select keyboard Scan code.
+ //
+
+ if (SendKbdCommand(KBD_CTR_ENABLE_KBD)) {
+ return TIME_OUT;
+ }
+ if (SendKbdData(KbdSelScanCode)) {
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ if (SendKbdData(1)) { // select Scan code 1
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ return FALSE;
+}
+
+ULONG
+InitKeyboardController(
+ )
+/*++
+
+Routine Description:
+
+ This routine Initializes the Keyboard controller.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ FALSE if passed,
+ TRUE if bad response received from keyboard controller,
+ TIME_OUT if no response is received from the keyboard controller.
+
+--*/
+{
+ UCHAR Result;
+
+ //
+ // Clear both fifos.
+ //
+
+ ClearKbdFifo();
+
+ //
+ // Send Selftest Command. This has to be done before anything else.
+ //
+
+ if (SendKbdCommand(KBD_CTR_SELFTEST)) {
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ if (Result != Kbd_Ctr_Selftest_Passed) {
+ return TRUE;
+ }
+
+ //
+ // Now the Keyboard and Mouse are disabled.
+ //
+
+ //
+ // Test Keyboard lines.
+ //
+
+ if (SendKbdCommand(KBD_CTR_KBDLINES_TEST)) {
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ if (Result != INTERFACE_NO_ERROR) {
+ return TRUE;
+ }
+
+ //
+ // Test Aux lines.
+ //
+
+ if (SendKbdCommand(KBD_CTR_AUXLINES_TEST)) {
+ return TIME_OUT;
+ }
+ if (GetKbdData(&Result,1000)) {
+ return TIME_OUT;
+ }
+ if (Result != INTERFACE_NO_ERROR) {
+ return TRUE;
+ }
+ return FALSE;
+}