うおーるぼっとをiPhoneでコントロールするプログラムです。 iPhoneとはBTLEで接続しています。
Dependencies: FatFileSystem HighSpeedAnalogIn TB6612FNG2 mbed
usb/usb_mem.c@0:373bcb197dc8, 2013-05-10 (annotated)
- Committer:
- jksoft
- Date:
- Fri May 10 11:48:07 2013 +0000
- Revision:
- 0:373bcb197dc8
?????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jksoft | 0:373bcb197dc8 | 1 | |
jksoft | 0:373bcb197dc8 | 2 | /* |
jksoft | 0:373bcb197dc8 | 3 | Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) |
jksoft | 0:373bcb197dc8 | 4 | |
jksoft | 0:373bcb197dc8 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy |
jksoft | 0:373bcb197dc8 | 6 | of this software and associated documentation files (the "Software"), to deal |
jksoft | 0:373bcb197dc8 | 7 | in the Software without restriction, including without limitation the rights |
jksoft | 0:373bcb197dc8 | 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
jksoft | 0:373bcb197dc8 | 9 | copies of the Software, and to permit persons to whom the Software is |
jksoft | 0:373bcb197dc8 | 10 | furnished to do so, subject to the following conditions: |
jksoft | 0:373bcb197dc8 | 11 | |
jksoft | 0:373bcb197dc8 | 12 | The above copyright notice and this permission notice shall be included in |
jksoft | 0:373bcb197dc8 | 13 | all copies or substantial portions of the Software. |
jksoft | 0:373bcb197dc8 | 14 | |
jksoft | 0:373bcb197dc8 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
jksoft | 0:373bcb197dc8 | 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
jksoft | 0:373bcb197dc8 | 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
jksoft | 0:373bcb197dc8 | 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
jksoft | 0:373bcb197dc8 | 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
jksoft | 0:373bcb197dc8 | 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
jksoft | 0:373bcb197dc8 | 21 | THE SOFTWARE. |
jksoft | 0:373bcb197dc8 | 22 | */ |
jksoft | 0:373bcb197dc8 | 23 | #include "mbed.h" |
jksoft | 0:373bcb197dc8 | 24 | //#define __DEBUG |
jksoft | 0:373bcb197dc8 | 25 | #include "mydbg.h" |
jksoft | 0:373bcb197dc8 | 26 | #include "usb_mem.h" |
jksoft | 0:373bcb197dc8 | 27 | #include "string.h" //For memcpy, memmove, memset |
jksoft | 0:373bcb197dc8 | 28 | //#include "netCfg.h" |
jksoft | 0:373bcb197dc8 | 29 | #include "UsbInc.h" |
jksoft | 0:373bcb197dc8 | 30 | |
jksoft | 0:373bcb197dc8 | 31 | //#if NET_USB |
jksoft | 0:373bcb197dc8 | 32 | |
jksoft | 0:373bcb197dc8 | 33 | #define EDS_COUNT 16 |
jksoft | 0:373bcb197dc8 | 34 | #define TDS_COUNT 0 |
jksoft | 0:373bcb197dc8 | 35 | #define ITDS_COUNT 0 |
jksoft | 0:373bcb197dc8 | 36 | #define UTDS_COUNT 32 |
jksoft | 0:373bcb197dc8 | 37 | #define BPS_COUNT 8 |
jksoft | 0:373bcb197dc8 | 38 | |
jksoft | 0:373bcb197dc8 | 39 | #define HCCA_SIZE 0x100 |
jksoft | 0:373bcb197dc8 | 40 | #define ED_SIZE 0x10 |
jksoft | 0:373bcb197dc8 | 41 | #define TD_SIZE 0x10 |
jksoft | 0:373bcb197dc8 | 42 | #define ITD_SIZE 0x20 |
jksoft | 0:373bcb197dc8 | 43 | #define UTD_SIZE (32+16) |
jksoft | 0:373bcb197dc8 | 44 | #define BP_SIZE (128*8) |
jksoft | 0:373bcb197dc8 | 45 | |
jksoft | 0:373bcb197dc8 | 46 | #define TOTAL_SIZE (HCCA_SIZE + (EDS_COUNT*ED_SIZE) + (TDS_COUNT*TD_SIZE) + (ITDS_COUNT*ITD_SIZE)) |
jksoft | 0:373bcb197dc8 | 47 | |
jksoft | 0:373bcb197dc8 | 48 | static volatile __align(256) byte usb_buf[TOTAL_SIZE] __attribute((section("AHBSRAM0"),aligned)); //256 bytes aligned! |
jksoft | 0:373bcb197dc8 | 49 | static volatile __align(32) uint8_t usb_utdBuf[UTDS_COUNT*UTD_SIZE] __attribute((section("AHBSRAM0"),aligned)); |
jksoft | 0:373bcb197dc8 | 50 | |
jksoft | 0:373bcb197dc8 | 51 | static volatile byte* usb_hcca; //256 bytes aligned! |
jksoft | 0:373bcb197dc8 | 52 | |
jksoft | 0:373bcb197dc8 | 53 | static volatile byte* usb_edBuf; //4 bytes aligned! |
jksoft | 0:373bcb197dc8 | 54 | |
jksoft | 0:373bcb197dc8 | 55 | static byte usb_edBufAlloc[EDS_COUNT] __attribute((section("AHBSRAM0"),aligned)); |
jksoft | 0:373bcb197dc8 | 56 | static uint8_t usb_utdBufAlloc[UTDS_COUNT] __attribute((section("AHBSRAM0"),aligned)); |
jksoft | 0:373bcb197dc8 | 57 | static uint8_t usb_bpBufAlloc[BPS_COUNT] __attribute((section("AHBSRAM0"),aligned)); |
jksoft | 0:373bcb197dc8 | 58 | static uint8_t usb_bpBuf[BP_SIZE*BPS_COUNT] __attribute((section("AHBSRAM0"),aligned)); |
jksoft | 0:373bcb197dc8 | 59 | |
jksoft | 0:373bcb197dc8 | 60 | static void utd_init() |
jksoft | 0:373bcb197dc8 | 61 | { |
jksoft | 0:373bcb197dc8 | 62 | DBG_ASSERT(sizeof(HCTD) == 16); |
jksoft | 0:373bcb197dc8 | 63 | DBG_ASSERT(sizeof(HCITD) == 32); |
jksoft | 0:373bcb197dc8 | 64 | DBG_ASSERT(sizeof(HCUTD) == 48); |
jksoft | 0:373bcb197dc8 | 65 | |
jksoft | 0:373bcb197dc8 | 66 | DBG_ASSERT(((uint32_t)usb_utdBuf % 16) == 0); |
jksoft | 0:373bcb197dc8 | 67 | DBG_ASSERT(((uint32_t)usb_utdBuf % 32) == 0); |
jksoft | 0:373bcb197dc8 | 68 | |
jksoft | 0:373bcb197dc8 | 69 | DBG_ASSERT((uint32_t)usb_utdBufAlloc >= 0x2007c000); |
jksoft | 0:373bcb197dc8 | 70 | DBG_ASSERT((uint32_t)&usb_utdBufAlloc[UTDS_COUNT] <= 0x2007ffff); |
jksoft | 0:373bcb197dc8 | 71 | |
jksoft | 0:373bcb197dc8 | 72 | DBG_ASSERT((uint32_t)usb_utdBuf >= 0x2007c000); |
jksoft | 0:373bcb197dc8 | 73 | DBG_ASSERT((uint32_t)&usb_utdBuf[UTD_SIZE*UTDS_COUNT] <= 0x2007cfff); |
jksoft | 0:373bcb197dc8 | 74 | |
jksoft | 0:373bcb197dc8 | 75 | memset(usb_utdBufAlloc, 0x00, UTDS_COUNT); |
jksoft | 0:373bcb197dc8 | 76 | } |
jksoft | 0:373bcb197dc8 | 77 | |
jksoft | 0:373bcb197dc8 | 78 | static void pb_init() |
jksoft | 0:373bcb197dc8 | 79 | { |
jksoft | 0:373bcb197dc8 | 80 | memset(usb_bpBufAlloc, 0x00, BPS_COUNT); |
jksoft | 0:373bcb197dc8 | 81 | |
jksoft | 0:373bcb197dc8 | 82 | DBG_ASSERT((uint32_t)usb_bpBufAlloc >= 0x2007c000); |
jksoft | 0:373bcb197dc8 | 83 | DBG_ASSERT((uint32_t)&usb_bpBufAlloc[BPS_COUNT] <= 0x2007ffff); |
jksoft | 0:373bcb197dc8 | 84 | DBG_ASSERT((uint32_t)usb_bpBuf >= 0x2007c000); |
jksoft | 0:373bcb197dc8 | 85 | DBG_ASSERT((uint32_t)(&usb_bpBuf[BP_SIZE*BPS_COUNT]) <= 0x2007ffff); |
jksoft | 0:373bcb197dc8 | 86 | } |
jksoft | 0:373bcb197dc8 | 87 | |
jksoft | 0:373bcb197dc8 | 88 | void usb_mem_init() |
jksoft | 0:373bcb197dc8 | 89 | { |
jksoft | 0:373bcb197dc8 | 90 | usb_hcca = usb_buf; |
jksoft | 0:373bcb197dc8 | 91 | usb_edBuf = usb_buf + HCCA_SIZE; |
jksoft | 0:373bcb197dc8 | 92 | memset(usb_edBufAlloc, 0, EDS_COUNT); |
jksoft | 0:373bcb197dc8 | 93 | |
jksoft | 0:373bcb197dc8 | 94 | utd_init(); |
jksoft | 0:373bcb197dc8 | 95 | pb_init(); |
jksoft | 0:373bcb197dc8 | 96 | |
jksoft | 0:373bcb197dc8 | 97 | DBG("--- Memory Map --- \n"); |
jksoft | 0:373bcb197dc8 | 98 | DBG("usb_hcca =%p\n", usb_hcca); |
jksoft | 0:373bcb197dc8 | 99 | DBG("usb_edBuf =%p\n", usb_edBuf); |
jksoft | 0:373bcb197dc8 | 100 | DBG("usb_utdBuf =%p\n", usb_utdBuf); |
jksoft | 0:373bcb197dc8 | 101 | DBG("usb_edBufAlloc =%p\n", usb_edBufAlloc); |
jksoft | 0:373bcb197dc8 | 102 | DBG("usb_utdBufAlloc=%p\n", usb_utdBufAlloc); |
jksoft | 0:373bcb197dc8 | 103 | DBG("usb_bpBufAlloc =%p\n", usb_bpBufAlloc); |
jksoft | 0:373bcb197dc8 | 104 | DBG("usb_bpBuf =%p\n", usb_bpBuf); |
jksoft | 0:373bcb197dc8 | 105 | DBG(" =%p\n", &usb_bpBuf[BP_SIZE*BPS_COUNT]); |
jksoft | 0:373bcb197dc8 | 106 | DBG_ASSERT(((uint32_t)usb_hcca % 256) == 0); |
jksoft | 0:373bcb197dc8 | 107 | DBG_ASSERT(((uint32_t)usb_edBuf % 16) == 0); |
jksoft | 0:373bcb197dc8 | 108 | DBG_ASSERT(((uint32_t)usb_utdBuf % 32) == 0); |
jksoft | 0:373bcb197dc8 | 109 | } |
jksoft | 0:373bcb197dc8 | 110 | |
jksoft | 0:373bcb197dc8 | 111 | volatile byte* usb_get_hcca() |
jksoft | 0:373bcb197dc8 | 112 | { |
jksoft | 0:373bcb197dc8 | 113 | return usb_hcca; |
jksoft | 0:373bcb197dc8 | 114 | } |
jksoft | 0:373bcb197dc8 | 115 | |
jksoft | 0:373bcb197dc8 | 116 | volatile byte* usb_get_ed() |
jksoft | 0:373bcb197dc8 | 117 | { |
jksoft | 0:373bcb197dc8 | 118 | int i; |
jksoft | 0:373bcb197dc8 | 119 | for(i = 0; i < EDS_COUNT; i++) |
jksoft | 0:373bcb197dc8 | 120 | { |
jksoft | 0:373bcb197dc8 | 121 | if( !usb_edBufAlloc[i] ) |
jksoft | 0:373bcb197dc8 | 122 | { |
jksoft | 0:373bcb197dc8 | 123 | usb_edBufAlloc[i] = 1; |
jksoft | 0:373bcb197dc8 | 124 | return usb_edBuf + i*ED_SIZE; |
jksoft | 0:373bcb197dc8 | 125 | } |
jksoft | 0:373bcb197dc8 | 126 | } |
jksoft | 0:373bcb197dc8 | 127 | return NULL; //Could not alloc ED |
jksoft | 0:373bcb197dc8 | 128 | } |
jksoft | 0:373bcb197dc8 | 129 | |
jksoft | 0:373bcb197dc8 | 130 | static uint8_t* usb_get_utd(int al) |
jksoft | 0:373bcb197dc8 | 131 | { |
jksoft | 0:373bcb197dc8 | 132 | DBG_ASSERT(al == 16 || al == 32); // GTD or ITD |
jksoft | 0:373bcb197dc8 | 133 | if (al == 16) { |
jksoft | 0:373bcb197dc8 | 134 | for(int i = 1; i < UTDS_COUNT; i += 2) { |
jksoft | 0:373bcb197dc8 | 135 | if (usb_utdBufAlloc[i] == 0) { |
jksoft | 0:373bcb197dc8 | 136 | uint32_t p = (uint32_t)usb_utdBuf + i * UTD_SIZE; |
jksoft | 0:373bcb197dc8 | 137 | if ((p % al) == 0) { |
jksoft | 0:373bcb197dc8 | 138 | usb_utdBufAlloc[i] = 1; |
jksoft | 0:373bcb197dc8 | 139 | DBG_ASSERT((p % al) == 0); |
jksoft | 0:373bcb197dc8 | 140 | return (uint8_t*)p; |
jksoft | 0:373bcb197dc8 | 141 | } |
jksoft | 0:373bcb197dc8 | 142 | } |
jksoft | 0:373bcb197dc8 | 143 | } |
jksoft | 0:373bcb197dc8 | 144 | } |
jksoft | 0:373bcb197dc8 | 145 | for(int i = 0; i < UTDS_COUNT; i++) { |
jksoft | 0:373bcb197dc8 | 146 | if (usb_utdBufAlloc[i] == 0) { |
jksoft | 0:373bcb197dc8 | 147 | uint32_t p = (uint32_t)usb_utdBuf + i * UTD_SIZE; |
jksoft | 0:373bcb197dc8 | 148 | if ((p % al) == 0) { |
jksoft | 0:373bcb197dc8 | 149 | usb_utdBufAlloc[i] = 1; |
jksoft | 0:373bcb197dc8 | 150 | DBG_ASSERT((p % al) == 0); |
jksoft | 0:373bcb197dc8 | 151 | return (uint8_t*)p; |
jksoft | 0:373bcb197dc8 | 152 | } |
jksoft | 0:373bcb197dc8 | 153 | } |
jksoft | 0:373bcb197dc8 | 154 | } |
jksoft | 0:373bcb197dc8 | 155 | return NULL; |
jksoft | 0:373bcb197dc8 | 156 | } |
jksoft | 0:373bcb197dc8 | 157 | |
jksoft | 0:373bcb197dc8 | 158 | volatile byte* usb_get_td(uint32_t endpoint) |
jksoft | 0:373bcb197dc8 | 159 | { |
jksoft | 0:373bcb197dc8 | 160 | DBG_ASSERT(endpoint); |
jksoft | 0:373bcb197dc8 | 161 | uint8_t* td = usb_get_utd(16); |
jksoft | 0:373bcb197dc8 | 162 | if (td) { |
jksoft | 0:373bcb197dc8 | 163 | HCUTD* utd = (HCUTD*)td; |
jksoft | 0:373bcb197dc8 | 164 | memset(utd, 0x00, sizeof(HCTD)); |
jksoft | 0:373bcb197dc8 | 165 | utd->type = 1; |
jksoft | 0:373bcb197dc8 | 166 | utd->UsbEndpoint = endpoint; |
jksoft | 0:373bcb197dc8 | 167 | } |
jksoft | 0:373bcb197dc8 | 168 | return td; |
jksoft | 0:373bcb197dc8 | 169 | } |
jksoft | 0:373bcb197dc8 | 170 | |
jksoft | 0:373bcb197dc8 | 171 | volatile byte* usb_get_itd(uint32_t endpoint) |
jksoft | 0:373bcb197dc8 | 172 | { |
jksoft | 0:373bcb197dc8 | 173 | DBG_ASSERT(endpoint); |
jksoft | 0:373bcb197dc8 | 174 | uint8_t* itd = usb_get_utd(32); |
jksoft | 0:373bcb197dc8 | 175 | if (itd) { |
jksoft | 0:373bcb197dc8 | 176 | HCUTD* utd = (HCUTD*)itd; |
jksoft | 0:373bcb197dc8 | 177 | memset(utd, 0x00, sizeof(HCITD)); |
jksoft | 0:373bcb197dc8 | 178 | utd->type = 2; |
jksoft | 0:373bcb197dc8 | 179 | utd->UsbEndpoint = endpoint; |
jksoft | 0:373bcb197dc8 | 180 | } |
jksoft | 0:373bcb197dc8 | 181 | return itd; |
jksoft | 0:373bcb197dc8 | 182 | } |
jksoft | 0:373bcb197dc8 | 183 | |
jksoft | 0:373bcb197dc8 | 184 | volatile byte* usb_get_bp(int size) |
jksoft | 0:373bcb197dc8 | 185 | { |
jksoft | 0:373bcb197dc8 | 186 | DBG_ASSERT(size >= 128 && size <= BP_SIZE); |
jksoft | 0:373bcb197dc8 | 187 | if (size > BP_SIZE) { |
jksoft | 0:373bcb197dc8 | 188 | return NULL; |
jksoft | 0:373bcb197dc8 | 189 | } |
jksoft | 0:373bcb197dc8 | 190 | for(int i = 0; i < BPS_COUNT; i++) |
jksoft | 0:373bcb197dc8 | 191 | { |
jksoft | 0:373bcb197dc8 | 192 | if( !usb_bpBufAlloc[i] ) |
jksoft | 0:373bcb197dc8 | 193 | { |
jksoft | 0:373bcb197dc8 | 194 | usb_bpBufAlloc[i] = 1; |
jksoft | 0:373bcb197dc8 | 195 | return usb_bpBuf + i*BP_SIZE; |
jksoft | 0:373bcb197dc8 | 196 | } |
jksoft | 0:373bcb197dc8 | 197 | } |
jksoft | 0:373bcb197dc8 | 198 | return NULL; //Could not alloc Buffer Page |
jksoft | 0:373bcb197dc8 | 199 | } |
jksoft | 0:373bcb197dc8 | 200 | |
jksoft | 0:373bcb197dc8 | 201 | int usb_bp_size() |
jksoft | 0:373bcb197dc8 | 202 | { |
jksoft | 0:373bcb197dc8 | 203 | return BP_SIZE; |
jksoft | 0:373bcb197dc8 | 204 | } |
jksoft | 0:373bcb197dc8 | 205 | |
jksoft | 0:373bcb197dc8 | 206 | void usb_free_ed(volatile byte* ed) |
jksoft | 0:373bcb197dc8 | 207 | { |
jksoft | 0:373bcb197dc8 | 208 | int i; |
jksoft | 0:373bcb197dc8 | 209 | i = (ed - usb_edBuf) / ED_SIZE; |
jksoft | 0:373bcb197dc8 | 210 | usb_edBufAlloc[i] = 0; |
jksoft | 0:373bcb197dc8 | 211 | } |
jksoft | 0:373bcb197dc8 | 212 | |
jksoft | 0:373bcb197dc8 | 213 | static void usb_free_utd(volatile uint8_t* utd) |
jksoft | 0:373bcb197dc8 | 214 | { |
jksoft | 0:373bcb197dc8 | 215 | DBG_ASSERT(utd >= usb_utdBuf); |
jksoft | 0:373bcb197dc8 | 216 | DBG_ASSERT(utd <= (usb_utdBuf+UTD_SIZE*(UTDS_COUNT-1))); |
jksoft | 0:373bcb197dc8 | 217 | DBG_ASSERT(((uint32_t)utd % 16) == 0); |
jksoft | 0:373bcb197dc8 | 218 | int i = (utd - usb_utdBuf) / UTD_SIZE; |
jksoft | 0:373bcb197dc8 | 219 | DBG_ASSERT(usb_utdBufAlloc[i] == 1); |
jksoft | 0:373bcb197dc8 | 220 | usb_utdBufAlloc[i] = 0; |
jksoft | 0:373bcb197dc8 | 221 | } |
jksoft | 0:373bcb197dc8 | 222 | |
jksoft | 0:373bcb197dc8 | 223 | void usb_free_td(volatile byte* td) |
jksoft | 0:373bcb197dc8 | 224 | { |
jksoft | 0:373bcb197dc8 | 225 | usb_free_utd(td); |
jksoft | 0:373bcb197dc8 | 226 | return; |
jksoft | 0:373bcb197dc8 | 227 | } |
jksoft | 0:373bcb197dc8 | 228 | |
jksoft | 0:373bcb197dc8 | 229 | void usb_free_itd(volatile byte* itd) |
jksoft | 0:373bcb197dc8 | 230 | { |
jksoft | 0:373bcb197dc8 | 231 | usb_free_utd(itd); |
jksoft | 0:373bcb197dc8 | 232 | return; |
jksoft | 0:373bcb197dc8 | 233 | } |
jksoft | 0:373bcb197dc8 | 234 | |
jksoft | 0:373bcb197dc8 | 235 | void usb_free_bp(volatile byte* bp) |
jksoft | 0:373bcb197dc8 | 236 | { |
jksoft | 0:373bcb197dc8 | 237 | DBG_ASSERT(bp >= usb_bpBuf); |
jksoft | 0:373bcb197dc8 | 238 | int i; |
jksoft | 0:373bcb197dc8 | 239 | i = (bp - usb_bpBuf) / BP_SIZE; |
jksoft | 0:373bcb197dc8 | 240 | DBG_ASSERT(usb_bpBufAlloc[i] == 1); |
jksoft | 0:373bcb197dc8 | 241 | usb_bpBufAlloc[i] = 0; |
jksoft | 0:373bcb197dc8 | 242 | } |
jksoft | 0:373bcb197dc8 | 243 | |
jksoft | 0:373bcb197dc8 | 244 | bool usb_is_td(volatile byte* td) |
jksoft | 0:373bcb197dc8 | 245 | { |
jksoft | 0:373bcb197dc8 | 246 | DBG_ASSERT(td); |
jksoft | 0:373bcb197dc8 | 247 | HCUTD* utd = (HCUTD*)td; |
jksoft | 0:373bcb197dc8 | 248 | DBG_ASSERT(utd->type != 0); |
jksoft | 0:373bcb197dc8 | 249 | return utd->type == 1; |
jksoft | 0:373bcb197dc8 | 250 | } |
jksoft | 0:373bcb197dc8 | 251 | |
jksoft | 0:373bcb197dc8 | 252 | bool usb_is_itd(volatile byte* itd) |
jksoft | 0:373bcb197dc8 | 253 | { |
jksoft | 0:373bcb197dc8 | 254 | DBG_ASSERT(itd); |
jksoft | 0:373bcb197dc8 | 255 | HCUTD* utd = (HCUTD*)itd; |
jksoft | 0:373bcb197dc8 | 256 | DBG_ASSERT(utd->type != 0); |
jksoft | 0:373bcb197dc8 | 257 | return utd->type == 2; |
jksoft | 0:373bcb197dc8 | 258 | } |
jksoft | 0:373bcb197dc8 | 259 | |
jksoft | 0:373bcb197dc8 | 260 | //#endif |