summaryrefslogtreecommitdiff
path: root/nuttx/include/nuttx/usb/usbdev_trace.h
blob: ce9b4bebd06941e6ed698082cd4dcc94457cbd27 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
/****************************************************************************
 * include/nuttx/usb/usbdev_trace.h
 *
 *   Copyright (C) 2008, 2009-2010 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

#ifndef __INCLUDE_NUTTX_USB_USBDEV_TRACE_H
#define __INCLUDE_NUTTX_USB_USBDEV_TRACE_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

#include <stdint.h>

/****************************************************************************
 * Preprocessor definitions
 ****************************************************************************/

/* Event encoding/decoding macros *******************************************/

#define TRACE_EVENT(id,data)     ((uint16_t)(id)|(data))
#define TRACE_ID(event)          ((event)&0xff00)
#define TRACE_DATA(event)        ((event)&0x00ff)

/* Events ******************************************************************/

/* Event class IDs */

#define TRACE_INIT_ID            (0x0000) /* Initialization events */
#define TRACE_EP_ID              (0x0100) /* Endpoint API calls */
#define TRACE_DEV_ID             (0x0200) /* USB device API calls */
#define TRACE_CLASS_ID           (0x0300) /* USB class driver API calls */
#define TRACE_CLASSAPI_ID        (0x0400) /* Other class driver system API calls */
#define TRACE_CLASSSTATE_ID      (0x0500) /* Track class driver state changes */
#define TRACE_INTENTRY_ID        (0x0600) /* Interrupt handler entry */
#define TRACE_INTDECODE_ID       (0x0700) /* Decoded interrupt event */
#define TRACE_INTEXIT_ID         (0x0800) /* Interrupt handler exit */
#define TRACE_OUTREQQUEUED_ID    (0x0900) /* Request queued for OUT endpoint */
#define TRACE_INREQQUEUED_ID     (0x0a00) /* Request queued for IN endpoint */
#define TRACE_READ_ID            (0x0b00) /* Read (OUT) action */
#define TRACE_WRITE_ID           (0x0c00) /* Write (IN) action */
#define TRACE_COMPLETE_ID        (0x0d00) /* Request completed */
#define TRACE_DEVERROR_ID        (0x0e00) /* USB controller driver error event */
#define TRACE_CLSERROR_ID        (0x0f00) /* USB class driver error event */

#define TRACE_NIDS               16       /* Cannot exceed bits in usbtrace_idset_t */

/* Bit settings for usbtrace_enable */

#define TRACE_ID2BIT(id)         ((1) << ((id) >> 8))
#define TRACE_INIT_BIT           TRACE_ID2BIT(TRACE_INIT_ID)
#define TRACE_EP_BIT             TRACE_ID2BIT(TRACE_EP_ID)
#define TRACE_DEV_BIT            TRACE_ID2BIT(TRACE_DEV_ID)
#define TRACE_CLASS_BIT          TRACE_ID2BIT(TRACE_CLASS_ID)
#define TRACE_CLASSAPI_BIT       TRACE_ID2BIT(TRACE_CLASSAPI_ID)
#define TRACE_CLASSSTATE_BIT     TRACE_ID2BIT(TRACE_CLASSSTATE_ID)
#define TRACE_INTENTRY_BIT       TRACE_ID2BIT(TRACE_INTENTRY_ID)
#define TRACE_INTDECODE_BIT      TRACE_ID2BIT(TRACE_INTDECODE_ID)
#define TRACE_INTEXIT_BIT        TRACE_ID2BIT(TRACE_INTEXIT_ID)
#define TRACE_OUTREQQUEUED_BIT   TRACE_ID2BIT(TRACE_OUTREQQUEUED_ID)
#define TRACE_INREQQUEUED_BIT    TRACE_ID2BIT(TRACE_INREQQUEUED_ID)
#define TRACE_READ_BIT           TRACE_ID2BIT(TRACE_READ_ID)
#define TRACE_WRITE_BIT          TRACE_ID2BIT(TRACE_WRITE_ID)
#define TRACE_COMPLETE_BIT       TRACE_ID2BIT(TRACE_COMPLETE_ID)
#define TRACE_DEVERROR_BIT       TRACE_ID2BIT(TRACE_DEVERROR_ID)
#define TRACE_CLSERROR_BIT       TRACE_ID2BIT(TRACE_CLSERROR_ID)
#define TRACE_ALLBITS            ((usbtrace_idset_t)-1)

/* Initialization events */

#define TRACE_DEVINIT            TRACE_EVENT(TRACE_INIT_ID, 0x0001)
#define TRACE_DEVUNINIT          TRACE_EVENT(TRACE_INIT_ID, 0x0002)
#define TRACE_DEVREGISTER        TRACE_EVENT(TRACE_INIT_ID, 0x0003)
#define TRACE_DEVUNREGISTER      TRACE_EVENT(TRACE_INIT_ID, 0x0004)

/* API calls (see usbdev.h) */

#define TRACE_EPCONFIGURE        TRACE_EVENT(TRACE_EP_ID, 0x0001)
#define TRACE_EPDISABLE          TRACE_EVENT(TRACE_EP_ID, 0x0002)
#define TRACE_EPALLOCREQ         TRACE_EVENT(TRACE_EP_ID, 0x0003)
#define TRACE_EPFREEREQ          TRACE_EVENT(TRACE_EP_ID, 0x0004)
#define TRACE_EPALLOCBUFFER      TRACE_EVENT(TRACE_EP_ID, 0x0005)
#define TRACE_EPFREEBUFFER       TRACE_EVENT(TRACE_EP_ID, 0x0006)
#define TRACE_EPSUBMIT           TRACE_EVENT(TRACE_EP_ID, 0x0007)
#define TRACE_EPCANCEL           TRACE_EVENT(TRACE_EP_ID, 0x0008)
#define TRACE_EPSTALL            TRACE_EVENT(TRACE_EP_ID, 0x0009)
#define TRACE_EPRESUME           TRACE_EVENT(TRACE_EP_ID, 0x000a)

#define TRACE_DEVALLOCEP         TRACE_EVENT(TRACE_DEV_ID, 0x0001)
#define TRACE_DEVFREEEP          TRACE_EVENT(TRACE_DEV_ID, 0x0002)
#define TRACE_DEVGETFRAME        TRACE_EVENT(TRACE_DEV_ID, 0x0003)
#define TRACE_DEVWAKEUP          TRACE_EVENT(TRACE_DEV_ID, 0x0004)
#define TRACE_DEVSELFPOWERED     TRACE_EVENT(TRACE_DEV_ID, 0x0005)
#define TRACE_DEVPULLUP          TRACE_EVENT(TRACE_DEV_ID, 0x0006)

#define TRACE_CLASSBIND          TRACE_EVENT(TRACE_CLASS_ID, 0x0001)
#define TRACE_CLASSUNBIND        TRACE_EVENT(TRACE_CLASS_ID, 0x0002)
#define TRACE_CLASSDISCONNECT    TRACE_EVENT(TRACE_CLASS_ID, 0x0003)
#define TRACE_CLASSSETUP         TRACE_EVENT(TRACE_CLASS_ID, 0x0004)
#define TRACE_CLASSSUSPEND       TRACE_EVENT(TRACE_CLASS_ID, 0x0005)
#define TRACE_CLASSRESUME        TRACE_EVENT(TRACE_CLASS_ID, 0x0006)

#define TRACE_CLASSRDCOMPLETE    TRACE_EVENT(TRACE_CLASS_ID, 0x0007)
#define TRACE_CLASSWRCOMPLETE    TRACE_EVENT(TRACE_CLASS_ID, 0x0008)

#define TRACE_CLASSAPI(id)       TRACE_EVENT(TRACE_CLASSAPI_ID, id)

#define TRACE_CLASSSTATE(id)     TRACE_EVENT(TRACE_CLASSSTATE_ID, id)

/* USB device controller interrupt events.  The 'id' is specific to the driver.
 * Particular values for 'id' are unique for a given implementation of a
 * controller driver
 */

#define TRACE_INTENTRY(id)       TRACE_EVENT(TRACE_INTENTRY_ID, id)
#define TRACE_INTDECODE(id)      TRACE_EVENT(TRACE_INTDECODE_ID, id)
#define TRACE_INTEXIT(id)        TRACE_EVENT(TRACE_INTEXIT_ID, id)

/* Controller data transfer */

#define TRACE_OUTREQQUEUED(ep)   TRACE_EVENT(TRACE_OUTREQQUEUED_ID, ep)
#define TRACE_INREQQUEUED(ep)    TRACE_EVENT(TRACE_INREQQUEUED_ID, ep)
#define TRACE_READ(ep)           TRACE_EVENT(TRACE_READ_ID, ep)
#define TRACE_WRITE(ep)          TRACE_EVENT(TRACE_WRITE_ID, ep)
#define TRACE_COMPLETE(ep)       TRACE_EVENT(TRACE_COMPLETE_ID, ep)

/* USB device controller error events.  The 'id' is specific to the driver.
 * Particular values for 'id' are unique for a given implementation of a
 * controller driver
 */

#define TRACE_DEVERROR(id)       TRACE_EVENT(TRACE_DEVERROR_ID, id)

/* USB class driver error events.  The 'id' is specific to the class driver,
 * but common to all driver controller instances.
 */

#define TRACE_CLSERROR(id)       TRACE_EVENT(TRACE_CLSERROR_ID, id)

/* USB Serial driver class events *******************************************/

/* UART interface API calls */

#define USBSER_TRACECLASSAPI_SETUP                   0x0001
#define USBSER_TRACECLASSAPI_SHUTDOWN                0x0002
#define USBSER_TRACECLASSAPI_ATTACH                  0x0003
#define USBSER_TRACECLASSAPI_DETACH                  0x0004
#define USBSER_TRACECLASSAPI_IOCTL                   0x0005
#define USBSER_TRACECLASSAPI_RECEIVE                 0x0006
#define USBSER_TRACECLASSAPI_RXINT                   0x0007
#define USBSER_TRACECLASSAPI_RXAVAILABLE             0x0008
#define USBSER_TRACECLASSAPI_SEND                    0x0009
#define USBSER_TRACECLASSAPI_TXINT                   0x000a
#define USBSER_TRACECLASSAPI_TXREADY                 0x000b
#define USBSER_TRACECLASSAPI_TXEMPTY                 0x000c

/* Values of the class error ID used by the USB serial driver */

#define USBSER_TRACEERR_ALLOCCTRLREQ                 0x0001
#define USBSER_TRACEERR_ALLOCDEVSTRUCT               0x0002
#define USBSER_TRACEERR_ALREADYCLOSED                0x0003
#define USBSER_TRACEERR_ALREADYCONFIGURED            0x0004
#define USBSER_TRACEERR_CONFIGIDBAD                  0x0005
#define USBSER_TRACEERR_CONFIGNONE                   0x0006
#define USBSER_TRACEERR_CONSOLEREGISTER              0x0007
#define USBSER_TRACEERR_DEVREGISTER                  0x0008
#define USBSER_TRACEERR_EPRESPQ                      0x0009
#define USBSER_TRACEERR_GETUNKNOWNDESC               0x000a
#define USBSER_TRACEERR_INVALIDARG                   0x000b
#define USBSER_TRACEERR_EP0NOTBOUND                  0x000c
#define USBSER_TRACEERR_EPBULKINALLOCFAIL            0x000d
#define USBSER_TRACEERR_EPBULKINCONFIGFAIL           0x000e
#define USBSER_TRACEERR_EPBULKOUTALLOCFAIL           0x000f
#define USBSER_TRACEERR_EPINTINALLOCFAIL             0x0010
#define USBSER_TRACEERR_EPINTINCONFIGFAIL            0x0011
#define USBSER_TRACEERR_EPBULKOUTCONFIGFAIL          0x0012
#define USBSER_TRACEERR_RDALLOCREQ                   0x0013
#define USBSER_TRACEERR_RDSHUTDOWN                   0x0014
#define USBSER_TRACEERR_RDSUBMIT                     0x0015
#define USBSER_TRACEERR_RDUNEXPECTED                 0x0016
#define USBSER_TRACEERR_REQRESULT                    0x0017
#define USBSER_TRACEERR_RXOVERRUN                    0x0018
#define USBSER_TRACEERR_SETUPNOTCONNECTED            0x0019
#define USBSER_TRACEERR_SUBMITFAIL                   0x001a
#define USBSER_TRACEERR_UARTREGISTER                 0x001b
#define USBSER_TRACEERR_UNSUPPORTEDCTRLREQ           0x001c
#define USBSER_TRACEERR_UNSUPPORTEDCLASSREQ          0x001d
#define USBSER_TRACEERR_UNSUPPORTEDSTDREQ            0x001e
#define USBSER_TRACEERR_UNSUPPORTEDTYPE              0x001f
#define USBSER_TRACEERR_WRALLOCREQ                   0x0020
#define USBSER_TRACEERR_WRSHUTDOWN                   0x0021
#define USBSER_TRACEERR_WRUNEXPECTED                 0x0022

/* USB Storage driver class events ******************************************/

#define USBCOMPOSITE_TRACEERR_REQRESULT              0x0001
#define USBCOMPOSITE_TRACEERR_ALLOCCTRLREQ           0x0002
#define USBCOMPOSITE_TRACEERR_INVALIDARG             0x0003
#define USBCOMPOSITE_TRACEERR_EP0NOTBOUND            0x0004
#define COMPOSITE_TRACEERR_SETUPINVALIDARGS          0x0005
#define COMPOSITE_TRACEERR_EP0NOTBOUND2              0x0006
#define COMPOSITE_TRACEERR_GETUNKNOWNDESC            0x0007
#define COMPOSITE_TRACEERR_UNSUPPORTEDSTDREQ         0x0008
#define COMPOSITE_TRACEERR_EPRESPQ                   0x0009
#define USBCOMPOSITE_TRACEERR_ALLOCDEVSTRUCT         0x000a
#define USBCOMPOSITE_TRACEERR_CLASSOBJECT            0x000b
#define USBCOMPOSITE_TRACEERR_DEVREGISTER            0x000c
#define USBCOMPOSITE_TRACEERR_INVALIDARG             0x000d
#define USBCOMPOSITE_TRACEERR_INVALIDARG             0x000f
#define USBCOMPOSITE_TRACEERR_INVALIDARG             0x0010
#define USBCOMPOSITE_TRACEERR_INVALIDARG             0x0011

/* USB Storage driver class events ******************************************/

/* State transitions */

#define USBMSC_CLASSSTATE_IDLECMDPARSE               0x0001
#define USBMSC_CLASSSTATE_CMDPARSECMDFINISH          0x0002
#define USBMSC_CLASSSTATE_CMDPARSECMDREAD6           0x0003
#define USBMSC_CLASSSTATE_CMDPARSECMDREAD10          0x0004
#define USBMSC_CLASSSTATE_CMDPARSECMDREAD12          0x0005
#define USBMSC_CLASSSTATE_CMDPARSECMDWRITE6          0x0006
#define USBMSC_CLASSSTATE_CMDPARSECMDWRITE10         0x0007
#define USBMSC_CLASSSTATE_CMDPARSECMDWRITE12         0x0008
#define USBMSC_CLASSSTATE_CMDREAD                    0x0009
#define USBMSC_CLASSSTATE_CMDREADCMDFINISH           0x000a
#define USBMSC_CLASSSTATE_CMDWRITE                   0x000b
#define USBMSC_CLASSSTATE_CMDWRITECMDFINISH          0x000c
#define USBMSC_CLASSSTATE_CMDFINISHCMDSTATUS         0x000d
#define USBMSC_CLASSSTATE_CMDSTATUSIDLE              0x000e

/* Values of the class error ID used by the USB storage driver */

#define USBMSC_TRACEERR_ALLOCCTRLREQ                 0x0001
#define USBMSC_TRACEERR_ALLOCDEVSTRUCT               0x0002
#define USBMSC_TRACEERR_ALLOCIOBUFFER                0x0003
#define USBMSC_TRACEERR_ALREADYCONFIGURED            0x0004
#define USBMSC_TRACEERR_ALREADYUNINIT                0x0005
#define USBMSC_TRACEERR_BADREQUEST                   0x0006
#define USBMSC_TRACEERR_BINDLUNINVALIDARGS2          0x0007
#define USBMSC_TRACEERR_BINDLUNINVALIDARGS3          0x0008
#define USBMSC_TRACEERR_BINDLUNINVALIDARGS4          0x0009
#define USBMSC_TRACEERR_BINLUNINVALIDARGS1           0x000a
#define USBMSC_TRACEERR_BLKDRVEOPEN                  0x000b
#define USBMSC_TRACEERR_CMDBADLUN                    0x000c
#define USBMSC_TRACEERR_CMDFINISHRESIDUE             0x000d
#define USBMSC_TRACEERR_CMDFINISHRQEMPTY             0x000e
#define USBMSC_TRACEERR_CMDFINISHSHORTPKT            0x000f
#define USBMSC_TRACEERR_CMDFINISHSUBMIT              0x0010
#define USBMSC_TRACEERR_CMDFINSHDIR                  0x0011
#define USBMSC_TRACEERR_CMDFINSHSUBMIT               0x0012
#define USBMSC_TRACEERR_CMDPARSEWRREQLISTEMPTY       0x0013
#define USBMSC_TRACEERR_CMDREADREADFAIL              0x0014
#define USBMSC_TRACEERR_CMDREADSUBMIT                0x0015
#define USBMSC_TRACEERR_CMDREADWRRQEMPTY             0x0016
#define USBMSC_TRACEERR_CMDSTATUSRDREQLISTEMPTY      0x0017
#define USBMSC_TRACEERR_CMDUNEVIOLATION              0x0018
#define USBMSC_TRACEERR_CMDWRITERDSUBMIT             0x0019
#define USBMSC_TRACEERR_CMDWRITERDRQEMPTY            0x001a
#define USBMSC_TRACEERR_CMDWRITEWRITEFAIL            0x001b
#define USBMSC_TRACEERR_CONFIGIDBAD                  0x001c
#define USBMSC_TRACEERR_CONFIGNONE                   0x001d
#define USBMSC_TRACEERR_DEFERREDRESPINVALIDARGS      0x001e
#define USBMSC_TRACEERR_DEFERREDRESPSTALLED          0x001f
#define USBMSC_TRACEERR_DEFERREDRESPSUBMIT           0x0020
#define USBMSC_TRACEERR_DEVREGISTER                  0x0021
#define USBMSC_TRACEERR_DISCONNECTINVALIDARGS        0x0022
#define USBMSC_TRACEERR_EP0NOTBOUND1                 0x0023
#define USBMSC_TRACEERR_EP0NOTBOUND2                 0x0024
#define USBMSC_TRACEERR_EP0NOTBOUND3                 0x0025
#define USBMSC_TRACEERR_EPBULKINALLOCFAIL            0x0026
#define USBMSC_TRACEERR_EPBULKINCONFIGFAIL           0x0027
#define USBMSC_TRACEERR_EPBULKOUTALLOCFAIL           0x0028
#define USBMSC_TRACEERR_EPBULKOUTCONFIGFAIL          0x0029
#define USBMSC_TRACEERR_EPRESPQ                      0x002a
#define USBMSC_TRACEERR_EXPORTLUNSINVALIDARGS        0x002b
#define USBMSC_TRACEERR_GETMAXLUNNDX                 0x002c
#define USBMSC_TRACEERR_GETUNKNOWNDESC               0x002d
#define USBMSC_TRACEERR_IDLERDREQLISTEMPTY           0x002e
#define USBMSC_TRACEERR_IDLERDSUBMIT                 0x002f
#define USBMSC_TRACEERR_INQUIRYFLAGS                 0x0030
#define USBMSC_TRACEERR_INTERNALCONFUSION1           0x0031
#define USBMSC_TRACEERR_INTERNALCONFUSION2           0x0032
#define USBMSC_TRACEERR_INVALIDCBWCONTENT            0x0033
#define USBMSC_TRACEERR_INVALIDCBWSIGNATURE          0x0034
#define USBMSC_TRACEERR_INVALIDSTATE                 0x0035
#define USBMSC_TRACEERR_LUNALREADYBOUND              0x0036
#define USBMSC_TRACEERR_LUNNOTBOUND                  0x0037
#define USBMSC_TRACEERR_MODEPAGEFLAGS                0x0038
#define USBMSC_TRACEERR_MODESENSE10FLAGS             0x0039
#define USBMSC_TRACEERR_MODESENSE6FLAGS              0x003a
#define USBMSC_TRACEERR_MSRESETNDX                   0x003b
#define USBMSC_TRACEERR_NOGEOMETRY                   0x003c
#define USBMSC_TRACEERR_NOTCONFIGURED                0x003d
#define USBMSC_TRACEERR_NOTREMOVABLE                 0x003e
#define USBMSC_TRACEERR_PCSAVED                      0x003f
#define USBMSC_TRACEERR_PHASEERROR1                  0x0040
#define USBMSC_TRACEERR_PHASEERROR2                  0x0041
#define USBMSC_TRACEERR_PHASEERROR3                  0x0042
#define USBMSC_TRACEERR_PREVENTMEDIUMREMOVALPREVENT  0x0043
#define USBMSC_TRACEERR_RDALLOCREQ                   0x0044
#define USBMSC_TRACEERR_RDCOMPLETEINVALIDARGS        0x0045
#define USBMSC_TRACEERR_RDCOMPLETERDSUBMIT           0x0046
#define USBMSC_TRACEERR_RDSHUTDOWN                   0x0047
#define USBMSC_TRACEERR_RDSUBMIT                     0x0048
#define USBMSC_TRACEERR_RDUNEXPECTED                 0x0049
#define USBMSC_TRACEERR_READ10FLAGS                  0x004a
#define USBMSC_TRACEERR_READ10LBARANGE               0x004b
#define USBMSC_TRACEERR_READ10MEDIANOTPRESENT        0x004c
#define USBMSC_TRACEERR_READ12FLAGS                  0x004d
#define USBMSC_TRACEERR_READ12LBARANGE               0x004e
#define USBMSC_TRACEERR_READ12MEDIANOTPRESENT        0x004f
#define USBMSC_TRACEERR_READ6LBARANGE                0x0050
#define USBMSC_TRACEERR_READ6MEDIANOTPRESENT         0x0051
#define USBMSC_TRACEERR_READCAPACITYFLAGS            0x0052
#define USBMSC_TRACEERR_REALLOCIOBUFFER              0x0053
#define USBMSC_TRACEERR_REQRESULT                    0x0054
#define USBMSC_TRACEERR_SCSICMDCONTROL               0x0055
#define USBMSC_TRACEERR_SETCONFIGINVALIDARGS         0x0056
#define USBMSC_TRACEERR_SETUPINVALIDARGS             0x0057
#define USBMSC_TRACEERR_SNDCSWFAIL                   0x0058
#define USBMSC_TRACEERR_SNDPHERROR                   0x0059
#define USBMSC_TRACEERR_SNDSTATUSSUBMIT              0x005a
#define USBMSC_TRACEERR_SYNCCACHEMEDIANOTPRESENT     0x005b
#define USBMSC_TRACEERR_THREADCREATE                 0x005c
#define USBMSC_TRACEERR_TOOMANYLUNS                  0x005d
#define USBMSC_TRACEERR_UNBINDINVALIDARGS            0x005e
#define USBMSC_TRACEERR_UNBINDLUNINVALIDARGS1        0x005f
#define USBMSC_TRACEERR_UNBINDLUNINVALIDARGS2        0x0060
#define USBMSC_TRACEERR_UNINITIALIZEINVALIDARGS      0x0061
#define USBMSC_TRACEERR_UNSUPPORTEDSTDREQ            0x0062
#define USBMSC_TRACEERR_VERIFY10FLAGS                0x0063
#define USBMSC_TRACEERR_VERIFY10LBARANGE             0x0064
#define USBMSC_TRACEERR_VERIFY10MEDIANOTPRESENT      0x0065
#define USBMSC_TRACEERR_VERIFY10NOBLOCKS             0x0066
#define USBMSC_TRACEERR_VERIFY10READFAIL             0x0067
#define USBMSC_TRACEERR_WRALLOCREQ                   0x0068
#define USBMSC_TRACEERR_SNDPHERROR                   0x0069
#define USBMSC_TRACEERR_WRCOMPLETEINVALIDARGS        0x006a
#define USBMSC_TRACEERR_WRITE10FLAGS                 0x006b
#define USBMSC_TRACEERR_WRITE10LBARANGE              0x006c
#define USBMSC_TRACEERR_WRITE10MEDIANOTPRESENT       0x006d
#define USBMSC_TRACEERR_WRITE10READONLY              0x006e
#define USBMSC_TRACEERR_WRITE12FLAGS                 0x006f
#define USBMSC_TRACEERR_WRITE12LBARANGE              0x0070
#define USBMSC_TRACEERR_WRITE12MEDIANOTPRESENT       0x0071
#define USBMSC_TRACEERR_WRITE12READONLY              0x0072
#define USBMSC_TRACEERR_WRITE6LBARANGE               0x0073
#define USBMSC_TRACEERR_WRITE6MEDIANOTPRESENT        0x0074
#define USBMSC_TRACEERR_WRITE6READONLY               0x0075
#define USBMSC_TRACEERR_WRSHUTDOWN                   0x0076
#define USBMSC_TRACEERR_WRUNEXPECTED                 0x0077

/****************************************************************************
 * Public Types
 ****************************************************************************/

/* The reported trace information */

struct usbtrace_s
{
  uint16_t event;
  uint16_t value;
};

/* Enumeration callback function signature */

typedef int (*trace_callback_t)(struct usbtrace_s *trace, void *arg);

/* Bit mask input type for usbtrace_enable().  If  TRACE_NIDS grows beyond
 * 16, then this will have to be changed to uint32_t
 */

typedef uint16_t usbtrace_idset_t;

/* Print routine to use for usbdev_trprint() output */

typedef int (*trprintf_t)(const char *fmt, ...);

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

#undef EXTERN
#if defined(__cplusplus)
# define EXTERN extern "C"
extern "C" {
#else
# define EXTERN extern
#endif

/*******************************************************************************
 * Name: usbtrace_enable
 *
 * Description:
 *  Enable/disable tracing per trace ID.  The initial state is all IDs enabled.
 *
 * Input Parameters:
 *  idset - The bitset of IDs to be masked.  TRACE_ALLIDS enables all IDS; zero
 *  masks all IDs.
 *
 * Returned Value:
 *  The previous idset value.
 *
 * Assumptions:
 * - May be called from an interrupt handler
 *
 *******************************************************************************/

#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
EXTERN usbtrace_idset_t usbtrace_enable(usbtrace_idset_t idset);
#else
#  define usbtrace_enable(idset)
#endif

/*******************************************************************************
 * Name: usbtrace
 *
 * Description:
 *  Record a USB event (tracing must be enabled)
 *
 * Assumptions:
 *   May be called from an interrupt handler
 *
 *******************************************************************************/

#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
EXTERN void usbtrace(uint16_t event, uint16_t value);
#else
#  define usbtrace(event, value)
#endif

/*******************************************************************************
 * Name: usbtrace_enumerate
 *
 * Description:
 *   Enumerate all buffer trace data (will temporarily disable tracing)
 *
 * Assumptions:
 *   NEVER called from an interrupt handler
 *
 *******************************************************************************/

#ifdef CONFIG_USBDEV_TRACE
EXTERN int usbtrace_enumerate(trace_callback_t callback, void *arg);
#else
#  define usbtrace_enumerate(event)
#endif

/*******************************************************************************
 * Name: usbtrace_trprint
 *
 * Description:
 *   Print the trace record using the supplied printing function
 *
 *******************************************************************************/

EXTERN void usbtrace_trprintf(trprintf_t trprintf, uint16_t event, uint16_t value);

#undef EXTERN
#if defined(__cplusplus)
}
#endif

#endif /* __INCLUDE_NUTTX_USB_USBDEV_TRACE_H */