summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 */