diff options
author | Bill Richardson <wfrichar@chromium.org> | 2015-12-09 16:08:27 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-12-10 14:01:15 -0800 |
commit | 8acf3ebe2e213902d17adf143bea5f0b9991ebd0 (patch) | |
tree | 940e8c3d19a8ac60f1edfe283c25bc807ec12863 | |
parent | 55e5649494918be90f8c2651f40b7b896104a14e (diff) | |
download | chrome-ec-stabilize-7729.B.tar.gz |
Cr50: tweaks to debug output and a comment or twostabilize-7729.B
No functional changes, just some additional debug stuff that's
not normally compiled.
BUG=none
BRANCH=none
TEST=make buildall, manual
Connect the Cr50 to my workstation via USB:
* /bin/dmesg reports no errors
* verify EP0 with lsusb -v -d 18d1:5014
* verify EP1 with './extra/usb_console -e 1 -p 5014' (reverses
case of input text)
* verify EP2 with the 'hid' command on the EC console (types a 'g')
Change-Id: I32b4944c01006f2e9c8cdb2e732a4b1710a60e19
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/317560
-rw-r--r-- | chip/g/usb.c | 130 |
1 files changed, 104 insertions, 26 deletions
diff --git a/chip/g/usb.c b/chip/g/usb.c index f233b6bbc9..a5026dcd1d 100644 --- a/chip/g/usb.c +++ b/chip/g/usb.c @@ -41,20 +41,19 @@ #define CPRINTS(format, args...) cprints(CC_USB, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USB, format, ## args) +/* This is not defined anywhere else. Change it here to debug. */ +#undef DEBUG_ME +#ifdef DEBUG_ME /* - * We want to print a bunch of things from within the interrupt handlers, but - * if we try it'll 1) stop working, and 2) mess up the timing that we're trying - * to measure. Use this instead to print when we have a chance. - */ -#if 1 -/* do nothing */ -#define print_later(...) -#else -/* - * Fill a circular buffer with things to print when we get the chance. The - * number of args is fixed, and there's no rollover detection. + * For debugging we want to print a bunch of things from within the interrupt + * handlers, but if we try it'll 1) stop working, and 2) mess up the timing + * that we're trying to measure. Instead we fill a circular buffer with things + * to print when we get the chance. The number of args is fixed (a format + * string and five uint32_t args), and will be printed a few at a time in a + * HOOK_TICK handler. + * */ -#define MAX_ENTRIES 512 +#define MAX_ENTRIES 350 /* Chosen arbitrarily */ static struct { timestamp_t t; const char *fmt; @@ -77,7 +76,7 @@ void print_later(const char *fmt, int a0, int a1, int a2, int a3, int a4) next = (stuff_in + 1) % MAX_ENTRIES; if (next == stuff_out) - stuff_overflow = 1; + stuff_overflow++; else stuff_in = next; } @@ -95,7 +94,8 @@ static void do_print_later(void) interrupt_enable(); if (copy_of_overflow) - ccprintf("*** WARNING: SOME MESSAGES WERE LOST ***\n"); + ccprintf("*** WARNING: %d MESSAGES WERE LOST ***\n", + copy_of_overflow); while (lines_per_loop && stuff_out != copy_of_stuff_in) { ccprintf("at %.6ld: ", stuff_to_print[stuff_out].t); @@ -111,7 +111,86 @@ static void do_print_later(void) } } DECLARE_HOOK(HOOK_TICK, do_print_later, HOOK_PRIO_DEFAULT); -#endif + +/* Debugging stuff to display some registers and bits */ +static const char const *deezbits[32] = { + [0] = "CURMOD", + [1] = "MODEMIS", + [2] = "OTGINT", + [3] = "SOF", + [4] = "RXFLVL", + [6] = "GINNAKEFF", + [7] = "GOUTNAKEFF", + [10] = "ERLYSUSP", + [11] = "USBSUSP", + [12] = "USBRST", + [13] = "ENUMDONE", + [14] = "ISOOUTDROP", + [15] = "EOPF", + [17] = "EPMIS", + [18] = "IEPINT", + [19] = "OEPINT", + [20] = "INCOMPISOIN", + [21] = "INCOMPLP", + [22] = "FETSUSP", + [23] = "RESETDET", + [28] = "CONIDSTSCHNG", + [30] = "SESSREQINT", + [31] = "WKUPINT", +}; + +static void showbits(uint32_t b) +{ + int i; + + for (i = 0; i < 32; i++) + if (b & (1 << i)) { + if (deezbits[i]) + ccprintf(" %s", deezbits[i]); + else + ccprintf(" %d", i); + } + ccprintf("\n"); +} + +static int command_usb(int argc, char **argv) +{ + ccprintf("GINTSTS: 0x%08x\n", GR_USB_GINTSTS); + showbits(GR_USB_GINTSTS); + ccprintf("GINTMSK: 0x%08x\n", GR_USB_GINTMSK); + showbits(GR_USB_GINTMSK); + ccprintf("DAINT: 0x%08x\n", GR_USB_DAINT); + ccprintf("DAINTMSK: 0x%08x\n", GR_USB_DAINTMSK); + ccprintf("DOEPMSK: 0x%08x\n", GR_USB_DOEPMSK); + ccprintf("DIEPMSK: 0x%08x\n", GR_USB_DIEPMSK); + ccprintf("DCFG: 0x%08x\n", GR_USB_DCFG); + ccprintf("DOEPCTL0: 0x%08x\n", GR_USB_DOEPCTL(0)); + ccprintf("DIEPCTL0: 0x%08x\n", GR_USB_DIEPCTL(0)); + ccprintf("DOEPCTL1: 0x%08x\n", GR_USB_DOEPCTL(1)); + ccprintf("DIEPCTL1: 0x%08x\n", GR_USB_DIEPCTL(1)); + ccprintf("DOEPCTL2: 0x%08x\n", GR_USB_DOEPCTL(2)); + ccprintf("DIEPCTL2: 0x%08x\n", GR_USB_DIEPCTL(2)); + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(usb, command_usb, + "", + "Show some USB regs", + NULL); + +/* When debugging, print errors as they occur */ +#define report_error(dummy) \ + print_later("USB ERROR at usb.c line %d", \ + __LINE__, 0, 0, 0, 0) + +#else /* Not debugging */ +#define print_later(...) + +/* TODO: Something unexpected happened. Figure out how to report & fix it. */ +#define report_error(dummy) \ + CPRINTS("Unhandled USB error at %s line %d", \ + __FILE__, __LINE__) + +#endif /* DEBUG_ME */ #ifdef CONFIG_USB_BOS /* v2.01 (vs 2.00) BOS Descriptor provided */ @@ -125,7 +204,7 @@ DECLARE_HOOK(HOOK_TICK, do_print_later, HOOK_PRIO_DEFAULT); #endif #ifndef CONFIG_USB_BCD_DEV -#define CONFIG_USB_BCD_DEV 0x0100 /* 1.00 */ +#define CONFIG_USB_BCD_DEV 0x0100 /* 1.00 */ #endif /* USB Standard Device Descriptor */ @@ -150,18 +229,18 @@ static const struct usb_device_descriptor dev_desc = { const struct usb_config_descriptor USB_CONF_DESC(conf) = { .bLength = USB_DT_CONFIG_SIZE, .bDescriptorType = USB_DT_CONFIGURATION, - .wTotalLength = 0x0BAD, /* no of returned bytes, set at runtime */ + .wTotalLength = 0x0BAD, /* number of returned bytes, set at runtime */ .bNumInterfaces = USB_IFACE_COUNT, .bConfigurationValue = 1, .iConfiguration = USB_STR_VERSION, - .bmAttributes = 0x80, /* bus powered */ - .bMaxPower = 250, /* MaxPower 500 mA */ + .bmAttributes = 0x80, /* bus powered */ + .bMaxPower = 250, /* MaxPower 500 mA */ }; const uint8_t usb_string_desc[] = { - 4, /* Descriptor size */ + 4, /* Descriptor size */ USB_DT_STRING, - 0x09, 0x04 /* LangID = 0x0409: U.S. English */ + 0x09, 0x04 /* LangID = 0x0409: U.S. English */ }; /* Descriptors for USB controller S/G DMA */ @@ -317,12 +396,11 @@ static void ep0_rx(void) * hardware for this SoC knows that an IN packet will * be following the SET ADDRESS, so it waits until it * sees that happen before the address change takes - * effect. If we wait until after the IN packet to make - * the change, the hardware gets confused and doesn't - * respond to anything. + * effect. If we wait until after the IN packet to + * change the register, the hardware gets confused and + * doesn't respond to anything. */ - GR_USB_DCFG = (GR_USB_DCFG & ~DCFG_DEVADDR(0x7f)) - | DCFG_DEVADDR(set_addr); + GWRITE_FIELD(USB, DCFG, DEVADDR, set_addr); print_later("SETAD 0x%02x (%d)", set_addr, set_addr, 0, 0, 0); /* still need a null IN transaction -> TX Valid */ |