diff options
Diffstat (limited to 'common/console_output.c')
-rw-r--r-- | common/console_output.c | 114 |
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); |