mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 20:44:39 +08:00
LPC3131 EHCI: Add USB host tracing support
This commit is contained in:
@@ -6085,5 +6085,6 @@
|
||||
include/nuttx/mtd/hamming.h: Beginning of NAND software ECC
|
||||
calculations. (2013-11-18).
|
||||
* configs/olimex-lpc-h3131: Add support for the Olimex LPC-H3131
|
||||
board. Does not yet boot (2013-11-18).
|
||||
|
||||
* board. Does not yet boot (2013-11-18).
|
||||
* arch/arm/src/lpc31xx/lpc31_ehci.c: Add USB host trace support
|
||||
(2013-11-19).
|
||||
|
||||
@@ -160,6 +160,23 @@
|
||||
#define lpc31_physramaddr(a) (a)
|
||||
#define lpc31_virtramaddr(a) (a)
|
||||
|
||||
/* USB trace *******************************************************************/
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE
|
||||
# define TR_FMT1 false
|
||||
# define TR_FMT2 true
|
||||
|
||||
# define TRENTRY(id,fmt1,string) {string}
|
||||
|
||||
# define TRACE1_FIRST ((int)__TRACE1_BASEVALUE + 1)
|
||||
# define TRACE1_INDEX(id) ((int)(id) - TRACE1_FIRST)
|
||||
# define TRACE1_NSTRINGS TRACE1_INDEX(__TRACE1_NSTRINGS)
|
||||
|
||||
# define TRACE2_FIRST ((int)__TRACE1_NSTRINGS + 1)
|
||||
# define TRACE2_INDEX(id) ((int)(id) - TRACE2_FIRST)
|
||||
# define TRACE2_NSTRINGS TRACE2_INDEX(__TRACE2_NSTRINGS)
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* Private Types
|
||||
*******************************************************************************/
|
||||
@@ -265,6 +282,93 @@ struct lpc31_ehci_s
|
||||
struct lpc31_rhport_s rhport[LPC31_EHCI_NRHPORT];
|
||||
};
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE
|
||||
/* USB trace codes */
|
||||
|
||||
enum usbhost_trace1codes_e
|
||||
{
|
||||
__TRACE1_BASEVALUE = 0, /* This will force the first value to be 1 */
|
||||
|
||||
EHCI_TRACE1_SYSTEMERROR, /* EHCI ERROR: System error */
|
||||
EHCI_TRACE1_QTDFOREACH_FAILED, /* EHCI ERROR: sam_qtd_foreach failed */
|
||||
EHCI_TRACE1_QHALLOC_FAILED, /* EHCI ERROR: Failed to allocate a QH */
|
||||
EHCI_TRACE1_BUFTOOBIG, /* EHCI ERROR: Buffer too big */
|
||||
EHCI_TRACE1_REQQTDALLOC_FAILED, /* EHCI ERROR: Failed to allocate request qTD */
|
||||
EHCI_TRACE1_ADDBPL_FAILED, /* EHCI ERROR: sam_qtd_addbpl failed */
|
||||
EHCI_TRACE1_DATAQTDALLOC_FAILED, /* EHCI ERROR: Failed to allocate data buffer qTD */
|
||||
EHCI_TRACE1_DEVDISCONNECTED, /* EHCI ERROR: Device disconnected */
|
||||
EHCI_TRACE1_QHCREATE_FAILED, /* EHCI ERROR: sam_qh_create failed */
|
||||
EHCI_TRACE1_QTDSETUP_FAILED, /* EHCI ERROR: sam_qtd_setupphase failed */
|
||||
|
||||
EHCI_TRACE1_QTDDATA_FAILED, /* EHCI ERROR: sam_qtd_dataphase failed */
|
||||
EHCI_TRACE1_QTDSTATUS_FAILED, /* EHCI ERROR: sam_qtd_statusphase failed */
|
||||
EHCI_TRACE1_TRANSFER_FAILED, /* EHCI ERROR: Transfer failed */
|
||||
EHCI_TRACE1_QHFOREACH_FAILED, /* EHCI ERROR: sam_qh_foreach failed: */
|
||||
EHCI_TRACE1_SYSERR_INTR, /* EHCI: Host System Error Interrup */
|
||||
EHCI_TRACE1_USBERR_INTR, /* EHCI: USB Error Interrupt (USBERRINT) Interrupt */
|
||||
EHCI_TRACE1_EPALLOC_FAILED, /* EHCI ERROR: Failed to allocate EP info structure */
|
||||
EHCI_TRACE1_BADXFRTYPE, /* EHCI ERROR: Support for transfer type not implemented */
|
||||
EHCI_TRACE1_HCHALTED_TIMEOUT, /* EHCI ERROR: Timed out waiting for HCHalted */
|
||||
EHCI_TRACE1_QHPOOLALLOC_FAILED, /* EHCI ERROR: Failed to allocate the QH pool */
|
||||
|
||||
EHCI_TRACE1_QTDPOOLALLOC_FAILED, /* EHCI ERROR: Failed to allocate the qTD pool */
|
||||
EHCI_TRACE1_PERFLALLOC_FAILED, /* EHCI ERROR: Failed to allocate the periodic frame list */
|
||||
EHCI_TRACE1_RESET_FAILED, /* EHCI ERROR: sam_reset failed */
|
||||
EHCI_TRACE1_RUN_FAILED, /* EHCI ERROR: EHCI Failed to run */
|
||||
EHCI_TRACE1_IRQATTACH_FAILED, /* EHCI ERROR: Failed to attach IRQ */
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE_VERBOSE
|
||||
EHCI_VTRACE1_PORTSC_CSC, /* EHCI Connect Status Change */
|
||||
EHCI_VTRACE1_PORTSC_CONNALREADY, /* EHCI Already connected */
|
||||
EHCI_VTRACE1_PORTSC_DISCALREADY, /* EHCI Already disconnected */
|
||||
EHCI_VTRACE1_TOPHALF, /* EHCI Interrupt top half */
|
||||
EHCI_VTRACE1_AAINTR, /* EHCI Async Advance Interrupt */
|
||||
|
||||
EHCI_VTRACE1_USBINTR, /* EHCI USB Interrupt (USBINT) Interrupt */
|
||||
EHCI_VTRACE1_ENUM_DISCONN, /* EHCI Enumeration not connected */
|
||||
EHCI_VTRACE1_INITIALIZING, /* EHCI Initializing EHCI Stack */
|
||||
EHCI_VTRACE1_HCCPARAMS, /* EHCI HCCPARAMS */
|
||||
EHCI_VTRACE1_INIITIALIZED, /* EHCI USB EHCI Initialized */
|
||||
#endif
|
||||
|
||||
__TRACE1_NSTRINGS, /* Separates the format 1 from the format 2 strings */
|
||||
|
||||
EHCI_TRACE2_EPSTALLED, /* EHCI EP Stalled */
|
||||
EHCI_TRACE2_EPIOERROR, /* EHCI ERROR: EP TOKEN */
|
||||
EHCI_TRACE2_CLASSENUM_FAILED, /* EHCI usbhost_enumerate() failed */
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE_VERBOSE
|
||||
EHCI_VTRACE2_ASYNCXFR, /* EHCI Async transfer */
|
||||
EHCI_VTRACE2_INTRXFR, /* EHCI Interrupt Transfer */
|
||||
EHCI_VTRACE2_IOCCHECK, /* EHCI IOC */
|
||||
EHCI_VTRACE2_PORTSC, /* EHCI PORTSC */
|
||||
EHCI_VTRACE2_PORTSC_CONNECTED, /* EHCI RHPort connected */
|
||||
EHCI_VTRACE2_PORTSC_DISCONND, /* EHCI RHport disconnected */
|
||||
EHCI_VTRACE2_MONWAKEUP, /* EHCI RHPort connected wakeup */
|
||||
|
||||
EHCI_VTRACE2_CLASSENUM, /* EHCI RHPort CLASS enumeration */
|
||||
EHCI_VTRACE2_EPALLOC, /* EHCI EPALLOC */
|
||||
EHCI_VTRACE2_CTRLINOUT, /* EHCI CTRLIN/OUT */
|
||||
EHCI_VTRACE2_HCIVERSION, /* EHCI HCIVERSION */
|
||||
EHCI_VTRACE2_HCSPARAMS, /* EHCI HCSPARAMS */
|
||||
#endif
|
||||
|
||||
__TRACE2_NSTRINGS /* Total number of enumeration values */
|
||||
};
|
||||
|
||||
/* USB trace data structure */
|
||||
|
||||
struct lpc31_ehci_trace_s
|
||||
{
|
||||
#if 0
|
||||
uint16_t id;
|
||||
bool fmt2;
|
||||
#endif
|
||||
FAR const char *string;
|
||||
};
|
||||
|
||||
#endif /* HAVE_USBHOST_TRACE */
|
||||
|
||||
/*******************************************************************************
|
||||
* Private Function Prototypes
|
||||
*******************************************************************************/
|
||||
@@ -470,6 +574,78 @@ static struct lpc31_qtd_s *g_qtdpool;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE
|
||||
/* USB trace strings */
|
||||
|
||||
static const struct lpc31_ehci_trace_s g_trace1[TRACE1_NSTRINGS] =
|
||||
{
|
||||
TRENTRY(EHCI_TRACE1_SYSTEMERROR, TR_FMT1, "EHCI ERROR: System error: %06x\n"),
|
||||
TRENTRY(EHCI_TRACE1_QTDFOREACH_FAILED, TR_FMT1, "EHCI ERROR: sam_qtd_foreach failed: %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_QHALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate a QH\n"),
|
||||
TRENTRY(EHCI_TRACE1_BUFTOOBIG, TR_FMT1, "EHCI ERROR: Buffer too big. Remaining %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_REQQTDALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate request qTD"),
|
||||
TRENTRY(EHCI_TRACE1_ADDBPL_FAILED, TR_FMT1, "EHCI ERROR: sam_qtd_addbpl failed: %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_DATAQTDALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate data buffer qTD, 0"),
|
||||
TRENTRY(EHCI_TRACE1_DEVDISCONNECTED, TR_FMT1, "EHCI ERROR: Device disconnected %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_QHCREATE_FAILED, TR_FMT1, "EHCI ERROR: sam_qh_create failed\n"),
|
||||
TRENTRY(EHCI_TRACE1_QTDSETUP_FAILED, TR_FMT1, "EHCI ERROR: sam_qtd_setupphase failed\n"),
|
||||
|
||||
TRENTRY(EHCI_TRACE1_QTDDATA_FAILED, TR_FMT1, "EHCI ERROR: sam_qtd_dataphase failed\n"),
|
||||
TRENTRY(EHCI_TRACE1_QTDSTATUS_FAILED, TR_FMT1, "EHCI ERROR: sam_qtd_statusphase failed\n"),
|
||||
TRENTRY(EHCI_TRACE1_TRANSFER_FAILED, TR_FMT1, "EHCI ERROR: Transfer failed %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_QHFOREACH_FAILED, TR_FMT1, "EHCI ERROR: sam_qh_foreach failed: %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_SYSERR_INTR, TR_FMT1, "EHCI: Host System Error Interrupt\n"),
|
||||
TRENTRY(EHCI_TRACE1_USBERR_INTR, TR_FMT1, "EHCI: USB Error Interrupt (USBERRINT) Interrupt: %06x\n"),
|
||||
TRENTRY(EHCI_TRACE1_EPALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate EP info structure\n"),
|
||||
TRENTRY(EHCI_TRACE1_BADXFRTYPE, TR_FMT1, "EHCI ERROR: Support for transfer type %d not implemented\n"),
|
||||
TRENTRY(EHCI_TRACE1_HCHALTED_TIMEOUT, TR_FMT1, "EHCI ERROR: Timed out waiting for HCHalted. USBSTS: %06x\n"),
|
||||
TRENTRY(EHCI_TRACE1_QHPOOLALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate the QH pool\n"),
|
||||
|
||||
TRENTRY(EHCI_TRACE1_QTDPOOLALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate the qTD pool\n"),
|
||||
TRENTRY(EHCI_TRACE1_PERFLALLOC_FAILED, TR_FMT1, "EHCI ERROR: Failed to allocate the periodic frame list\n"),
|
||||
TRENTRY(EHCI_TRACE1_RESET_FAILED, TR_FMT1, "EHCI ERROR: sam_reset failed: %d\n"),
|
||||
TRENTRY(EHCI_TRACE1_RUN_FAILED, TR_FMT1, "EHCI ERROR: EHCI Failed to run: USBSTS=%06x\n"),
|
||||
TRENTRY(EHCI_TRACE1_IRQATTACH_FAILED, TR_FMT1, "EHCI ERROR: Failed to attach IRQ%d\n"),
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE_VERBOSE
|
||||
TRENTRY(EHCI_VTRACE1_PORTSC_CSC, TR_FMT1, "EHCI Connect Status Change: %06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_PORTSC_CONNALREADY, TR_FMT1, "EHCI Already connected: %06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_PORTSC_DISCALREADY, TR_FMT1, "EHCI Already disconnected: %06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_TOPHALF, TR_FMT1, "EHCI Interrupt: %06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_AAINTR, TR_FMT1, "EHCI Async Advance Interrupt\n"),
|
||||
|
||||
TRENTRY(EHCI_VTRACE1_USBINTR, TR_FMT1, "EHCI USB Interrupt (USBINT) Interrupt: %06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_ENUM_DISCONN, TR_FMT1, "EHCI Enumeration not connected\n"),
|
||||
TRENTRY(EHCI_VTRACE1_INITIALIZING, TR_FMT1, "EHCI Initializing EHCI Stack\n"),
|
||||
TRENTRY(EHCI_VTRACE1_HCCPARAMS, TR_FMT1, "EHCI HCCPARAMS=%06x\n"),
|
||||
TRENTRY(EHCI_VTRACE1_INIITIALIZED, TR_FMT1, "EHCI USB EHCI Initialized\n"),
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct lpc31_ehci_trace_s g_trace2[TRACE2_NSTRINGS] =
|
||||
{
|
||||
TRENTRY(EHCI_TRACE2_EPSTALLED, TR_FMT2, "EHCI EP%d Stalled: TOKEN=%04x\n"),
|
||||
TRENTRY(EHCI_TRACE2_EPIOERROR, TR_FMT2, "EHCI ERROR: EP%d TOKEN=%04x\n"),
|
||||
TRENTRY(EHCI_TRACE2_CLASSENUM_FAILED, TR_FMT2, "EHCI RHport%d usbhost_enumerate() failed: %d\n"),
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE_VERBOSE
|
||||
TRENTRY(EHCI_VTRACE2_ASYNCXFR, TR_FMT2, "EHCI Async transfer EP%d buflen=%d\n"),
|
||||
TRENTRY(EHCI_VTRACE2_INTRXFR, TR_FMT2, "EHCI Intr Transfer EP%d buflen=%d\n"),
|
||||
TRENTRY(EHCI_VTRACE2_IOCCHECK, TR_FMT2, "EHCI IOC EP%d TOKEN=%04x\n"),
|
||||
TRENTRY(EHCI_VTRACE2_PORTSC, TR_FMT2, "EHCI PORTSC%d: %04x\n"),
|
||||
TRENTRY(EHCI_VTRACE2_PORTSC_CONNECTED, TR_FMT2, "EHCI RHPort%d connected, pscwait: %d\n"),
|
||||
TRENTRY(EHCI_VTRACE2_PORTSC_DISCONND, TR_FMT2, "EHCI RHport%d disconnected, pscwait: %d\n"),
|
||||
TRENTRY(EHCI_VTRACE2_MONWAKEUP, TR_FMT2, "EHCI RHPort%d connected: %d\n"),
|
||||
|
||||
TRENTRY(EHCI_VTRACE2_CLASSENUM, TR_FMT2, "EHCI RHPort%d: Enumerate the device, devaddr=%02x\n"),
|
||||
TRENTRY(EHCI_VTRACE2_EPALLOC, TR_FMT2, "EHCI EPALLOC: EP%d TYPE=%d\n"),
|
||||
TRENTRY(EHCI_VTRACE2_CTRLINOUT, TR_FMT2, "EHCI CTRLIN/OUT: RHPort%d req: %02x\n"),
|
||||
TRENTRY(EHCI_VTRACE2_HCIVERSION, TR_FMT2, "EHCI HCIVERSION %x.%02x\n"),
|
||||
TRENTRY(EHCI_VTRACE2_HCSPARAMS, TR_FMT2, "EHCI nports=%d, HCSPARAMS=%04x\n"),
|
||||
#endif
|
||||
};
|
||||
#endif /* HAVE_USBHOST_TRACE */
|
||||
|
||||
/*******************************************************************************
|
||||
* Private Functions
|
||||
*******************************************************************************/
|
||||
@@ -4355,4 +4531,43 @@ FAR struct usbhost_connection_s *lpc31_ehci_initialize(int controller)
|
||||
return &g_ehciconn;
|
||||
}
|
||||
|
||||
/********************************************************************************************
|
||||
* Name: usbhost_trformat1 and usbhost_trformat2
|
||||
*
|
||||
* Description:
|
||||
* This interface must be provided by platform specific logic that knows
|
||||
* the HCDs encoding of USB trace data.
|
||||
*
|
||||
* Given an 9-bit index, return a format string suitable for use with, say,
|
||||
* printf. The returned format is expected to handle two unsigned integer
|
||||
* values.
|
||||
*
|
||||
********************************************************************************************/
|
||||
|
||||
#ifdef HAVE_USBHOST_TRACE
|
||||
FAR const char *usbhost_trformat1(uint16_t id)
|
||||
{
|
||||
int ndx = TRACE1_INDEX(id);
|
||||
|
||||
if (ndx < TRACE1_NSTRINGS)
|
||||
{
|
||||
return g_trace1[ndx].string;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FAR const char *usbhost_trformat2(uint16_t id)
|
||||
{
|
||||
int ndx = TRACE2_INDEX(id);
|
||||
|
||||
if (ndx < TRACE2_NSTRINGS)
|
||||
{
|
||||
return g_trace2[ndx].string;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif /* HAVE_USBHOST_TRACE */
|
||||
|
||||
#endif /* CONFIG_LPC31_USBOTG && CONFIG_USBHOST */
|
||||
|
||||
@@ -576,8 +576,8 @@ static int up_interrupt(int irq, void *context)
|
||||
|
||||
static int up_ioctl(struct file *filep, int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = filep->f_inode;
|
||||
#ifdef CONFIG_SERIAL_TIOCSERGSTRUCT
|
||||
struct inode *inode = filep->f_inode;
|
||||
struct uart_dev_s *dev = inode->i_private;
|
||||
#endif
|
||||
int ret = OK;
|
||||
|
||||
Reference in New Issue
Block a user