cr50: added cr50 a1 chip

cr50_a1 is for cr50 Rev A1 chip.

BUG=chrome-os-partner:33432
BRANCH=none
TEST=Compile Only

Change-Id: I5490d1a5b89fa66c8e8b969cff7538a293a7d053
Signed-off-by: Sheng-Liang Song <ssl@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/259847
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
This commit is contained in:
Sheng-Liang Song
2015-03-13 13:20:15 -07:00
committed by ChromeOS Commit Bot
parent 746debdf20
commit bdcc496b30
13 changed files with 18598 additions and 7 deletions

View File

@@ -6,6 +6,8 @@
# Board specific files build
CHIP:=g
CHIP_FAMILY:=cr50
CHIP_VARIANT:=cr50_fpga
board-y=board.o

1
board/cr50_a1/Makefile Symbolic link
View File

@@ -0,0 +1 @@
../../Makefile

51
board/cr50_a1/board.c Normal file
View File

@@ -0,0 +1,51 @@
/* Copyright (c) 2014 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 "console.h"
#include "gpio.h"
#include "hooks.h"
#include "registers.h"
#include "task.h"
#include "util.h"
/*
* There's no way to trigger on both rising and falling edges, so force a
* compiler error if we try. The workaround is to use the pinmux to connect
* two GPIOs to the same input and configure each one for a separate edge.
*/
#undef GPIO_INT_BOTH
#define GPIO_INT_BOTH NOT_SUPPORTED_ON_CR50
#include "gpio_list.h"
/* Interrupt handler for button pushes */
void button_event(enum gpio_signal signal)
{
int v;
/* We have two GPIOs on the same input (one rising edge, one falling
* edge), so de-alias them */
if (signal >= GPIO_SW_N_)
signal -= (GPIO_SW_N_ - GPIO_SW_N);
v = gpio_get_level(signal);
ccprintf("Button %d = %d\n", signal, v);
gpio_set_level(signal - GPIO_SW_N + GPIO_LED_4, v);
}
/* Initialize board. */
static void board_init(void)
{
gpio_enable_interrupt(GPIO_SW_N);
gpio_enable_interrupt(GPIO_SW_S);
gpio_enable_interrupt(GPIO_SW_W);
gpio_enable_interrupt(GPIO_SW_E);
gpio_enable_interrupt(GPIO_SW_N_);
gpio_enable_interrupt(GPIO_SW_S_);
gpio_enable_interrupt(GPIO_SW_W_);
gpio_enable_interrupt(GPIO_SW_E_);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);

38
board/cr50_a1/board.h Normal file
View File

@@ -0,0 +1,38 @@
/* Copyright (c) 2014 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 __BOARD_H
#define __BOARD_H
/* Features that we don't want just yet */
#undef CONFIG_CMD_LID_ANGLE
#undef CONFIG_CMD_POWERINDEBUG
#undef CONFIG_DMA_DEFAULT_HANDLERS
#undef CONFIG_FLASH
#undef CONFIG_FMAP
#undef CONFIG_HIBERNATE
#undef CONFIG_LID_SWITCH
/*
* Allow dangerous commands all the time, since we don't have a write protect
* switch.
*/
#define CONFIG_SYSTEM_UNLOCKED
/* Not using software sync, so verify RW signature instead */
#define CONFIG_RWSIG
#define CONFIG_RSA
#define CONFIG_SHA256
#ifndef __ASSEMBLER__
#include "gpio_signal.h"
/* user button interrupt handler */
void button_event(enum gpio_signal signal);
#endif /* !__ASSEMBLER__ */
#endif /* __BOARD_H */

15
board/cr50_a1/build.mk Normal file
View File

@@ -0,0 +1,15 @@
# -*- makefile -*-
# Copyright (c) 2014 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.
#
# Board specific files build
CHIP:=g
CHIP_FAMILY:=cr50
CHIP_VARIANT:=cr50_a1
board-y=board.o
# Need to generate a .hex file
all: hex

27
board/cr50_a1/dev_key.pem Normal file
View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsaHkxeqOorLS8/Ixp43ZnPnJ+ItBIbX4AkmKFLZyLus9NaFX
j2r+qIM0Daxsaq/qvtlnRNrQ313XH/F5e1xrdTcC4VovR8Q4wXh+hEw4Nhcz2U/c
daZMaBJUZlYEHpi2R9UXcflDS68oE5GNJT5EuGfqdpvStTFMU33Bv7cxgf3lQg2c
fhMoNNjTxzzR+ta0lmaQLZ7kh6IOIb0SoTmANvmtANPdIC4NTHk43KSRTShOTYRs
b7pbOrFq+7bmDWhgfHv7Y34Y2f0LouXlzJEfGnlpXYOX5WA9H9XMbBGwhjKNq5R6
YHW069FyT6G28VceY+i3SMdgoEgyNPn/GHK02wIDAQABAoIBAAX35JHp0aUR0Ri1
OInisD8f/XNGaofRb2XURrlvb+K3sLTOmPyOocPTtLoI4xOqmX6UG24q0/3NT18Z
Y/WLI2kq0gP0XcZRh36op8eWMAVRPkK89jFVxxdwFjniBf1pMCa1uDXyJBq05enS
aCWqM/DmPPCDR88iuufLP+lLJHSznt2vDjbONcU+MVtuymrBkYR/APPSl7CPNmF4
WPhWoVbj5tgOO5XUTU/wFRLgnD2FfPiS0g26AKeriJWTeD2dZHFcmJAoFxs1du18
1r4yAZveEcT+RgVsXa9L+/OTd+uuPVzlgEBhyP2xSiFN9TMPlpBdsWrDtx4ZFnQV
ajMVeGECgYEA11TbaI6G5xEhCaz+11v8UYIX1V9KXTJz1fuy4qyItduf27O3egAO
KhUu8nxTpj2JTj65ZPWlTahLF5UKuyAbOmyP5OZBSmZHqfATMh8jEz50mfTWgtew
KzswTtslXV8ekaVBta+aNUJrptqtpVK9PpE1yAOjmw42vk3YgbL4pzkCgYEA0y5P
R3u0pS9ZFfI7cFOFBZm2B+e6Md2P/8zmyzJakIQhHVbAWkhc6BIocUe0xSVG0ceq
3n2QPfkmWrZrUSp+5n9ouaC8ixqWrHU7xbGHLklWsq+WpI0PvNTftPS9akVJV4D9
xD1K8lpPQuakuOmctUco2G4p1LSwbfQqwe48CLMCgYAanR5RGeyKeo9+xqborzHM
USvo71IdmrK+a9F8Op7a+z4SxW+T4JXflaarybn8/fYOeaooVEQOCRLe40jkP9+d
pPVT8TF4pJOO6WE1/Ks1Ia7/qEcq/MWFUldyJ5vCopMApVAtyHpiwsbTZIu5tzQ0
m3XuNqTt8R/K/YwY26nn4QKBgB3gl2bNoakdIcVxF+e0aUV5kb9ckYMsjYrrOlvV
K+r2RpkYBO7A/iP3LbGZK4IY3AQh85K2wQmDjmGXHWfGU13Y+MAKdaJYiKitjV9S
1oU96v4syWtOacOVenDnj0TRuKagoUZ6RXg0PrKAXx2qL3mWL7kvHMvzJGLqAIKf
ae7xAoGAClWOT/hzzUROAVYIYszYUXrVAtCC896m8b8VRG1kL3GL/pOyKoqvVybi
Mx9V1mi/oFcBA2MGDAaJUJEQ7JYih/go3auzEmL3zQHzeLofaldFjOt2kN1ff6UF
HKyS+l/Ub1NVhHkXoVZpo6spKyMG/iPm4qr+rIvkwwfF1e2OADU=
-----END RSA PRIVATE KEY-----

21
board/cr50_a1/ec.tasklist Normal file
View File

@@ -0,0 +1,21 @@
/* Copyright (c) 2014 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.
*/
/**
* List of enabled tasks in the priority order
*
* The first one has the lowest priority.
*
* For each task, use the macro TASK_ALWAYS(n, r, d, s) for base tasks and
* TASK_NOTEST(n, r, d, s) for tasks that can be excluded in test binaries,
* where :
* 'n' in the name of the task
* 'r' in the main routine of the task
* 'd' in an opaque parameter passed to the routine at startup
* 's' is the stack size in bytes; must be a multiple of 8
*/
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(CONSOLE, console_task, NULL, TASK_STACK_SIZE)

65
board/cr50_a1/gpio.inc Normal file
View File

@@ -0,0 +1,65 @@
/*
* Copyright (c) 2014 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.
*/
/* Inputs with interrupt handlers are first for efficiency */
/* User Push buttons */
GPIO(SW_N, 0, 0, GPIO_INT_RISING, button_event)
GPIO(SW_S, 0, 1, GPIO_INT_RISING, button_event)
GPIO(SW_W, 0, 2, GPIO_INT_RISING, button_event)
GPIO(SW_E, 0, 3, GPIO_INT_RISING, button_event)
/* We can't trigger on both rising and falling edge, so attach each button
* to two input GPIOs. */
GPIO(SW_N_, 1, 0, GPIO_INT_FALLING, button_event)
GPIO(SW_S_, 1, 1, GPIO_INT_FALLING, button_event)
GPIO(SW_W_, 1, 2, GPIO_INT_FALLING, button_event)
GPIO(SW_E_, 1, 3, GPIO_INT_FALLING, button_event)
/* User GPIO LEDs */
GPIO(LED_2, 0, 4, GPIO_OUT_LOW, NULL)
GPIO(LED_3, 0, 5, GPIO_OUT_LOW, NULL)
GPIO(LED_4, 0, 6, GPIO_OUT_LOW, NULL)
GPIO(LED_5, 0, 7, GPIO_OUT_LOW, NULL)
GPIO(LED_6, 0, 8, GPIO_OUT_LOW, NULL)
GPIO(LED_7, 0, 9, GPIO_OUT_LOW, NULL)
/* Unimplemented signals which we need to emulate for now */
UNIMPLEMENTED(ENTERING_RW)
/* The Cr50 ARM core has no alternate functions, so we repurpose that
* macro to describe the PINMUX setup. The args are
*
* 1. The ARM core GPIO or SoC peripheral function to connect
* 2. The pinmux DIO pad to connect to
* 3. <ignored>
* 4. MODULE_GPIO, to prevent being called by gpio_config_module()
* 5. flags to specify the direction if the GPIO isn't enough
*/
/* The serial port is one of the SoC peripheral functions */
ALTERNATE(FUNC(UART0_TX), DIO(A0), 0, MODULE_GPIO, DIO_OUTPUT)
ALTERNATE(FUNC(UART0_RX), DIO(A1), 0, MODULE_GPIO, DIO_INPUT)
/* Inputs */
ALTERNATE(SW_N, DIO(M0), 0, MODULE_GPIO, 0)
ALTERNATE(SW_S, DIO(M1), 0, MODULE_GPIO, 0)
ALTERNATE(SW_W, DIO(M2), 0, MODULE_GPIO, 0)
ALTERNATE(SW_E, DIO(M3), 0, MODULE_GPIO, 0)
/* Aliased Inputs, connected to the same pins */
ALTERNATE(SW_N_, DIO(M0), 0, MODULE_GPIO, 0)
ALTERNATE(SW_S_, DIO(M1), 0, MODULE_GPIO, 0)
ALTERNATE(SW_W_, DIO(M2), 0, MODULE_GPIO, 0)
ALTERNATE(SW_E_, DIO(M3), 0, MODULE_GPIO, 0)
/* Outputs - also mark as inputs so we can read back from the driven pin */
ALTERNATE(LED_2, DIO(A9), 0, MODULE_GPIO, DIO_INPUT)
ALTERNATE(LED_3, DIO(A10), 0, MODULE_GPIO, DIO_INPUT)
ALTERNATE(LED_4, DIO(A11), 0, MODULE_GPIO, DIO_INPUT)
ALTERNATE(LED_5, DIO(A12), 0, MODULE_GPIO, DIO_INPUT)
ALTERNATE(LED_6, DIO(A13), 0, MODULE_GPIO, DIO_INPUT)
ALTERNATE(LED_7, DIO(A14), 0, MODULE_GPIO, DIO_INPUT)

View File

@@ -11,7 +11,7 @@ CFLAGS_CPU+=-march=armv7-m -mcpu=cortex-m3
ver_defs := GC___MAJOR_REV__ GC___MINOR_REV__
bld_defs := GC_SWDP_BUILD_DATE_DEFAULT GC_SWDP_BUILD_TIME_DEFAULT
ver_params := $(shell echo "$(ver_defs) $(bld_defs)" | $(CPP) $(CPPFLAGS) -P \
-imacros chip/g/gc_regdefs.h | sed -e "s/__REV\([A-Z]\)__/\1/")
-imacros chip/g/${CHIP_VARIANT}_regdefs.h | sed -e "s/__REV\([A-Z]\)__/\1/")
ver_str := $(shell printf "%s%s %d_%d" $(ver_params))
CPPFLAGS+= -DGC_REVISION="$(ver_str)"

18363
chip/g/cr50_a1_regdefs.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -7,9 +7,22 @@
#define __CROS_EC_REGISTERS_H
#include "common.h"
#include "gc_regdefs.h"
#if defined(CHIP_VARIANT_CR50_FPGA)
#include "cr50_fpga_regdefs.h"
#define PCLK_FREQ 30000000
#elif defined(CHIP_VARIANT_CR50_A1)
#include "cr50_a1_regdefs.h"
#define PCLK_FREQ 24000000
#else
#error "Unsupported CR50 chip variant"
#endif
#include "util.h"
/* Constants for setting baud rate */
#define DEFAULT_UART_FREQ 1000000
#define UART_NCO_WIDTH 16
/* Replace masked bits with val << lsb */
#define REG_WRITE_MLV(reg, mask, lsb, val) reg = ((reg & ~mask) | ((val << lsb) & mask))

View File

@@ -124,11 +124,6 @@ void uart_ec_rx_interrupt(void)
}
DECLARE_IRQ(GC_IRQNUM_UART0_RXINT, uart_ec_rx_interrupt, 1);
/* Constants for setting baud rate */
#define PCLK_FREQ 30000000
#define DEFAULT_UART_FREQ 1000000
#define UART_NCO_WIDTH 16
void uart_init(void)
{
long long setting = (16 * (1 << UART_NCO_WIDTH) *