UVC host library
Dependents: LifeCam WebcamServer
usb/usb_mem2.cpp@3:3eb41d749f9a, 2012-08-15 (annotated)
- Committer:
- va009039
- Date:
- Wed Aug 15 13:52:53 2012 +0000
- Revision:
- 3:3eb41d749f9a
add USB_USE_MALLOC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 3:3eb41d749f9a | 1 | #include "usbconfig.h" |
va009039 | 3:3eb41d749f9a | 2 | #ifdef USB_USE_MALLOC |
va009039 | 3:3eb41d749f9a | 3 | #include "mbed.h" |
va009039 | 3:3eb41d749f9a | 4 | #define __DEBUG |
va009039 | 3:3eb41d749f9a | 5 | #include "mydbg.h" |
va009039 | 3:3eb41d749f9a | 6 | #include "usb_mem.h" |
va009039 | 3:3eb41d749f9a | 7 | #include "UsbInc.h" |
va009039 | 3:3eb41d749f9a | 8 | |
va009039 | 3:3eb41d749f9a | 9 | #define HCCA_SIZE 0x100 |
va009039 | 3:3eb41d749f9a | 10 | #define ED_SIZE 0x10 |
va009039 | 3:3eb41d749f9a | 11 | #define TD_SIZE 0x10 |
va009039 | 3:3eb41d749f9a | 12 | #define ITD_SIZE 0x20 |
va009039 | 3:3eb41d749f9a | 13 | #define UTD_SIZE (32+16) |
va009039 | 3:3eb41d749f9a | 14 | #define BP_SIZE (192*4) |
va009039 | 3:3eb41d749f9a | 15 | |
va009039 | 3:3eb41d749f9a | 16 | static volatile byte* usb_hcca; //256 bytes aligned! |
va009039 | 3:3eb41d749f9a | 17 | |
va009039 | 3:3eb41d749f9a | 18 | inline static void* malloc_align(size_t size, size_t alignment) |
va009039 | 3:3eb41d749f9a | 19 | { |
va009039 | 3:3eb41d749f9a | 20 | void* p; |
va009039 | 3:3eb41d749f9a | 21 | int r = posix_memalign(&p, alignment, size); |
va009039 | 3:3eb41d749f9a | 22 | if (r == 0) { |
va009039 | 3:3eb41d749f9a | 23 | return p; |
va009039 | 3:3eb41d749f9a | 24 | } |
va009039 | 3:3eb41d749f9a | 25 | return NULL; |
va009039 | 3:3eb41d749f9a | 26 | } |
va009039 | 3:3eb41d749f9a | 27 | |
va009039 | 3:3eb41d749f9a | 28 | static void utd_init() |
va009039 | 3:3eb41d749f9a | 29 | { |
va009039 | 3:3eb41d749f9a | 30 | DBG_ASSERT(sizeof(HCTD) == 16); |
va009039 | 3:3eb41d749f9a | 31 | DBG_ASSERT(sizeof(HCITD) == 32); |
va009039 | 3:3eb41d749f9a | 32 | DBG_ASSERT(sizeof(HCUTD) == 48); |
va009039 | 3:3eb41d749f9a | 33 | } |
va009039 | 3:3eb41d749f9a | 34 | |
va009039 | 3:3eb41d749f9a | 35 | static void pb_init() |
va009039 | 3:3eb41d749f9a | 36 | { |
va009039 | 3:3eb41d749f9a | 37 | } |
va009039 | 3:3eb41d749f9a | 38 | |
va009039 | 3:3eb41d749f9a | 39 | void usb_mem_init() |
va009039 | 3:3eb41d749f9a | 40 | { |
va009039 | 3:3eb41d749f9a | 41 | usb_hcca = (uint8_t*)malloc_align(HCCA_SIZE, 256); |
va009039 | 3:3eb41d749f9a | 42 | |
va009039 | 3:3eb41d749f9a | 43 | utd_init(); |
va009039 | 3:3eb41d749f9a | 44 | pb_init(); |
va009039 | 3:3eb41d749f9a | 45 | |
va009039 | 3:3eb41d749f9a | 46 | DBG("--- Memory Map --- \n"); |
va009039 | 3:3eb41d749f9a | 47 | DBG("usb_hcca =%p\n", usb_hcca); |
va009039 | 3:3eb41d749f9a | 48 | DBG_ASSERT(((uint32_t)usb_hcca % 256) == 0); |
va009039 | 3:3eb41d749f9a | 49 | } |
va009039 | 3:3eb41d749f9a | 50 | |
va009039 | 3:3eb41d749f9a | 51 | volatile byte* usb_get_hcca() |
va009039 | 3:3eb41d749f9a | 52 | { |
va009039 | 3:3eb41d749f9a | 53 | return usb_hcca; |
va009039 | 3:3eb41d749f9a | 54 | } |
va009039 | 3:3eb41d749f9a | 55 | |
va009039 | 3:3eb41d749f9a | 56 | volatile byte* usb_get_ed() |
va009039 | 3:3eb41d749f9a | 57 | { |
va009039 | 3:3eb41d749f9a | 58 | return (uint8_t*)malloc_align(ED_SIZE, 16); |
va009039 | 3:3eb41d749f9a | 59 | } |
va009039 | 3:3eb41d749f9a | 60 | |
va009039 | 3:3eb41d749f9a | 61 | static uint8_t* usb_get_utd(int al) |
va009039 | 3:3eb41d749f9a | 62 | { |
va009039 | 3:3eb41d749f9a | 63 | return (uint8_t*)malloc_align(UTD_SIZE, al); |
va009039 | 3:3eb41d749f9a | 64 | } |
va009039 | 3:3eb41d749f9a | 65 | |
va009039 | 3:3eb41d749f9a | 66 | volatile byte* usb_get_td(uint32_t endpoint) |
va009039 | 3:3eb41d749f9a | 67 | { |
va009039 | 3:3eb41d749f9a | 68 | DBG_ASSERT(endpoint); |
va009039 | 3:3eb41d749f9a | 69 | uint8_t* td = usb_get_utd(16); |
va009039 | 3:3eb41d749f9a | 70 | if (td) { |
va009039 | 3:3eb41d749f9a | 71 | HCUTD* utd = (HCUTD*)td; |
va009039 | 3:3eb41d749f9a | 72 | memset(utd, 0x00, sizeof(HCTD)); |
va009039 | 3:3eb41d749f9a | 73 | utd->type = 1; |
va009039 | 3:3eb41d749f9a | 74 | utd->UsbEndpoint = endpoint; |
va009039 | 3:3eb41d749f9a | 75 | } |
va009039 | 3:3eb41d749f9a | 76 | return td; |
va009039 | 3:3eb41d749f9a | 77 | } |
va009039 | 3:3eb41d749f9a | 78 | |
va009039 | 3:3eb41d749f9a | 79 | volatile byte* usb_get_itd(uint32_t endpoint) |
va009039 | 3:3eb41d749f9a | 80 | { |
va009039 | 3:3eb41d749f9a | 81 | DBG_ASSERT(endpoint); |
va009039 | 3:3eb41d749f9a | 82 | uint8_t* itd = usb_get_utd(32); |
va009039 | 3:3eb41d749f9a | 83 | if (itd) { |
va009039 | 3:3eb41d749f9a | 84 | HCUTD* utd = (HCUTD*)itd; |
va009039 | 3:3eb41d749f9a | 85 | memset(utd, 0x00, sizeof(HCITD)); |
va009039 | 3:3eb41d749f9a | 86 | utd->type = 2; |
va009039 | 3:3eb41d749f9a | 87 | utd->UsbEndpoint = endpoint; |
va009039 | 3:3eb41d749f9a | 88 | } |
va009039 | 3:3eb41d749f9a | 89 | return itd; |
va009039 | 3:3eb41d749f9a | 90 | } |
va009039 | 3:3eb41d749f9a | 91 | |
va009039 | 3:3eb41d749f9a | 92 | volatile byte* usb_get_bp(int size) |
va009039 | 3:3eb41d749f9a | 93 | { |
va009039 | 3:3eb41d749f9a | 94 | DBG_ASSERT(size >= 128 && size <= BP_SIZE); |
va009039 | 3:3eb41d749f9a | 95 | if (size > BP_SIZE) { |
va009039 | 3:3eb41d749f9a | 96 | return NULL; |
va009039 | 3:3eb41d749f9a | 97 | } |
va009039 | 3:3eb41d749f9a | 98 | return (byte*)malloc(size); |
va009039 | 3:3eb41d749f9a | 99 | } |
va009039 | 3:3eb41d749f9a | 100 | |
va009039 | 3:3eb41d749f9a | 101 | int usb_bp_size() |
va009039 | 3:3eb41d749f9a | 102 | { |
va009039 | 3:3eb41d749f9a | 103 | return BP_SIZE; |
va009039 | 3:3eb41d749f9a | 104 | } |
va009039 | 3:3eb41d749f9a | 105 | |
va009039 | 3:3eb41d749f9a | 106 | void usb_free_ed(volatile byte* ed) |
va009039 | 3:3eb41d749f9a | 107 | { |
va009039 | 3:3eb41d749f9a | 108 | free((void*)ed); |
va009039 | 3:3eb41d749f9a | 109 | } |
va009039 | 3:3eb41d749f9a | 110 | |
va009039 | 3:3eb41d749f9a | 111 | static void usb_free_utd(volatile uint8_t* utd) |
va009039 | 3:3eb41d749f9a | 112 | { |
va009039 | 3:3eb41d749f9a | 113 | free((void*)utd); |
va009039 | 3:3eb41d749f9a | 114 | } |
va009039 | 3:3eb41d749f9a | 115 | |
va009039 | 3:3eb41d749f9a | 116 | void usb_free_td(volatile byte* td) |
va009039 | 3:3eb41d749f9a | 117 | { |
va009039 | 3:3eb41d749f9a | 118 | usb_free_utd(td); |
va009039 | 3:3eb41d749f9a | 119 | return; |
va009039 | 3:3eb41d749f9a | 120 | } |
va009039 | 3:3eb41d749f9a | 121 | |
va009039 | 3:3eb41d749f9a | 122 | void usb_free_itd(volatile byte* itd) |
va009039 | 3:3eb41d749f9a | 123 | { |
va009039 | 3:3eb41d749f9a | 124 | usb_free_utd(itd); |
va009039 | 3:3eb41d749f9a | 125 | return; |
va009039 | 3:3eb41d749f9a | 126 | } |
va009039 | 3:3eb41d749f9a | 127 | |
va009039 | 3:3eb41d749f9a | 128 | void usb_free_bp(volatile byte* bp) |
va009039 | 3:3eb41d749f9a | 129 | { |
va009039 | 3:3eb41d749f9a | 130 | free((void*)bp); |
va009039 | 3:3eb41d749f9a | 131 | } |
va009039 | 3:3eb41d749f9a | 132 | |
va009039 | 3:3eb41d749f9a | 133 | bool usb_is_td(volatile byte* td) |
va009039 | 3:3eb41d749f9a | 134 | { |
va009039 | 3:3eb41d749f9a | 135 | DBG_ASSERT(td); |
va009039 | 3:3eb41d749f9a | 136 | HCUTD* utd = (HCUTD*)td; |
va009039 | 3:3eb41d749f9a | 137 | DBG_ASSERT(utd->type != 0); |
va009039 | 3:3eb41d749f9a | 138 | return utd->type == 1; |
va009039 | 3:3eb41d749f9a | 139 | } |
va009039 | 3:3eb41d749f9a | 140 | |
va009039 | 3:3eb41d749f9a | 141 | bool usb_is_itd(volatile byte* itd) |
va009039 | 3:3eb41d749f9a | 142 | { |
va009039 | 3:3eb41d749f9a | 143 | DBG_ASSERT(itd); |
va009039 | 3:3eb41d749f9a | 144 | HCUTD* utd = (HCUTD*)itd; |
va009039 | 3:3eb41d749f9a | 145 | DBG_ASSERT(utd->type != 0); |
va009039 | 3:3eb41d749f9a | 146 | return utd->type == 2; |
va009039 | 3:3eb41d749f9a | 147 | } |
va009039 | 3:3eb41d749f9a | 148 | #endif // USB_USE_MALLOC |