CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2

Dependents:   USBEthernet_TEST

Fork of USB_Ethernet by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 13:16:14 2013 +0000
Revision:
2:540f6e142d59
Moved to single package

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 2:540f6e142d59 1 /*********************************************************************
daniele 2:540f6e142d59 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 2:540f6e142d59 3 See LICENSE and COPYING for usage.
daniele 2:540f6e142d59 4
daniele 2:540f6e142d59 5 *********************************************************************/
daniele 2:540f6e142d59 6
daniele 2:540f6e142d59 7 #define DECLARE_HEAP(type, orderby) \
daniele 2:540f6e142d59 8 struct heap_##type { \
daniele 2:540f6e142d59 9 uint32_t size; \
daniele 2:540f6e142d59 10 uint32_t n; \
daniele 2:540f6e142d59 11 type *top; \
daniele 2:540f6e142d59 12 }; \
daniele 2:540f6e142d59 13 typedef struct heap_##type heap_##type; \
daniele 2:540f6e142d59 14 static inline int heap_insert(struct heap_##type *heap, type *el) \
daniele 2:540f6e142d59 15 { \
daniele 2:540f6e142d59 16 int i; \
daniele 2:540f6e142d59 17 type * newTop; \
daniele 2:540f6e142d59 18 if (++heap->n >= heap->size) { \
daniele 2:540f6e142d59 19 newTop = pico_zalloc((heap->n + 1) * sizeof(type)); \
daniele 2:540f6e142d59 20 if(!newTop) \
daniele 2:540f6e142d59 21 return -1; \
daniele 2:540f6e142d59 22 if (heap->top) {\
daniele 2:540f6e142d59 23 memcpy(newTop,heap->top,heap->n*sizeof(type)); \
daniele 2:540f6e142d59 24 pico_free(heap->top); \
daniele 2:540f6e142d59 25 } \
daniele 2:540f6e142d59 26 heap->top = newTop; \
daniele 2:540f6e142d59 27 heap->size++; \
daniele 2:540f6e142d59 28 } \
daniele 2:540f6e142d59 29 if (heap->n == 1) { \
daniele 2:540f6e142d59 30 memcpy(&heap->top[1], el, sizeof(type)); \
daniele 2:540f6e142d59 31 return 0; \
daniele 2:540f6e142d59 32 } \
daniele 2:540f6e142d59 33 for (i = heap->n; ((i > 1) && (heap->top[i / 2].orderby > el->orderby)); i /= 2) { \
daniele 2:540f6e142d59 34 memcpy(&heap->top[i], &heap->top[i / 2], sizeof(type)); \
daniele 2:540f6e142d59 35 } \
daniele 2:540f6e142d59 36 memcpy(&heap->top[i], el, sizeof(type)); \
daniele 2:540f6e142d59 37 return 0; \
daniele 2:540f6e142d59 38 } \
daniele 2:540f6e142d59 39 static inline int heap_peek(struct heap_##type *heap, type *first) \
daniele 2:540f6e142d59 40 { \
daniele 2:540f6e142d59 41 type *last; \
daniele 2:540f6e142d59 42 int i, child; \
daniele 2:540f6e142d59 43 if(heap->n == 0) { \
daniele 2:540f6e142d59 44 return -1; \
daniele 2:540f6e142d59 45 } \
daniele 2:540f6e142d59 46 memcpy(first, &heap->top[1], sizeof(type)); \
daniele 2:540f6e142d59 47 last = &heap->top[heap->n--]; \
daniele 2:540f6e142d59 48 for(i = 1; (i * 2) <= heap->n; i = child) { \
daniele 2:540f6e142d59 49 child = 2 * i; \
daniele 2:540f6e142d59 50 if ((child != heap->n) && \
daniele 2:540f6e142d59 51 (heap->top[child + 1]).orderby \
daniele 2:540f6e142d59 52 < (heap->top[child]).orderby) \
daniele 2:540f6e142d59 53 child++; \
daniele 2:540f6e142d59 54 if (last->orderby > \
daniele 2:540f6e142d59 55 heap->top[child].orderby) \
daniele 2:540f6e142d59 56 memcpy(&heap->top[i], &heap->top[child],\
daniele 2:540f6e142d59 57 sizeof(type)); \
daniele 2:540f6e142d59 58 else \
daniele 2:540f6e142d59 59 break; \
daniele 2:540f6e142d59 60 } \
daniele 2:540f6e142d59 61 memcpy(&heap->top[i], last, sizeof(type)); \
daniele 2:540f6e142d59 62 return 0; \
daniele 2:540f6e142d59 63 } \
daniele 2:540f6e142d59 64 static inline type *heap_first(heap_##type *heap) \
daniele 2:540f6e142d59 65 { \
daniele 2:540f6e142d59 66 if (heap->n == 0) \
daniele 2:540f6e142d59 67 return NULL; \
daniele 2:540f6e142d59 68 return &heap->top[1]; \
daniele 2:540f6e142d59 69 } \
daniele 2:540f6e142d59 70 static inline heap_##type *heap_init(void) \
daniele 2:540f6e142d59 71 { \
daniele 2:540f6e142d59 72 heap_##type *p = (heap_##type *)pico_zalloc(sizeof(heap_##type)); \
daniele 2:540f6e142d59 73 return p; \
daniele 2:540f6e142d59 74 } \
daniele 2:540f6e142d59 75 static inline void heap_destroy(heap_##type *h) \
daniele 2:540f6e142d59 76 { \
daniele 2:540f6e142d59 77 pico_free(h->top); \
daniele 2:540f6e142d59 78 pico_free(h); \
daniele 2:540f6e142d59 79 } \
daniele 2:540f6e142d59 80
daniele 2:540f6e142d59 81