summaryrefslogtreecommitdiff
path: root/common/console_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/console_output.c')
-rw-r--r--common/console_output.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/common/console_output.c b/common/console_output.c
new file mode 100644
index 0000000000..e9f7bf0d97
--- /dev/null
+++ b/common/console_output.c
@@ -0,0 +1,114 @@
+/* Copyright (c) 2012 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.
+ */
+
+/* Console output module for Chrome EC */
+
+#include "console.h"
+#include "uart.h"
+#include "util.h"
+
+/* Default to all channels active */
+#ifndef CC_DEFAULT
+#define CC_DEFAULT CC_ALL
+#endif
+static uint32_t channel_mask = CC_DEFAULT;
+
+/* List of channel names; must match enum console_channel. */
+/* TODO: move this to board.c */
+static const char *channel_names[CC_CHANNEL_COUNT] = {
+ "command",
+ "charger",
+ "chipset",
+ "dma",
+ "gpio",
+ "hostcmd",
+ "i2c",
+ "i8042",
+ "keyboard",
+ "keyscan",
+ "lightbar",
+ "lpc",
+ "port80",
+ "powerbtn",
+ "pwm",
+ "spi",
+ "system",
+ "task",
+ "usbcharge",
+ "vboot",
+};
+
+/*****************************************************************************/
+/* Channel-based console output */
+
+int cputs(enum console_channel channel, const char *outstr)
+{
+ /* Filter out inactive channels */
+ if (!(CC_MASK(channel) & channel_mask))
+ return EC_SUCCESS;
+
+ return uart_puts(outstr);
+}
+
+
+int cprintf(enum console_channel channel, const char *format, ...)
+{
+ int rv;
+ va_list args;
+
+ /* Filter out inactive channels */
+ if (!(CC_MASK(channel) & channel_mask))
+ return EC_SUCCESS;
+
+ va_start(args, format);
+ rv = uart_vprintf(format, args);
+ va_end(args);
+ return rv;
+}
+
+
+void cflush(void)
+{
+ uart_flush_output();
+}
+
+/*****************************************************************************/
+/* Console commands */
+
+/* Set active channels */
+static int command_ch(int argc, char **argv)
+{
+ int i;
+ char *e;
+
+ /* If one arg, set the mask */
+ if (argc == 2) {
+ int m = strtoi(argv[1], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM1;
+
+ /* No disabling the command output channel */
+ channel_mask = m | CC_MASK(CC_COMMAND);
+
+ /* TODO: save channel list to EEPROM */
+
+ return EC_SUCCESS;
+ }
+
+ /* Print the list of channels */
+ ccputs(" # Mask E Channel\n");
+ for (i = 0; i < CC_CHANNEL_COUNT; i++) {
+ ccprintf("%2d %08x %c %s\n",
+ i, CC_MASK(i),
+ (channel_mask & CC_MASK(i)) ? '*' : ' ',
+ channel_names[i]);
+ cflush();
+ }
+ return EC_SUCCESS;
+};
+DECLARE_CONSOLE_COMMAND(chan, command_ch,
+ "[mask]",
+ "Get or set console channel mask",
+ NULL);