UVC host library

Dependents:   LifeCam WebcamServer

Committer:
va009039
Date:
Wed Aug 15 13:52:53 2012 +0000
Revision:
3:3eb41d749f9a
add USB_USE_MALLOC

Who changed what in which revision?

UserRevisionLine numberNew 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