00001
00058 #ifndef usbmacros_H
00059
00060 #ifndef __doxygen_HIDE
00061
00062 #define usbmacros_H
00063
00064 #endif
00065
00066 #include "IxOsServicesMemAccess.h"
00067 #include "IxAssert.h"
00068
00069
00070 #ifdef __vxworks
00071 extern int logMsg(char *fmt, ...);
00072 #else
00073 #define logMsg printk
00074 #endif
00075
00076
00087 #define EP_DIRECTION(x) ((x) & (USB_IN | USB_OUT))
00088
00099 #define EP_TYPE(x) ((x) & (USB_CONTROL | USB_BULK | USB_ISOCHRONOUS | USB_INTERRUPT))
00100
00101
00102 #ifndef MIN
00103
00113 #define MIN(a, b) ((a) < (b)? (a) : (b))
00114 #endif
00115
00116
00117 #ifndef MAX
00118
00128 #define MAX(a, b) ((a) > (b)? (a) : (b))
00129 #endif
00130
00131
00142 #define QUEUE_WRAP(tail) ((tail) >= (MAX_QUEUE_SIZE) ? ((tail) - (MAX_QUEUE_SIZE)) : (tail))
00143
00144 #if defined(__BIG_ENDIAN)
00145
00149 #define SWAP_USB_WORD(wPtr) (*(wPtr)) = ((*(wPtr) & 0xFF00) >> 8) | \
00150 ((*(wPtr) & 0x00FF) << 8)
00151
00152 #else
00153
00157 #define SWAP_USB_WORD(wPtr) if (0);
00158
00159 #endif
00160
00161
00162
00163 #ifndef __HWEMU__
00164
00166 #define REG_GET(reg_ptr) IX_OSSERV_READ_LONG(reg_ptr)
00167
00168 #define REG_SET(reg_ptr, val) IX_OSSERV_WRITE_LONG(reg_ptr, val)
00169
00171 #define DREG_GET(reg_ptr) (IX_OSSERV_READ_LONG(reg_ptr) & UDC_UDDR_RW_MASK)
00172
00173 #define DREG_SET(reg_ptr, val) IX_OSSERV_WRITE_LONG(reg_ptr, val & UDC_UDDR_RW_MASK)
00174
00175 #else
00176
00177
00179 UINT32
00180 reg32Get(volatile UINT32 *reg_ptr);
00181
00183 void
00184 reg32Set(volatile UINT32 *reg_ptr, UINT32 val);
00185
00186 #define REG_GET(reg_ptr) (reg32Get(reg_ptr))
00187 #define REG_SET(reg_ptr, val) (reg32Set(reg_ptr, val))
00188
00189 #define DREG_GET(reg_ptr) REG_GET(reg_ptr)
00190 #define DREG_SET(reg_ptr, val) REG_SET(reg_ptr, val)
00191
00192 #endif
00193
00194
00195
00196
00198 #define CONTEXT(device) ((USBDeviceContext *)((device)->deviceContext))
00199
00201 #define REGISTERS(device) (CONTEXT(device)->registers)
00202
00204 #define EP0CONTROL(device) (&(CONTEXT(device)->ep0ControlData))
00205
00207 #define EVENTS(device) (&(CONTEXT(device)->eventProcessor))
00208
00210 #define COUNTERS(device) (&(CONTEXT(device)->counters))
00211
00213 #define OPERATION(device) (&(CONTEXT(device)->deviceOperation))
00214
00216 #define EPSTATUS(device, endpointNumber) (&(CONTEXT(device)->epStatusData[endpointNumber]))
00217
00219 #define EPQUEUE(device, endpointNumber) (&(EPSTATUS((device), (endpointNumber))->queue))
00220
00222 #define EPCOUNTERS(device, endpointNumber) (&(EPSTATUS((device), (endpointNumber))->counters))
00223
00225 #define RETURN_OK(device) \
00226 device->lastError = IX_SUCCESS; \
00227 return IX_SUCCESS;
00228
00230 #define RETURN_ERROR(device) \
00231 device->lastError = IX_USB_ERROR; \
00232 return IX_FAIL;
00233
00235 #define RETURN_INVALID_PARMS(device) \
00236 device->lastError = IX_USB_INVALID_PARMS; \
00237 return IX_FAIL;
00238
00240 #define RETURN_REDUNDANT(device) \
00241 device->lastError = IX_USB_REDUNDANT; \
00242 return IX_FAIL;
00243
00245 #define RETURN_INVALID_DEVICE(device) \
00246 device->lastError = IX_USB_INVALID_DEVICE; \
00247 return IX_FAIL;
00248
00250 #define RETURN_NO_ENDPOINT(device) \
00251 device->lastError = IX_USB_NO_ENDPOINT; \
00252 return IX_FAIL;
00253
00255 #define RETURN_ENDPOINT_STALLED(device) \
00256 device->lastError = IX_USB_ENDPOINT_STALLED; \
00257 return IX_FAIL;
00258
00260 #define RETURN_SEND_QUEUE_FULL(device) \
00261 device->lastError = IX_USB_SEND_QUEUE_FULL; \
00262 return IX_FAIL;
00263
00265 #define RETURN_NO_IN_CAPABILITY(device) \
00266 device->lastError = IX_USB_NO_IN_CAPABILITY; \
00267 return IX_FAIL;
00268
00270 #define RETURN_NO_STALL_CAPABILITY(device) \
00271 device->lastError = IX_USB_NO_STALL_CAPABILITY; \
00272 return IX_FAIL;
00273
00275 #define RETURN_NO_PERMISSION(device) \
00276 device->lastError = IX_USB_NO_PERMISSION; \
00277 return IX_FAIL;
00278
00280 #define CHECK_DEVICE(device) \
00281 if (device == NULL) \
00282 { \
00283 return IX_FAIL; \
00284 } \
00285 \
00286 if (CONTEXT(device)->checkPattern != USB_DEVICE_CONTEXT_CHECK_PATTERN) \
00287 { \
00288 return IX_FAIL; \
00289 }
00290
00292 #define CHECK_DEVICE_ENABLED(device) \
00293 if (!CONTEXT(device)->enabled) \
00294 { \
00295 device->lastError = IX_USB_DEVICE_DISABLED; \
00296 return IX_FAIL; \
00297 }
00298
00300 #define CHECK_ENDPOINT(device, endpointNumber) \
00301 if (endpointNumber >= NUM_ENDPOINTS) \
00302 { \
00303 RETURN_NO_ENDPOINT(device); \
00304 }
00305
00307 #define CHECK_ENDPOINT_STALL(device, endpointNumber) \
00308 { \
00309 BOOL stallState; \
00310 ixUSBIsEndpointStalled(device, endpointNumber, &stallState); \
00311 \
00312 if (stallState) \
00313 { \
00314 RETURN_ENDPOINT_STALLED(device); \
00315 } \
00316 }
00317
00319 #define CHECK_EVENT_MASK(device, eventMask) \
00320 if ((eventMask & ~(USB_BUS_EVENTS | USB_DEVICE_EVENTS)) != 0) \
00321 { \
00322 RETURN_INVALID_PARMS(device); \
00323 }
00324
00326 #define CHECK_ENDPOINT_QUEUE(epData) \
00327 if (epData->queue.len == MAX_QUEUE_SIZE) \
00328 { \
00329 RETURN_SEND_QUEUE_FULL(epData->device); \
00330 }
00331
00333 #define CHECK_ENDPOINT_IN_CAPABILITY(epData, device) \
00334 if ((epData->direction & USB_IN) == 0) \
00335 { \
00336 RETURN_NO_IN_CAPABILITY(device); \
00337 }
00338
00339 #ifdef __HWEMU__
00340
00341
00342
00343 #define IX_HWEMU_TRACE printf
00344 #define IX_USB_TRACE printf
00345 #define IX_USB_VERBOSE2_TRACE printf
00346 #define IX_USB_VERBOSE3_TRACE printf
00347 #define IX_USB_VERBOSE4_TRACE printf
00348 #define IX_USB_VERBOSE_MEM_TRACE printf
00349 #define IX_USB_VERBOSE_INIT_TRACE printf
00350 #define IX_USB_VERBOSE_WARN_TRACE printf
00351
00352 #else
00353
00354 #ifndef NDEBUG
00355
00356 #undef IX_USB_HAS_TRACE_MACRO
00357 #undef IX_USB_HAS_VERBOSE_INIT_TRACE_MACRO
00358 #undef IX_USB_HAS_VERBOSE_WARN_TRACE_MACRO
00359 #undef IX_USB_HAS_VERBOSE_MEM_TRACE_MACRO
00360 #undef IX_USB_HAS_VERBOSE_TRACE_MACRO
00361 #undef IX_USB_HAS_VERBOSE_2_TRACE_MACRO
00362 #undef IX_USB_HAS_VERBOSE_3_TRACE_MACRO
00363 #undef IX_USB_HAS_VERBOSE_4_TRACE_MACRO
00364 #undef IX_USB_HAS_VERBOSE_5_TRACE_MACRO
00365
00366 #endif
00367
00368 #ifndef __doxygen_HIDE
00369
00370 #define IX_HWEMU_TRACE if (0) printf
00371
00372 #endif
00373
00374 #ifdef IX_USB_HAS_TRACE_MACRO
00375
00377 #define IX_USB_TRACE logMsg
00378
00379 #else
00380
00382 #define IX_USB_TRACE if (0) logMsg
00383
00384 #endif
00385
00386
00387 #ifndef __doxygen_HIDE
00388
00389 #ifdef IX_USB_HAS_VERBOSE_TRACE_MACRO
00390
00391 #define IX_USB_VERBOSE_TRACE logMsg
00392
00393 #else
00394
00395 #define IX_USB_VERBOSE_TRACE if (0) printf
00396
00397 #endif
00398
00399 #ifdef IX_USB_HAS_VERBOSE_2_TRACE_MACRO
00400
00401 #define IX_USB_VERBOSE2_TRACE logMsg
00402
00403 #else
00404
00405 #define IX_USB_VERBOSE2_TRACE if (0) printf
00406
00407 #endif
00408
00409 #ifdef IX_USB_HAS_VERBOSE_3_TRACE_MACRO
00410
00411 #define IX_USB_VERBOSE3_TRACE logMsg
00412
00413 #else
00414
00415 #define IX_USB_VERBOSE3_TRACE if (0) printf
00416
00417 #endif
00418
00419 #ifdef IX_USB_HAS_VERBOSE_4_TRACE_MACRO
00420
00421 int usbTraceVerbose4 = 0;
00422
00423 #define IX_USB_VERBOSE4_TRACE if (usbTraceVerbose4) logMsg
00424
00425 #else
00426
00427 #define IX_USB_VERBOSE4_TRACE if (0) printf
00428
00429 #endif
00430
00431 #ifdef IX_USB_HAS_VERBOSE_5_TRACE_MACRO
00432
00433 int usbTraceVerbose5 = 0;
00434
00435 #define IX_USB_VERBOSE5_TRACE if (usbTraceVerbose5) logMsg
00436
00437 #else
00438
00439 #define IX_USB_VERBOSE5_TRACE if (0) printf
00440
00441 #endif
00442
00443 #ifdef IX_USB_HAS_VERBOSE_MEM_TRACE_MACRO
00444
00445 #define IX_USB_VERBOSE_MEM_TRACE logMsg
00446
00447 #else
00448
00449 #define IX_USB_VERBOSE_MEM_TRACE if (0) printf
00450
00451 #endif
00452
00453 #ifdef IX_USB_HAS_VERBOSE_WARN_TRACE_MACRO
00454
00455 #define IX_USB_VERBOSE_WARN_TRACE logMsg
00456
00457 #else
00458
00459 #define IX_USB_VERBOSE_WARN_TRACE if (0) printf
00460
00461 #endif
00462
00463 #ifdef IX_USB_HAS_VERBOSE_INIT_TRACE_MACRO
00464
00465 #define IX_USB_VERBOSE_INIT_TRACE logMsg
00466
00467 #else
00468
00469 #define IX_USB_VERBOSE_INIT_TRACE if (0) printf
00470
00471 #endif
00472
00473 #endif
00474
00475 #ifdef IX_USB_HAS_ASSERT_MACRO
00476
00478 #define IX_USB_ASSERT(expr) \
00479 if (expr == FALSE) \
00480 { \
00481 IX_USB_TRACE("Assertion failed\n", 0, 0, 0, 0, 0, 0); \
00482 IX_ASSERT(expr); \
00483 }
00484
00485 #else
00486
00487 #ifndef __doxygen_HIDE
00488
00489 #define IX_USB_ASSERT(expr) if (0);
00490
00491 #endif
00492
00493 #endif
00494
00495 #ifdef IX_USB_HAS_CT_ASSERT_MACRO
00496
00498 #define IX_USB_CT_ASSERT(expr) \
00499 switch (0) { case 0: case (expr):; }
00500
00501 #else
00502
00503 #ifndef __doxygen_HIDE
00504
00505 #define IX_USB_CT_ASSERT(expr)
00506
00507 #endif
00508
00509 #endif
00510
00511 #endif
00512
00513 #ifdef IX_USB_HAS_CRITICAL_DATA_LOCKS
00514
00516 #define IX_USB_LOCK ixOsServIntLock()
00517
00519 #define IX_USB_UNLOCK(state) ixOsServIntUnlock(state)
00520
00522 #define IX_USB_IRQ_LOCK ixOsServIntLock()
00523
00525 #define IX_USB_IRQ_UNLOCK(state) ixOsServIntUnlock(state)
00526
00527 #else
00528
00530 #define IX_USB_LOCK 0
00531
00533 #define IX_USB_UNLOCK(state)
00534
00536 #define IX_USB_IRQ_LOCK 0
00537
00539 #define IX_USB_IRQ_UNLOCK(state)
00540
00541 #endif
00542
00543 #ifdef IX_USB_HAS_INT_BIND_MACRO
00544
00546 #define INT_BIND_MACRO(level, callback, instance) { ixOsServIntBind((int) level, (void (*) (void *)) callback, (void *) instance); }
00547
00548 #else
00549 #ifndef __doxygen_HIDE
00550
00551 #define INT_BIND_MACRO(level, callback, instance)
00552
00553 #endif
00554
00555 #endif
00556
00557 #ifndef __doxygen_HIDE
00558
00559
00560 #define SHOW_NUMBER(x) ((x) > 1000 ? (x) > 1000000 ? ((x) / 1000000) : ((x) / 1000) : (x))
00561 #define SHOW_METRIC(x) ((x) > 1000 ? (x) > 1000000 ? "M" : "k" : " ")
00562
00563 #endif
00564
00565 #endif
00566