summaryrefslogtreecommitdiff
path: root/board/discovery-stm32f072/board.c
diff options
context:
space:
mode:
authorAnton Staaf <robotboy@chromium.org>2015-07-21 09:46:06 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-07-21 22:36:28 +0000
commit6051f2852767a617f2a66399a9c07e94043ca95a (patch)
treec1d9ae3895401d3efc3eeb65ca05e647e963bade /board/discovery-stm32f072/board.c
parent048436c6d33bc78d5fd3934a527e1e9e8ef1fcc6 (diff)
downloadchrome-ec-6051f2852767a617f2a66399a9c07e94043ca95a.tar.gz
Discovery: Add Forward and Loopback USART configurations
Add example uses of the multi USART driver with DMA transmission and interrupt based reception. USART1 is setup as a loopback device, it just echo's any characters received. USART4 is forwarded over USB. Also fix the alternate function mappings for USART3 and USART4, and add comments for each section of board.c. Signed-off-by: Anton Staaf <robotboy@chromium.org> BRANCH=None BUG=None TEST=make buildall -j Crosswire USART1 to USART4 and cut and paste chunks of text over USB Change-Id: I79170c78e61328caf8067ae8db8810db38880839 Reviewed-on: https://chromium-review.googlesource.com/287195 Trybot-Ready: Anton Staaf <robotboy@chromium.org> Tested-by: Anton Staaf <robotboy@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Commit-Queue: Anton Staaf <robotboy@chromium.org>
Diffstat (limited to 'board/discovery-stm32f072/board.c')
-rw-r--r--board/discovery-stm32f072/board.c113
1 files changed, 99 insertions, 14 deletions
diff --git a/board/discovery-stm32f072/board.c b/board/discovery-stm32f072/board.c
index 8303aa6a27..0ce00c9368 100644
--- a/board/discovery-stm32f072/board.c
+++ b/board/discovery-stm32f072/board.c
@@ -8,29 +8,24 @@
#include "ec_version.h"
#include "gpio.h"
#include "hooks.h"
+#include "queue_policies.h"
#include "registers.h"
#include "spi.h"
#include "task.h"
+#include "usart-stm32f0.h"
+#include "usart_tx_dma.h"
#include "usb_gpio.h"
#include "usb_spi.h"
+#include "usb-stream.h"
#include "util.h"
+/******************************************************************************
+ * Build GPIO tables and expose a subset of the GPIOs over USB.
+ */
void button_event(enum gpio_signal signal);
#include "gpio_list.h"
-void button_event(enum gpio_signal signal)
-{
- static int count = 0;
-
- gpio_set_level(GPIO_LED_U, (count & 0x03) == 0);
- gpio_set_level(GPIO_LED_R, (count & 0x03) == 1);
- gpio_set_level(GPIO_LED_D, (count & 0x03) == 2);
- gpio_set_level(GPIO_LED_L, (count & 0x03) == 3);
-
- count++;
-}
-
static enum gpio_signal const usb_gpio_list[] = {
GPIO_USER_BUTTON,
GPIO_LED_U,
@@ -48,25 +43,107 @@ USB_GPIO_CONFIG(usb_gpio,
USB_IFACE_GPIO,
USB_EP_GPIO);
+/******************************************************************************
+ * Setup USART1 as a loopback device, it just echo's back anything sent to it.
+ */
+static struct usart_config const loopback_usart;
+
+static struct queue const loopback_queue =
+ QUEUE_DIRECT(64, uint8_t,
+ loopback_usart.producer,
+ loopback_usart.consumer);
+
+static struct usart_tx_dma const loopback_tx_dma =
+ USART_TX_DMA(STM32_DMAC_CH2, 16);
+
+static struct usart_config const loopback_usart =
+ USART_CONFIG(usart1_hw,
+ usart_rx_interrupt,
+ loopback_tx_dma.usart_tx,
+ 115200,
+ loopback_queue,
+ loopback_queue);
+
+/******************************************************************************
+ * Forward USART4 as a simple USB serial interface.
+ */
+static struct usart_config const forward_usart;
+struct usb_stream_config const forward_usb;
+
+static struct queue const usart_to_usb = QUEUE_DIRECT(64, uint8_t,
+ forward_usart.producer,
+ forward_usb.consumer);
+static struct queue const usb_to_usart = QUEUE_DIRECT(64, uint8_t,
+ forward_usb.producer,
+ forward_usart.consumer);
+
+static struct usart_tx_dma const forward_tx_dma =
+ USART_TX_DMA(STM32_DMAC_CH7, 16);
+
+static struct usart_config const forward_usart =
+ USART_CONFIG(usart4_hw,
+ usart_rx_interrupt,
+ forward_tx_dma.usart_tx,
+ 115200,
+ usart_to_usb,
+ usb_to_usart);
+
+#define USB_STREAM_RX_SIZE 16
+#define USB_STREAM_TX_SIZE 16
+
+USB_STREAM_CONFIG(forward_usb,
+ USB_IFACE_STREAM,
+ USB_STR_STREAM_NAME,
+ USB_EP_STREAM,
+ USB_STREAM_RX_SIZE,
+ USB_STREAM_TX_SIZE,
+ usb_to_usart,
+ usart_to_usb)
+
+/******************************************************************************
+ * Handle button presses by cycling the LEDs on the board. Also run a tick
+ * handler to cycle them when they are not actively under USB control.
+ */
+void button_event(enum gpio_signal signal)
+{
+ static int count;
+
+ gpio_set_level(GPIO_LED_U, (count & 0x03) == 0);
+ gpio_set_level(GPIO_LED_R, (count & 0x03) == 1);
+ gpio_set_level(GPIO_LED_D, (count & 0x03) == 2);
+ gpio_set_level(GPIO_LED_L, (count & 0x03) == 3);
+
+ count++;
+}
+
void usb_gpio_tick(void)
{
if (usb_gpio.state->set_mask || usb_gpio.state->clear_mask)
return;
+
button_event(0);
}
DECLARE_HOOK(HOOK_TICK, usb_gpio_tick, HOOK_PRIO_DEFAULT);
+/******************************************************************************
+ * Define the strings used in our USB descriptors.
+ */
const void *const usb_strings[] = {
[USB_STR_DESC] = usb_string_desc,
[USB_STR_VENDOR] = USB_STRING_DESC("Google Inc."),
[USB_STR_PRODUCT] = USB_STRING_DESC("discovery-stm32f072"),
[USB_STR_VERSION] = USB_STRING_DESC(CROS_EC_VERSION32),
- [USB_STR_STREAM_NAME] = USB_STRING_DESC("Echo"),
+ [USB_STR_STREAM_NAME] = USB_STRING_DESC("Forward"),
[USB_STR_CONSOLE_NAME] = USB_STRING_DESC("Shell"),
};
BUILD_ASSERT(ARRAY_SIZE(usb_strings) == USB_STR_COUNT);
+
+/******************************************************************************
+ * Support SPI bridging over USB, this requires usb_spi_board_enable and
+ * usb_spi_board_disable to be defined to enable and disable the SPI bridge.
+ */
void usb_spi_board_enable(struct usb_spi_config const *config)
{
/* Remap SPI2 to DMA channels 6 and 7 */
@@ -101,11 +178,19 @@ void usb_spi_board_disable(struct usb_spi_config const *config)
USB_SPI_CONFIG(usb_spi, USB_IFACE_SPI, USB_EP_SPI);
-/* Initialize board. */
+/******************************************************************************
+ * Initialize board.
+ */
static void board_init(void)
{
gpio_enable_interrupt(GPIO_USER_BUTTON);
+ queue_init(&loopback_queue);
+ queue_init(&usart_to_usb);
+ queue_init(&usb_to_usart);
+ usart_init(&loopback_usart);
+ usart_init(&forward_usart);
+
usb_spi_enable(&usb_spi, 1);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);