summaryrefslogtreecommitdiff
path: root/chip/it83xx/keyboard_raw.c
diff options
context:
space:
mode:
authorDino Li <dino.li@ite.com.tw>2015-03-20 17:14:45 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-03-22 03:13:58 +0000
commit2c3cf4d1a9d6ed732985ea495e8ebfe1d09a916b (patch)
tree8903dec2bb649fdccfe7af9edcf6cb4c6275f3a6 /chip/it83xx/keyboard_raw.c
parentc12181d9af8fbe0b61ac522e813bec463571dda5 (diff)
downloadchrome-ec-2c3cf4d1a9d6ed732985ea495e8ebfe1d09a916b.tar.gz
it8380dev: add KBC/KMSC module
1. DLM 16KB. 2. Add KBC/KMSC module for emulation board. Signed-off-by: Dino Li <dino.li@ite.com.tw> BRANCH=none BUG=none TEST=EVB + x86 MB can boot into DOS and keyboard works. Change-Id: Ia5cc2d4f1733ce07879d410b0447b2d48e50cd95 Reviewed-on: https://chromium-review.googlesource.com/259923 Reviewed-by: Vincent Palatin <vpalatin@chromium.org> Tested-by: Dino Li <dino.li@ite.com.tw> Commit-Queue: Dino Li <dino.li@ite.com.tw>
Diffstat (limited to 'chip/it83xx/keyboard_raw.c')
-rw-r--r--chip/it83xx/keyboard_raw.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/chip/it83xx/keyboard_raw.c b/chip/it83xx/keyboard_raw.c
new file mode 100644
index 0000000000..48749008d2
--- /dev/null
+++ b/chip/it83xx/keyboard_raw.c
@@ -0,0 +1,138 @@
+/* Copyright 2015 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "common.h"
+#include "keyboard_raw.h"
+#include "keyboard_scan.h"
+#include "registers.h"
+#include "task.h"
+#include "irq_chip.h"
+
+/*
+ * Initialize the raw keyboard interface.
+ */
+void keyboard_raw_init(void)
+{
+ /* Ensure top-level interrupt is disabled */
+ keyboard_raw_enable_interrupt(0);
+
+ /*
+ * bit2, Setting 1 enables the internal pull-up of the KSO[15:0] pins.
+ * To pull up KSO[17:16], set the GPCR registers of their
+ * corresponding GPIO ports.
+ * bit0, Setting 1 enables the open-drain mode of the KSO[17:0] pins.
+ */
+ IT83XX_KBS_KSOCTRL = 0x05;
+
+ /* bit2, 1 enables the internal pull-up of the KSI[7:0] pins. */
+ IT83XX_KBS_KSICTRL = 0x04;
+
+ /* KSO[7:0] pins low. */
+ IT83XX_KBS_KSOL = 0x00;
+
+ /* KSO[15:8] pins low. */
+ IT83XX_KBS_KSOH1 = 0x00;
+
+#ifdef CONFIG_KEYBOARD_KSI_WUC_INT
+ /* KSI[0-7] falling-edge triggered is selected */
+ IT83XX_WUC_WUEMR3 = 0xFF;
+
+ /* W/C */
+ IT83XX_WUC_WUESR3 = 0xFF;
+
+ task_clear_pending_irq(IT83XX_IRQ_WKINTC);
+
+ /* Enable WUC for KSI[0-7] */
+ IT83XX_WUC_WUENR3 = 0xFF;
+#else
+ task_clear_pending_irq(IT83XX_IRQ_KB_MATRIX);
+#endif
+
+ keyboard_raw_enable_interrupt(1);
+}
+
+/*
+ * Finish initialization after task scheduling has started.
+ */
+void keyboard_raw_task_start(void)
+{
+#ifdef CONFIG_KEYBOARD_KSI_WUC_INT
+ IT83XX_WUC_WUESR3 = 0xFF;
+ task_clear_pending_irq(IT83XX_IRQ_WKINTC);
+ task_enable_irq(IT83XX_IRQ_WKINTC);
+#else
+ task_clear_pending_irq(IT83XX_IRQ_KB_MATRIX);
+ task_enable_irq(IT83XX_IRQ_KB_MATRIX);
+#endif
+}
+
+/*
+ * Drive the specified column low.
+ */
+test_mockable void keyboard_raw_drive_column(int col)
+{
+ int mask;
+
+ /* Tri-state all outputs */
+ if (col == KEYBOARD_COLUMN_NONE)
+ mask = 0xffff;
+ /* Assert all outputs */
+ else if (col == KEYBOARD_COLUMN_ALL)
+ mask = 0;
+ /* Assert a single output */
+ else
+ mask = 0xffff ^ (1 << col);
+
+ IT83XX_KBS_KSOL = mask & 0xff;
+ IT83XX_KBS_KSOH1 = (mask >> 8) & 0xff;
+}
+
+/*
+ * Read raw row state.
+ * Bits are 1 if signal is present, 0 if not present.
+ */
+test_mockable int keyboard_raw_read_rows(void)
+{
+ /* Bits are active-low, so invert returned levels */
+ return IT83XX_KBS_KSI ^ 0xff;
+}
+
+/*
+ * Enable or disable keyboard matrix scan interrupts.
+ */
+void keyboard_raw_enable_interrupt(int enable)
+{
+ if (enable) {
+#ifdef CONFIG_KEYBOARD_KSI_WUC_INT
+ IT83XX_WUC_WUESR3 = 0xFF;
+ task_clear_pending_irq(IT83XX_IRQ_WKINTC);
+ task_enable_irq(IT83XX_IRQ_WKINTC);
+#else
+ task_clear_pending_irq(IT83XX_IRQ_KB_MATRIX);
+ task_enable_irq(IT83XX_IRQ_KB_MATRIX);
+#endif
+ } else {
+#ifdef CONFIG_KEYBOARD_KSI_WUC_INT
+ task_disable_irq(IT83XX_IRQ_WKINTC);
+#else
+ task_disable_irq(IT83XX_IRQ_KB_MATRIX);
+#endif
+ }
+}
+
+/*
+ * Interrupt handler for keyboard matrix scan interrupt.
+ */
+void keyboard_raw_interrupt(void)
+{
+#ifdef CONFIG_KEYBOARD_KSI_WUC_INT
+ task_disable_irq(IT83XX_IRQ_WKINTC);
+#else
+ task_disable_irq(IT83XX_IRQ_KB_MATRIX);
+#endif
+
+ /* Wake the scan task */
+ task_wake(TASK_ID_KEYSCAN);
+}