diff options
-rw-r--r-- | board/cr50/board.h | 2 | ||||
-rw-r--r-- | chip/g/build.mk | 1 | ||||
-rw-r--r-- | chip/g/clock.c | 3 | ||||
-rw-r--r-- | chip/g/rbox.c | 88 | ||||
-rw-r--r-- | chip/g/rbox.h | 35 | ||||
-rw-r--r-- | include/config.h | 6 | ||||
-rw-r--r-- | include/console_channel.inc | 5 | ||||
-rw-r--r-- | include/module_id.h | 13 |
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 */ |