summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMary Ruthven <mruthven@chromium.org>2016-04-21 12:35:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-04-29 16:07:13 -0700
commit61e065326117f6aef474164a6a42fa0e50eeb096 (patch)
treed71d82b1e45a045fcecae1dea7e2c85f8457943c
parent43a0c703465d22cadff185792ba34932c4b4ba3f (diff)
downloadchrome-ec-61e065326117f6aef474164a6a42fa0e50eeb096.tar.gz
cr50: add basic rbox support
This change modifies the behavior of RBOX by blocking the key0 and key1 output, when the power button is pressed. It also adds support for printing debug statements when various RBOX interrupts are triggered. BUG=none BRANCH=none TEST=On cr50 test board verify key0 and key1 out are not asserted unless the power button is pressed. Change-Id: I67a3c1b8009279015bdc87bcf0995cffa9ab6f03 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/341470 Tested-by: Bill Richardson <wfrichar@chromium.org> Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--board/cr50/board.h2
-rw-r--r--chip/g/build.mk1
-rw-r--r--chip/g/clock.c3
-rw-r--r--chip/g/rbox.c88
-rw-r--r--chip/g/rbox.h35
-rw-r--r--include/config.h6
-rw-r--r--include/console_channel.inc5
-rw-r--r--include/module_id.h13
8 files changed, 147 insertions, 6 deletions
diff --git a/board/cr50/board.h b/board/cr50/board.h
index 126aaf2cea..234c164ac5 100644
--- a/board/cr50/board.h
+++ b/board/cr50/board.h
@@ -48,6 +48,8 @@
#define CONFIG_SPS
#define CONFIG_TPM_SPS
+#define CONFIG_RBOX
+
/* We don't need to send events to the AP */
#undef CONFIG_HOSTCMD_EVENTS
diff --git a/chip/g/build.mk b/chip/g/build.mk
index 9f8118ccb2..09f2d9c536 100644
--- a/chip/g/build.mk
+++ b/chip/g/build.mk
@@ -53,6 +53,7 @@ chip-$(CONFIG_USB_CONSOLE)+=usb_console.o
chip-$(CONFIG_USB_HID)+=usb_hid.o
chip-$(CONFIG_USB_BLOB)+=blob.o
chip-$(CONFIG_RDD)+=rdd.o
+chip-$(CONFIG_RBOX)+=rbox.o
chip-$(CONFIG_STREAM_USB)+=usb-stream.o
chip-$(CONFIG_STREAM_USART)+=usart.o
diff --git a/chip/g/clock.c b/chip/g/clock.c
index 25e93b0367..0dc10f9c68 100644
--- a/chip/g/clock.c
+++ b/chip/g/clock.c
@@ -30,6 +30,9 @@ void clock_enable_module(enum module_id module, int enable)
clock_func(PERIPH_I2C0);
clock_func(PERIPH_I2C1);
break;
+ case MODULE_RBOX:
+ clock_func(PERIPH_RBOX);
+ break;
case MODULE_RDD:
clock_func(PERIPH_RDD0);
break;
diff --git a/chip/g/rbox.c b/chip/g/rbox.c
new file mode 100644
index 0000000000..56c58b72df
--- /dev/null
+++ b/chip/g/rbox.c
@@ -0,0 +1,88 @@
+/* Copyright 2016 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 "clock.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "rbox.h"
+#include "task.h"
+
+#ifdef CONFIG_RBOX_DEBUG
+RBOX_INT(KEY0_IN_FED, "KEY0 pressed");
+RBOX_INT(KEY0_IN_RED, "KEY0 released");
+RBOX_INT(KEY1_IN_FED, "KEY1 pressed");
+RBOX_INT(KEY1_IN_RED, "KEY1 released");
+RBOX_INT(PWRB_IN_FED, "PWRB pressed");
+RBOX_INT(PWRB_IN_RED, "PWRB released");
+RBOX_INT(EC_RST_RED, "EC RST rising");
+RBOX_INT(EC_RST_FED, "EC RST falling");
+RBOX_INT(AC_PRESENT_RED, "AC attached");
+RBOX_INT(AC_PRESENT_FED, "AC detached");
+
+RBOX_INT(BUTTON_COMBO0_RDY, "COMBO0");
+RBOX_INT(BUTTON_COMBO1_RDY, "COMBO1");
+RBOX_INT(BUTTON_COMBO2_RDY, "COMBO2");
+
+static void enable_interrupts(void)
+{
+ ENABLE_INT_RF(ENTERING_RW);
+ ENABLE_INT_RF(AC_PRESENT);
+ ENABLE_INT_RF(PWRB_IN);
+ ENABLE_INT_RF(KEY1_IN);
+ ENABLE_INT_RF(KEY0_IN);
+ ENABLE_INT_RF(EC_RST);
+ ENABLE_INT(BUTTON_COMBO0_RDY);
+ ENABLE_INT(BUTTON_COMBO1_RDY);
+ ENABLE_INT(BUTTON_COMBO2_RDY);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_AC_PRESENT_FED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_AC_PRESENT_RED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_PWRB_IN_FED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_PWRB_IN_RED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY0_IN_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY0_IN_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY1_IN_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_KEY1_IN_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_EC_RST_RED_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_EC_RST_FED_INT);
+
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO0_RDY_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO1_RDY_INT);
+ task_enable_irq(GC_IRQNUM_RBOX0_INTR_BUTTON_COMBO2_RDY_INT);
+}
+#endif
+
+void rbox_init(void)
+{
+ /* Enable RBOX */
+ clock_enable_module(MODULE_RBOX, 1);
+
+ /* Clear existing interrupts */
+ GWRITE(RBOX, WAKEUP_CLEAR, 1);
+ GWRITE(RBOX, INT_STATE, 1);
+
+ /* Make sure fuse override is not already enabled */
+ GWRITE(RBOX, FUSE_CTRL, 0);
+
+ /* Block output from key0 and 1 when power button is pressed */
+ GWRITE_FIELD(RBOX, DEBUG_BLOCK_OUTPUT, KEY0_SEL, 1);
+ GWRITE_FIELD(RBOX, DEBUG_BLOCK_OUTPUT, KEY1_SEL, 1);
+
+ /* Increase debounce */
+ GWRITE_FIELD(RBOX, DEBUG_DEBOUNCE, PERIOD, 15);
+
+ /* Enable debug override */
+ GWRITE_FIELD(RBOX, FUSE_CTRL, OVERRIDE_FUSE, 1);
+ GWRITE_FIELD(RBOX, FUSE_CTRL, OVERRIDE_FUSE_READY, 1);
+
+#ifdef CONFIG_RBOX_DEBUG
+ enable_interrupts();
+#endif
+}
+DECLARE_HOOK(HOOK_INIT, rbox_init, HOOK_PRIO_DEFAULT);
diff --git a/chip/g/rbox.h b/chip/g/rbox.h
new file mode 100644
index 0000000000..c2a09c8432
--- /dev/null
+++ b/chip/g/rbox.h
@@ -0,0 +1,35 @@
+/* Copyright 2016 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.
+ */
+
+#ifndef __CROS_RBOX_H
+#define __CROS_RBOX_H
+
+#include "console.h"
+#include "registers.h"
+
+/* Console output macros */
+#define CPUTS(outstr) cputs(CC_RBOX, outstr)
+#define CPRINTS(format, args...) cprints(CC_RBOX, format, ## args)
+
+#ifdef CONFIG_RBOX_DEBUG
+#define INTR(field) CONCAT2(INTR_, field)
+
+#define ENABLE_INT(field) GWRITE_FIELD(RBOX, INT_ENABLE, INTR(field), 1)
+#define ENABLE_INT_RF(field) (ENABLE_INT(CONCAT2(field, _RED)) && \
+ ENABLE_INT(CONCAT2(field, _FED)))
+
+#define RBOX_INT(NAME, NAME_STR) \
+ \
+ DECLARE_IRQ(CONCAT3(GC_IRQNUM_RBOX0_INTR_, NAME, _INT), \
+ CONCAT2(NAME, _int_), 1); \
+ void CONCAT2(NAME, _int_)(void) \
+ { \
+ CPRINTS("%s", NAME_STR); \
+ /* Clear interrupt */ \
+ GWRITE_FIELD(RBOX, INT_STATE, INTR(NAME), 1); \
+ }
+
+#endif /* DEBUG_RBOX */
+#endif /* __CROS_RDD_H */
diff --git a/include/config.h b/include/config.h
index aab9952def..19a51cd194 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1484,6 +1484,12 @@
/* Size of RAM available on the chip, in bytes */
#undef CONFIG_RAM_SIZE
+/* Enable rbox peripheral */
+#undef CONFIG_RBOX
+
+/* Enable rbox debug interrupts */
+#undef CONFIG_RBOX_DEBUG
+
/* Enable RDD peripheral */
#undef CONFIG_RDD
diff --git a/include/console_channel.inc b/include/console_channel.inc
index 9f63908074..0e717e8eee 100644
--- a/include/console_channel.inc
+++ b/include/console_channel.inc
@@ -15,7 +15,9 @@ CONSOLE_CHANNEL(CC_CHIPSET, "chipset")
CONSOLE_CHANNEL(CC_CLOCK, "clock")
CONSOLE_CHANNEL(CC_DMA, "dma")
CONSOLE_CHANNEL(CC_EVENTS, "events")
+#ifdef CONFIG_GESTURE_SW_DETECTION
CONSOLE_CHANNEL(CC_GESTURE, "gesture")
+#endif
CONSOLE_CHANNEL(CC_GPIO, "gpio")
CONSOLE_CHANNEL(CC_HOSTCMD, "hostcmd")
CONSOLE_CHANNEL(CC_I2C, "i2c")
@@ -34,6 +36,9 @@ CONSOLE_CHANNEL(CC_PD_HOST_CMD, "pdhostcm")
CONSOLE_CHANNEL(CC_PORT80, "port80")
CONSOLE_CHANNEL(CC_PWM, "pwm")
CONSOLE_CHANNEL(CC_SPI, "spi")
+#ifdef CONFIG_RBOX
+CONSOLE_CHANNEL(CC_RBOX, "rbox")
+#endif
#ifdef CONFIG_SPS
CONSOLE_CHANNEL(CC_SPS, "sps")
#endif
diff --git a/include/module_id.h b/include/module_id.h
index 8697cbdd85..72849afa4d 100644
--- a/include/module_id.h
+++ b/include/module_id.h
@@ -33,20 +33,21 @@ enum module_id {
MODULE_POWER_LED,
MODULE_PWM, /* 20 */
MODULE_RDD,
+ MODULE_RBOX,
MODULE_SPI,
MODULE_SPI_FLASH,
- MODULE_SPI_MASTER,
- MODULE_SWITCH, /* 25 */
+ MODULE_SPI_MASTER, /* 25 */
+ MODULE_SWITCH,
MODULE_SYSTEM,
MODULE_TASK,
MODULE_THERMAL,
- MODULE_UART,
- MODULE_USART, /* 30 */
+ MODULE_UART, /* 30 */
+ MODULE_USART,
MODULE_USB,
MODULE_USB_DEBUG,
MODULE_USB_PD,
- MODULE_USB_PORT_POWER,
- MODULE_USB_SWITCH, /* 35 */
+ MODULE_USB_PORT_POWER, /* 35 */
+ MODULE_USB_SWITCH,
MODULE_VBOOT,
/* Module count; not an actual module */