うおーるぼっとをiPhoneでコントロールするプログラムです。 iPhoneとはBTLEで接続しています。

Dependencies:   FatFileSystem HighSpeedAnalogIn TB6612FNG2 mbed

Committer:
jksoft
Date:
Fri May 10 11:48:07 2013 +0000
Revision:
0:373bcb197dc8
?????????

Who changed what in which revision?

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