うおーるぼっとを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
jksoft 0:373bcb197dc8 24 #include "UsbEndpoint.h"
jksoft 0:373bcb197dc8 25 #include "UsbDevice.h"
jksoft 0:373bcb197dc8 26 #include "usb_mem.h"
jksoft 0:373bcb197dc8 27 #include "Usb_td.h"
jksoft 0:373bcb197dc8 28 #include "netCfg.h"
jksoft 0:373bcb197dc8 29 #if NET_USB
jksoft 0:373bcb197dc8 30
jksoft 0:373bcb197dc8 31 //#define __DEBUG
jksoft 0:373bcb197dc8 32 //#define __DEBUG3
jksoft 0:373bcb197dc8 33 //#include "dbg/dbg.h"
jksoft 0:373bcb197dc8 34 #include "mydbg.h"
jksoft 0:373bcb197dc8 35
jksoft 0:373bcb197dc8 36 UsbEndpoint::UsbEndpoint( UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr /*= -1*/ )
jksoft 0:373bcb197dc8 37 : m_pDevice(pDevice), m_result(true), m_status((int)USBERR_OK), m_len(0), m_pBufStartPtr(NULL),
jksoft 0:373bcb197dc8 38 m_pCbItem(NULL), m_pCbMeth(NULL)
jksoft 0:373bcb197dc8 39 {
jksoft 0:373bcb197dc8 40 if (type == USB_ISO) {
jksoft 0:373bcb197dc8 41 UsbEndpoint_iso(pDevice, ep, dir, type, size, addr);
jksoft 0:373bcb197dc8 42 return;
jksoft 0:373bcb197dc8 43 }
jksoft 0:373bcb197dc8 44
jksoft 0:373bcb197dc8 45 m_pEd = (volatile HCED*)usb_get_ed();
jksoft 0:373bcb197dc8 46 DBG_ASSERT(m_pEd);
jksoft 0:373bcb197dc8 47 memset((void*)m_pEd, 0, sizeof(HCED));
jksoft 0:373bcb197dc8 48
jksoft 0:373bcb197dc8 49 m_pTdHead = (volatile HCTD*)usb_get_td((uint32_t)this);
jksoft 0:373bcb197dc8 50 DBG_ASSERT(m_pTdHead);
jksoft 0:373bcb197dc8 51 m_pTdTail = (volatile HCTD*)usb_get_td((uint32_t)this);
jksoft 0:373bcb197dc8 52 DBG_ASSERT(m_pTdTail);
jksoft 0:373bcb197dc8 53 DBG("m_pEd =%p\n", m_pEd);
jksoft 0:373bcb197dc8 54 DBG("m_pTdHead=%p\n", m_pTdHead);
jksoft 0:373bcb197dc8 55 DBG("m_pTdTail=%p\n", m_pTdTail);
jksoft 0:373bcb197dc8 56
jksoft 0:373bcb197dc8 57 if(addr == -1)
jksoft 0:373bcb197dc8 58 addr = pDevice->m_addr;
jksoft 0:373bcb197dc8 59
jksoft 0:373bcb197dc8 60 //Setup Ed
jksoft 0:373bcb197dc8 61 //printf("\r\n--Ep Setup--\r\n");
jksoft 0:373bcb197dc8 62 m_pEd->Control = addr | /* USB address */
jksoft 0:373bcb197dc8 63 ((ep & 0x7F) << 7) | /* Endpoint address */
jksoft 0:373bcb197dc8 64 (type!=USB_CONTROL?((dir?2:1) << 11):0) | /* direction : Out = 1, 2 = In */
jksoft 0:373bcb197dc8 65 (size << 16); /* MaxPkt Size */
jksoft 0:373bcb197dc8 66 DBG3("m_pEd->Control=%08X\n", m_pEd->Control);
jksoft 0:373bcb197dc8 67 m_dir = dir;
jksoft 0:373bcb197dc8 68 m_setup = false;
jksoft 0:373bcb197dc8 69 m_type = type;
jksoft 0:373bcb197dc8 70
jksoft 0:373bcb197dc8 71 m_pEd->TailTd = m_pEd->HeadTd = (uint32_t) m_pTdTail; //Empty TD list
jksoft 0:373bcb197dc8 72
jksoft 0:373bcb197dc8 73 DBG("Before link\n");
jksoft 0:373bcb197dc8 74
jksoft 0:373bcb197dc8 75 //printf("\r\n--Ep Reg--\r\n");
jksoft 0:373bcb197dc8 76 //Append Ed to Ed list
jksoft 0:373bcb197dc8 77 HCCA* hcca;
jksoft 0:373bcb197dc8 78 //volatile HCED* nextEd;
jksoft 0:373bcb197dc8 79 DBG("m_type=%d\n", m_type);
jksoft 0:373bcb197dc8 80 switch( m_type )
jksoft 0:373bcb197dc8 81 {
jksoft 0:373bcb197dc8 82 case USB_CONTROL:
jksoft 0:373bcb197dc8 83 m_pEd->Next = LPC_USB->HcControlHeadED;
jksoft 0:373bcb197dc8 84 LPC_USB->HcControlHeadED = (uint32_t)m_pEd;
jksoft 0:373bcb197dc8 85 return;
jksoft 0:373bcb197dc8 86
jksoft 0:373bcb197dc8 87 case USB_BULK:
jksoft 0:373bcb197dc8 88 m_pEd->Next = LPC_USB->HcBulkHeadED;
jksoft 0:373bcb197dc8 89 LPC_USB->HcBulkHeadED = (uint32_t)m_pEd;
jksoft 0:373bcb197dc8 90 return;
jksoft 0:373bcb197dc8 91
jksoft 0:373bcb197dc8 92 case USB_INT:
jksoft 0:373bcb197dc8 93 hcca = (HCCA*)usb_get_hcca();
jksoft 0:373bcb197dc8 94 m_pEd->Next = hcca->IntTable[0];
jksoft 0:373bcb197dc8 95 hcca->IntTable[0] = (uint32_t)m_pEd;
jksoft 0:373bcb197dc8 96 return;
jksoft 0:373bcb197dc8 97
jksoft 0:373bcb197dc8 98 default:
jksoft 0:373bcb197dc8 99 DBG_ASSERT(0);
jksoft 0:373bcb197dc8 100 }
jksoft 0:373bcb197dc8 101 }
jksoft 0:373bcb197dc8 102
jksoft 0:373bcb197dc8 103
jksoft 0:373bcb197dc8 104 UsbEndpoint::~UsbEndpoint()
jksoft 0:373bcb197dc8 105 {
jksoft 0:373bcb197dc8 106 DBG_ASSERT(0);
jksoft 0:373bcb197dc8 107
jksoft 0:373bcb197dc8 108 m_pEd->Control |= ED_SKIP; //Skip this Ep in queue
jksoft 0:373bcb197dc8 109
jksoft 0:373bcb197dc8 110 //Remove from queue
jksoft 0:373bcb197dc8 111 volatile HCED* prevEd;
jksoft 0:373bcb197dc8 112 HCCA* hcca;
jksoft 0:373bcb197dc8 113 switch( m_type )
jksoft 0:373bcb197dc8 114 {
jksoft 0:373bcb197dc8 115 case USB_CONTROL:
jksoft 0:373bcb197dc8 116 prevEd = (volatile HCED*) LPC_USB->HcControlHeadED;
jksoft 0:373bcb197dc8 117 break;
jksoft 0:373bcb197dc8 118 case USB_BULK:
jksoft 0:373bcb197dc8 119 prevEd = (volatile HCED*) LPC_USB->HcBulkHeadED;
jksoft 0:373bcb197dc8 120 break;
jksoft 0:373bcb197dc8 121 case USB_INT:
jksoft 0:373bcb197dc8 122 hcca = (HCCA*)usb_get_hcca();
jksoft 0:373bcb197dc8 123 prevEd = (volatile HCED*)hcca->IntTable[0];
jksoft 0:373bcb197dc8 124 break;
jksoft 0:373bcb197dc8 125 default:
jksoft 0:373bcb197dc8 126 DBG_ASSERT(0);
jksoft 0:373bcb197dc8 127 }
jksoft 0:373bcb197dc8 128 if( m_pEd == prevEd )
jksoft 0:373bcb197dc8 129 {
jksoft 0:373bcb197dc8 130 switch( m_type )
jksoft 0:373bcb197dc8 131 {
jksoft 0:373bcb197dc8 132 case USB_CONTROL:
jksoft 0:373bcb197dc8 133 LPC_USB->HcControlHeadED = m_pEd->Next;
jksoft 0:373bcb197dc8 134 break;
jksoft 0:373bcb197dc8 135 case USB_BULK:
jksoft 0:373bcb197dc8 136 LPC_USB->HcBulkHeadED = m_pEd->Next;
jksoft 0:373bcb197dc8 137 break;
jksoft 0:373bcb197dc8 138 case USB_INT:
jksoft 0:373bcb197dc8 139 hcca = (HCCA*)usb_get_hcca();
jksoft 0:373bcb197dc8 140 hcca->IntTable[0] = m_pEd->Next;
jksoft 0:373bcb197dc8 141 break;
jksoft 0:373bcb197dc8 142 default:
jksoft 0:373bcb197dc8 143 DBG_ASSERT(0);
jksoft 0:373bcb197dc8 144 }
jksoft 0:373bcb197dc8 145 LPC_USB->HcBulkHeadED = m_pEd->Next;
jksoft 0:373bcb197dc8 146 }
jksoft 0:373bcb197dc8 147 else
jksoft 0:373bcb197dc8 148 {
jksoft 0:373bcb197dc8 149 while( prevEd->Next != (uint32_t) m_pEd )
jksoft 0:373bcb197dc8 150 {
jksoft 0:373bcb197dc8 151 prevEd = (volatile HCED*) prevEd->Next;
jksoft 0:373bcb197dc8 152 }
jksoft 0:373bcb197dc8 153 prevEd->Next = m_pEd->Next;
jksoft 0:373bcb197dc8 154 }
jksoft 0:373bcb197dc8 155
jksoft 0:373bcb197dc8 156 //
jksoft 0:373bcb197dc8 157 usb_free_ed((volatile byte*)m_pEd);
jksoft 0:373bcb197dc8 158
jksoft 0:373bcb197dc8 159 usb_free_td((volatile byte*)m_pTdHead);
jksoft 0:373bcb197dc8 160 usb_free_td((volatile byte*)m_pTdTail);
jksoft 0:373bcb197dc8 161 }
jksoft 0:373bcb197dc8 162
jksoft 0:373bcb197dc8 163 void UsbEndpoint::setNextToken(uint32_t token) //Only for control Eps
jksoft 0:373bcb197dc8 164 {
jksoft 0:373bcb197dc8 165 switch(token)
jksoft 0:373bcb197dc8 166 {
jksoft 0:373bcb197dc8 167 case TD_SETUP:
jksoft 0:373bcb197dc8 168 m_dir = false;
jksoft 0:373bcb197dc8 169 m_setup = true;
jksoft 0:373bcb197dc8 170 break;
jksoft 0:373bcb197dc8 171 case TD_IN:
jksoft 0:373bcb197dc8 172 m_dir = true;
jksoft 0:373bcb197dc8 173 m_setup = false;
jksoft 0:373bcb197dc8 174 break;
jksoft 0:373bcb197dc8 175 case TD_OUT:
jksoft 0:373bcb197dc8 176 m_dir = false;
jksoft 0:373bcb197dc8 177 m_setup = false;
jksoft 0:373bcb197dc8 178 break;
jksoft 0:373bcb197dc8 179 }
jksoft 0:373bcb197dc8 180 }
jksoft 0:373bcb197dc8 181
jksoft 0:373bcb197dc8 182 UsbErr UsbEndpoint::transfer(volatile uint8_t* buf, uint32_t len)
jksoft 0:373bcb197dc8 183 {
jksoft 0:373bcb197dc8 184 DBG("buf=%p\n", buf);
jksoft 0:373bcb197dc8 185 if(!m_result)
jksoft 0:373bcb197dc8 186 return USBERR_BUSY; //The previous trasnfer is not completed
jksoft 0:373bcb197dc8 187 //FIXME: We should be able to queue the next transfer, still needs to be implemented
jksoft 0:373bcb197dc8 188
jksoft 0:373bcb197dc8 189 if( !m_pDevice->connected() )
jksoft 0:373bcb197dc8 190 return USBERR_DISCONNECTED;
jksoft 0:373bcb197dc8 191
jksoft 0:373bcb197dc8 192 m_result = false;
jksoft 0:373bcb197dc8 193
jksoft 0:373bcb197dc8 194 volatile uint32_t token = (m_setup?TD_SETUP:(m_dir?TD_IN:TD_OUT));
jksoft 0:373bcb197dc8 195
jksoft 0:373bcb197dc8 196 volatile uint32_t td_toggle;
jksoft 0:373bcb197dc8 197 if (m_type == USB_CONTROL)
jksoft 0:373bcb197dc8 198 {
jksoft 0:373bcb197dc8 199 if (m_setup)
jksoft 0:373bcb197dc8 200 {
jksoft 0:373bcb197dc8 201 td_toggle = TD_TOGGLE_0;
jksoft 0:373bcb197dc8 202 }
jksoft 0:373bcb197dc8 203 else
jksoft 0:373bcb197dc8 204 {
jksoft 0:373bcb197dc8 205 td_toggle = TD_TOGGLE_1;
jksoft 0:373bcb197dc8 206 }
jksoft 0:373bcb197dc8 207 }
jksoft 0:373bcb197dc8 208 else
jksoft 0:373bcb197dc8 209 {
jksoft 0:373bcb197dc8 210 td_toggle = 0;
jksoft 0:373bcb197dc8 211 }
jksoft 0:373bcb197dc8 212
jksoft 0:373bcb197dc8 213 //Swap Tds
jksoft 0:373bcb197dc8 214 volatile HCTD* pTdSwap;
jksoft 0:373bcb197dc8 215 pTdSwap = m_pTdTail;
jksoft 0:373bcb197dc8 216 m_pTdTail = m_pTdHead;
jksoft 0:373bcb197dc8 217 m_pTdHead = pTdSwap;
jksoft 0:373bcb197dc8 218
jksoft 0:373bcb197dc8 219 m_pTdHead->Control = (TD_ROUNDING |
jksoft 0:373bcb197dc8 220 token |
jksoft 0:373bcb197dc8 221 TD_DELAY_INT(0) |//7
jksoft 0:373bcb197dc8 222 td_toggle |
jksoft 0:373bcb197dc8 223 TD_CC);
jksoft 0:373bcb197dc8 224
jksoft 0:373bcb197dc8 225 m_pTdTail->Control = 0;
jksoft 0:373bcb197dc8 226 m_pTdHead->CurrBufPtr = (uint32_t) buf;
jksoft 0:373bcb197dc8 227 m_pBufStartPtr = buf;
jksoft 0:373bcb197dc8 228 m_pTdTail->CurrBufPtr = 0;
jksoft 0:373bcb197dc8 229 m_pTdHead->Next = (uint32_t) m_pTdTail;
jksoft 0:373bcb197dc8 230 m_pTdTail->Next = 0;
jksoft 0:373bcb197dc8 231 m_pTdHead->BufEnd = (uint32_t)(buf + (len - 1));
jksoft 0:373bcb197dc8 232 m_pTdTail->BufEnd = 0;
jksoft 0:373bcb197dc8 233
jksoft 0:373bcb197dc8 234 m_pEd->HeadTd = (uint32_t)m_pTdHead | ((m_pEd->HeadTd) & 0x00000002); //Carry bit
jksoft 0:373bcb197dc8 235 m_pEd->TailTd = (uint32_t)m_pTdTail;
jksoft 0:373bcb197dc8 236
jksoft 0:373bcb197dc8 237 //DBG("m_pEd->HeadTd = %08x\n", m_pEd->HeadTd);
jksoft 0:373bcb197dc8 238
jksoft 0:373bcb197dc8 239 if(m_type == USB_CONTROL) {
jksoft 0:373bcb197dc8 240 LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF;
jksoft 0:373bcb197dc8 241 LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_CLE; //Enable control list
jksoft 0:373bcb197dc8 242 } else if (m_type == USB_BULK) { //USB_BULK
jksoft 0:373bcb197dc8 243 LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF;
jksoft 0:373bcb197dc8 244 LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_BLE; //Enable bulk list
jksoft 0:373bcb197dc8 245 } else if (m_type == USB_INT) { // USB_INT
jksoft 0:373bcb197dc8 246 LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_PLE; //Enable Periodic
jksoft 0:373bcb197dc8 247 } else { // USB_ISO
jksoft 0:373bcb197dc8 248 DBG_ASSERT(0);
jksoft 0:373bcb197dc8 249 }
jksoft 0:373bcb197dc8 250
jksoft 0:373bcb197dc8 251 //m_done = false;
jksoft 0:373bcb197dc8 252 m_len = len;
jksoft 0:373bcb197dc8 253
jksoft 0:373bcb197dc8 254 return USBERR_PROCESSING;
jksoft 0:373bcb197dc8 255
jksoft 0:373bcb197dc8 256 }
jksoft 0:373bcb197dc8 257
jksoft 0:373bcb197dc8 258 int UsbEndpoint::status()
jksoft 0:373bcb197dc8 259 {
jksoft 0:373bcb197dc8 260 if( !m_pDevice->connected() )
jksoft 0:373bcb197dc8 261 {
jksoft 0:373bcb197dc8 262 if(!m_result)
jksoft 0:373bcb197dc8 263 onCompletion();
jksoft 0:373bcb197dc8 264 m_result = true;
jksoft 0:373bcb197dc8 265 return (int)USBERR_DISCONNECTED;
jksoft 0:373bcb197dc8 266 }
jksoft 0:373bcb197dc8 267 else if( !m_result )
jksoft 0:373bcb197dc8 268 {
jksoft 0:373bcb197dc8 269 return (int)USBERR_PROCESSING;
jksoft 0:373bcb197dc8 270 }
jksoft 0:373bcb197dc8 271 /*else if( m_done )
jksoft 0:373bcb197dc8 272 {
jksoft 0:373bcb197dc8 273 return (int)USBERR_OK;
jksoft 0:373bcb197dc8 274 }*/
jksoft 0:373bcb197dc8 275 else
jksoft 0:373bcb197dc8 276 {
jksoft 0:373bcb197dc8 277 return m_status;
jksoft 0:373bcb197dc8 278 }
jksoft 0:373bcb197dc8 279 }
jksoft 0:373bcb197dc8 280
jksoft 0:373bcb197dc8 281 void UsbEndpoint::updateAddr(int addr)
jksoft 0:373bcb197dc8 282 {
jksoft 0:373bcb197dc8 283 DBG("m_pEd->Control = %08x\n", m_pEd->Control);
jksoft 0:373bcb197dc8 284 m_pEd->Control &= ~0x7F;
jksoft 0:373bcb197dc8 285 m_pEd->Control |= addr;
jksoft 0:373bcb197dc8 286 DBG("m_pEd->Control = %08x\n", m_pEd->Control);
jksoft 0:373bcb197dc8 287 }
jksoft 0:373bcb197dc8 288
jksoft 0:373bcb197dc8 289 void UsbEndpoint::updateSize(uint16_t size)
jksoft 0:373bcb197dc8 290 {
jksoft 0:373bcb197dc8 291 DBG("m_pEd->Control = %08x\n", m_pEd->Control);
jksoft 0:373bcb197dc8 292 m_pEd->Control &= ~0x3FF0000;
jksoft 0:373bcb197dc8 293 m_pEd->Control |= (size << 16);
jksoft 0:373bcb197dc8 294 DBG("m_pEd->Control = %08x\n", m_pEd->Control);
jksoft 0:373bcb197dc8 295 }
jksoft 0:373bcb197dc8 296
jksoft 0:373bcb197dc8 297 #if 0 //For doc only
jksoft 0:373bcb197dc8 298 template <class T>
jksoft 0:373bcb197dc8 299 void UsbEndpoint::setOnCompletion( T* pCbItem, void (T::*pCbMeth)() )
jksoft 0:373bcb197dc8 300 {
jksoft 0:373bcb197dc8 301 m_pCbItem = (CDummy*) pCbItem;
jksoft 0:373bcb197dc8 302 m_pCbMeth = (void (CDummy::*)()) pCbMeth;
jksoft 0:373bcb197dc8 303 }
jksoft 0:373bcb197dc8 304 #endif
jksoft 0:373bcb197dc8 305
jksoft 0:373bcb197dc8 306 void UsbEndpoint::onCompletion()
jksoft 0:373bcb197dc8 307 {
jksoft 0:373bcb197dc8 308 DBG_ASSERT(m_type != USB_ISO);
jksoft 0:373bcb197dc8 309 DBG_ASSERT(m_pTdHead);
jksoft 0:373bcb197dc8 310 //DBG("Transfer completed\n");
jksoft 0:373bcb197dc8 311 if( m_pTdHead->Control >> 28 )
jksoft 0:373bcb197dc8 312 {
jksoft 0:373bcb197dc8 313 DBG("TD Failed with condition code %01x\n", m_pTdHead->Control >> 28 );
jksoft 0:373bcb197dc8 314 m_status = (int)USBERR_TDFAIL;
jksoft 0:373bcb197dc8 315 }
jksoft 0:373bcb197dc8 316 else if( m_pEd->HeadTd & 0x1 )
jksoft 0:373bcb197dc8 317 {
jksoft 0:373bcb197dc8 318 m_pEd->HeadTd = m_pEd->HeadTd & ~0x1;
jksoft 0:373bcb197dc8 319 DBG("\r\nHALTED!!\r\n");
jksoft 0:373bcb197dc8 320 m_status = (int)USBERR_HALTED;
jksoft 0:373bcb197dc8 321 }
jksoft 0:373bcb197dc8 322 else if( (m_pEd->HeadTd & ~0xF) == (uint32_t) m_pTdTail )
jksoft 0:373bcb197dc8 323 {
jksoft 0:373bcb197dc8 324 //Done
jksoft 0:373bcb197dc8 325 int len;
jksoft 0:373bcb197dc8 326 DBG("m_pEp=%p\n", m_pEd);
jksoft 0:373bcb197dc8 327 DBG("m_pTdHead->CurrBufPtr=%08x\n", (uint32_t)m_pTdHead->CurrBufPtr);
jksoft 0:373bcb197dc8 328 DBG("m_pBufStartPtr=%08x\n", (uint32_t) m_pBufStartPtr);
jksoft 0:373bcb197dc8 329 if(m_pTdHead->CurrBufPtr)
jksoft 0:373bcb197dc8 330 len = m_pTdHead->CurrBufPtr - (uint32_t) m_pBufStartPtr;
jksoft 0:373bcb197dc8 331 else
jksoft 0:373bcb197dc8 332 len = m_len;
jksoft 0:373bcb197dc8 333 /*if(len == 0) //Packet transfered completely
jksoft 0:373bcb197dc8 334 len = m_len;*/
jksoft 0:373bcb197dc8 335 //m_done = true;
jksoft 0:373bcb197dc8 336 DBG("Transfered %d bytes\n", len);
jksoft 0:373bcb197dc8 337 m_status = len;
jksoft 0:373bcb197dc8 338 }
jksoft 0:373bcb197dc8 339 else
jksoft 0:373bcb197dc8 340 {
jksoft 0:373bcb197dc8 341 DBG("Unknown error...\n");
jksoft 0:373bcb197dc8 342 m_status = (int)USBERR_ERROR;
jksoft 0:373bcb197dc8 343 }
jksoft 0:373bcb197dc8 344 m_result = true;
jksoft 0:373bcb197dc8 345 if(m_pCbItem && m_pCbMeth)
jksoft 0:373bcb197dc8 346 (m_pCbItem->*m_pCbMeth)();
jksoft 0:373bcb197dc8 347 }
jksoft 0:373bcb197dc8 348
jksoft 0:373bcb197dc8 349
jksoft 0:373bcb197dc8 350
jksoft 0:373bcb197dc8 351 void UsbEndpoint::sOnCompletion(uint32_t pTd)
jksoft 0:373bcb197dc8 352 {
jksoft 0:373bcb197dc8 353 HCTD* td = td_reverse((HCTD*)pTd);
jksoft 0:373bcb197dc8 354 while(td) {
jksoft 0:373bcb197dc8 355 HCTD* next = (HCTD*)td->Next;
jksoft 0:373bcb197dc8 356 HCUTD* utd = (HCUTD*)td;
jksoft 0:373bcb197dc8 357 UsbEndpoint* pEp = (UsbEndpoint*)utd->UsbEndpoint;
jksoft 0:373bcb197dc8 358 DBG_ASSERT(pEp);
jksoft 0:373bcb197dc8 359 if (usb_is_itd((byte*)td)) {
jksoft 0:373bcb197dc8 360 HCITD* itd = (HCITD*)td;
jksoft 0:373bcb197dc8 361 DBG_ASSERT(pEp->m_type == USB_ISO);
jksoft 0:373bcb197dc8 362 pEp->queue_done_itd.push(itd);
jksoft 0:373bcb197dc8 363 } else {
jksoft 0:373bcb197dc8 364 DBG_ASSERT(pEp->m_pTdHead == td);
jksoft 0:373bcb197dc8 365 if(pEp->m_pTdHead == td) { // found?
jksoft 0:373bcb197dc8 366 pEp->onCompletion();
jksoft 0:373bcb197dc8 367 }
jksoft 0:373bcb197dc8 368 }
jksoft 0:373bcb197dc8 369 td = next;
jksoft 0:373bcb197dc8 370 }
jksoft 0:373bcb197dc8 371 }
jksoft 0:373bcb197dc8 372
jksoft 0:373bcb197dc8 373 #endif