Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
usbd_SAM3U2C.c
00001 /*---------------------------------------------------------------------------- 00002 * RL-ARM - USB 00003 *---------------------------------------------------------------------------- 00004 * Name: usbd_SAM3U.c 00005 * Purpose: Hardware Layer module for Atmel SAM3U 00006 * Rev.: V4.70 00007 *---------------------------------------------------------------------------- 00008 * This code is part of the RealView Run-Time Library. 00009 * Copyright (c) 2004-2013 KEIL - An ARM Company. All rights reserved. 00010 *---------------------------------------------------------------------------*/ 00011 00012 #include "RTL.h" 00013 #include "rl_usb.h" 00014 #include "sam3u.h" 00015 00016 #define __NO_USB_LIB_C 00017 #include "usb_config.c" 00018 00019 #define UDPHS_EPTFIFO_BASE (0x20180000) /* (UDPHS_EPTFIFO) Base Address */ 00020 00021 00022 /* 00023 * Calculate EP size code Function 00024 * Called during EndPoint configuration 00025 * Return Value: EP size code for given EP size 00026 */ 00027 00028 static int USBD_CalcSizeEP (uint32_t size) { 00029 00030 if (size <= 8) { 00031 return (0); 00032 } 00033 else if (size <= 16) { 00034 return (1); 00035 } 00036 else if (size <= 32) { 00037 return (2); 00038 } 00039 else if (size <= 64) { 00040 return (3); 00041 } 00042 else if (size <= 128) { 00043 return (4); 00044 } 00045 else if (size <= 256) { 00046 return (5); 00047 } 00048 else if (size <= 512) { 00049 return (6); 00050 } 00051 else if (size <= 1024) { 00052 return (7); 00053 } 00054 return (0); 00055 } 00056 00057 00058 /* 00059 * Retrieve bank number Function 00060 * Called during EndPoint configuration 00061 * Return Value: Bank number for given EP 00062 */ 00063 00064 static int USBD_GetBankEP (uint32_t EPNum) { 00065 00066 EPNum &= 0x0F; /* Set EP number */ 00067 switch (EPNum) { 00068 case 0: 00069 return (1); /* One bank (Bank0) */ 00070 case 1: 00071 case 2: 00072 return (2); /* Double bank (Ping-Pong: Bnk0/Bnk1) */ 00073 case 3: 00074 case 4: 00075 case 5: 00076 case 6: 00077 return (3); /* Triple bank (Bank0 / Bank1 / Bank2)*/ 00078 default: 00079 return (0); /* Zero bank, the EP not mapped in mem*/ 00080 } 00081 } 00082 00083 00084 /* 00085 * Retrieve maximum EP size Function 00086 * Called during EndPoint configuration 00087 * Return Value: maximum size for given EP 00088 */ 00089 00090 static int USBD_GetSizeEP (uint32_t EPNum) { 00091 switch (EPNum & 0x0F) { 00092 case 0: 00093 return (64); /* Maximum size is 64 bytes */ 00094 case 1: 00095 case 2: 00096 return (512); /* Maximum size is 512 bytes */ 00097 case 3: 00098 case 4: 00099 return (64); /* Maximum size is 64 bytes */ 00100 case 5: 00101 case 6: 00102 return (1024); /* Maximum size is 1024 bytes */ 00103 default: 00104 return (0); /* Non existant endpoint */ 00105 } 00106 } 00107 00108 00109 /* 00110 * USB Device Interrupt enable 00111 * Called by USBD_Init to enable the USB Interrupt 00112 * Return Value: None 00113 */ 00114 00115 void USBD_IntrEna (void) { 00116 NVIC_EnableIRQ(UDPHS_IRQn); /* Enable USB interrupt */ 00117 } 00118 00119 00120 /* 00121 * USB Device Initialize Function 00122 * Called by the User to initialize USB Device 00123 * Return Value: None 00124 */ 00125 00126 void USBD_Init (void) { 00127 uint32_t n; 00128 00129 /* Enables the 48MHz USB Clock UDPCK and System Peripheral USB Clock */ 00130 PMC->PMC_WPMR = 0x504D4300; /* Disable write protect */ 00131 PMC->PMC_PCER0 = (1 << ID_UDPHS); /* enable clock for UPDHS */ 00132 PMC->CKGR_UCKR = (CKGR_UCKR_UPLLCOUNT(15) | CKGR_UCKR_UPLLEN); 00133 while (!(PMC->PMC_SR & PMC_SR_LOCKU)); /* wait until PLL is locked */ 00134 PMC->PMC_WPMR = 0x504D4301; /* Enable write protect */ 00135 00136 /* Configure the pull-up on D+ and disconnect it */ 00137 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_DETACH; /* Detach */ 00138 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_PULLD_DIS; /* Disable Pull Down */ 00139 00140 /* Reset IP UDPHS */ 00141 UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_EN_UDPHS; 00142 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_EN_UDPHS; 00143 00144 #if (!USBD_HS_ENABLE) /* If HS disabled */ 00145 UDPHS->UDPHS_TST |= (3 & UDPHS_TST_SPEED_CFG_Msk); 00146 #endif 00147 00148 /* Disable DMA for UDPHS */ 00149 for (n = 1; n < (UDPHSDMA_NUMBER); n++) { 00150 /* RESET endpoint canal DMA: */ 00151 UDPHS->UDPHS_DMA[n].UDPHS_DMACONTROL = 0; /* STOP command */ 00152 /* Disable endpoint */ 00153 UDPHS->UDPHS_EPT[n].UDPHS_EPTCTLDIS = 0xFFFFFFFF; 00154 /* Clear status endpoint */ 00155 UDPHS->UDPHS_EPT[n].UDPHS_EPTCLRSTA = 0xFFFFFFFF; 00156 /* Reset endpoint config */ 00157 UDPHS->UDPHS_EPT[n].UDPHS_EPTCTLENB = 0; 00158 /* Reset DMA channel (Buff count and Control field) */ 00159 UDPHS->UDPHS_DMA[n].UDPHS_DMACONTROL = (0x1 << 1); /* NON STOP command */ 00160 /* Reset DMA channel 0 (STOP) */ 00161 UDPHS->UDPHS_DMA[n].UDPHS_DMACONTROL = 0; /* STOP command */ 00162 /* Clear DMA channel status (read the register for clear it) */ 00163 UDPHS->UDPHS_DMA[n].UDPHS_DMASTATUS = UDPHS->UDPHS_DMA[n].UDPHS_DMASTATUS; 00164 } 00165 00166 UDPHS->UDPHS_IEN = 0; 00167 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_UPSTR_RES | 00168 UDPHS_CLRINT_ENDOFRSM | 00169 UDPHS_CLRINT_WAKE_UP | 00170 UDPHS_CLRINT_ENDRESET | 00171 UDPHS_CLRINT_INT_SOF | 00172 UDPHS_CLRINT_MICRO_SOF | 00173 UDPHS_CLRINT_DET_SUSPD; 00174 00175 USBD_IntrEna(); /* Enable USB interrupt */ 00176 } 00177 00178 00179 /* 00180 * USB Device Connect Function 00181 * Called by the User to Connect/Disconnect USB Device 00182 * Parameters: con: Connect/Disconnect 00183 * Return Value: None 00184 */ 00185 00186 void USBD_Connect (BOOL con) { 00187 if (con) { 00188 UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_DETACH; /* Pull Up on DP */ 00189 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_PULLD_DIS; /* Disable Pull Down */ 00190 } else { 00191 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_DETACH; /* Detach */ 00192 UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_PULLD_DIS; /* Enable Pull Down */ 00193 } 00194 } 00195 00196 00197 /* 00198 * USB Device Reset Function 00199 * Called automatically on USB Device Reset 00200 * Return Value: None 00201 */ 00202 00203 void USBD_Reset (void) { 00204 uint32_t ep, EPMask; 00205 00206 EPMask = ((1 << (USBD_EP_NUM+1)) - 1); 00207 00208 /* Reset & Disable USB Endpoints */ 00209 for (ep = 0; ep <= USBD_EP_NUM; ep++) { 00210 UDPHS->UDPHS_EPT[ep].UDPHS_EPTCFG = 0; 00211 UDPHS->UDPHS_EPT[ep].UDPHS_EPTCTLDIS = (0x1 << 0); /* Disable EP */ 00212 } 00213 UDPHS->UDPHS_EPTRST = EPMask; /* Reset EPs */ 00214 UDPHS->UDPHS_EPTRST = 0; 00215 00216 /* Setup USB Interrupts */ /* note: Micro_SOF not yet handled */ 00217 #ifdef __RTX 00218 UDPHS->UDPHS_IEN = ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_DET_SUSPD : 0) | 00219 ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_MICRO_SOF : 0) | 00220 ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_INT_SOF : 0) | 00221 ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_ENDRESET : 0) | 00222 // ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_WAKE_UP : 0) | 00223 // ((USBD_RTX_DevTask != 0) ? UDPHS_IEN_UPSTR_RES : 0) | 00224 #else 00225 UDPHS->UDPHS_IEN = ((USBD_P_Suspend_Event != 0) ? UDPHS_IEN_DET_SUSPD : 0) | 00226 ((USBD_P_SOF_Event != 0) ? UDPHS_IEN_MICRO_SOF : 0) | 00227 ((USBD_P_SOF_Event != 0) ? UDPHS_IEN_INT_SOF : 0) | 00228 ((USBD_P_Reset_Event != 0) ? UDPHS_IEN_ENDRESET : 0) | 00229 // ((USBD_P_WakeUp_Event != 0) ? UDPHS_IEN_WAKE_UP : 0) | 00230 // ((USBD_P_Resume_Event != 0) ? UDPHS_IEN_UPSTR_RES : 0) | 00231 #endif 00232 (EPMask << 8); 00233 00234 /* Setup Control Endpoint 0 */ 00235 UDPHS->UDPHS_EPT[0].UDPHS_EPTCFG = UDPHS_EPTCFG_BK_NUMBER_1 | 00236 UDPHS_EPTCFG_EPT_TYPE_CTRL8 | 00237 USBD_CalcSizeEP(USBD_MAX_PACKET0) ; 00238 UDPHS->UDPHS_EPT[0].UDPHS_EPTCTLENB = UDPHS_EPTCTLENB_RXRDY_TXKL | 00239 UDPHS_EPTCTLENB_TX_COMPLT | 00240 UDPHS_EPTCTLENB_RX_SETUP | 00241 UDPHS_EPTCTLENB_STALL_SNT | 00242 UDPHS_EPTCTLENB_NYET_DIS | 00243 UDPHS_EPTCTLENB_EPT_ENABL; 00244 } 00245 00246 00247 /* 00248 * USB Device Suspend Function 00249 * Called automatically on USB Device Suspend 00250 * Return Value: None 00251 */ 00252 00253 void USBD_Suspend (void) { 00254 UDPHS->UDPHS_IEN &= ~UDPHS_IEN_DET_SUSPD; 00255 UDPHS->UDPHS_IEN |= UDPHS_IEN_WAKE_UP; 00256 } 00257 00258 00259 /* 00260 * USB Device Resume Function 00261 * Called automatically on USB Device Resume 00262 * Return Value: None 00263 */ 00264 00265 void USBD_Resume (void) { 00266 UDPHS->UDPHS_IEN &= ~UDPHS_IEN_WAKE_UP; 00267 UDPHS->UDPHS_IEN |= UDPHS_IEN_DET_SUSPD; 00268 } 00269 00270 00271 /* 00272 * USB Device Remote Wakeup Function 00273 * Called automatically on USB Device Remote Wakeup 00274 * Return Value: None 00275 */ 00276 00277 void USBD_WakeUp (void) { 00278 UDPHS->UDPHS_IEN |= UDPHS_IEN_UPSTR_RES; 00279 UDPHS->UDPHS_CTRL |= UDPHS_CTRL_REWAKEUP; 00280 } 00281 00282 00283 /* 00284 * USB Device Remote Wakeup Configuration Function 00285 * Parameters: cfg: Device Enable/Disable 00286 * Return Value: None 00287 */ 00288 00289 void USBD_WakeUpCfg (BOOL cfg) { 00290 if (cfg) { 00291 /* Enable wakeup mechanism */ 00292 } else { 00293 UDPHS->UDPHS_CTRL &= ~UDPHS_CTRL_REWAKEUP; 00294 UDPHS->UDPHS_IEN &= ~UDPHS_IEN_UPSTR_RES; 00295 } 00296 } 00297 00298 00299 /* 00300 * USB Device Set Address Function 00301 * Parameters: adr: USB Device Address 00302 * setup: Called in setup stage (!=0), else after status stage 00303 * Return Value: None 00304 */ 00305 00306 void USBD_SetAddress (uint32_t adr, uint32_t setup) { 00307 if (setup) return; 00308 if (adr) { 00309 UDPHS->UDPHS_CTRL |= (UDPHS_CTRL_FADDR_EN | adr); 00310 } else { 00311 UDPHS->UDPHS_CTRL &= ~(UDPHS_CTRL_FADDR_EN | UDPHS_CTRL_DEV_ADDR_Msk); 00312 } 00313 } 00314 00315 00316 /* 00317 * USB Device Configure Function 00318 * Parameters: cfg: Device Configure/Deconfigure 00319 * Return Value: None 00320 */ 00321 00322 void USBD_Configure (BOOL cfg) { 00323 /* Performed by Hardware */ 00324 } 00325 00326 00327 /* 00328 * Configure USB Device Endpoint according to Descriptor 00329 * Parameters: pEPD: Pointer to Device Endpoint Descriptor 00330 * Return Value: None 00331 */ 00332 00333 void USBD_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD) { 00334 uint32_t num, type, dir, size, bank, interval; 00335 00336 num = pEPD->bEndpointAddress & 0x0F; 00337 type = pEPD->bmAttributes & USB_ENDPOINT_TYPE_MASK; 00338 dir = pEPD->bEndpointAddress >> 7; 00339 interval = pEPD->bInterval; 00340 size = USBD_CalcSizeEP(pEPD->wMaxPacketSize); 00341 bank = USBD_GetBankEP(num); 00342 00343 /* Check if MaxPacketSize fits for EndPoint */ 00344 if (pEPD->wMaxPacketSize <= USBD_GetSizeEP(num)) { 00345 UDPHS->UDPHS_EPT[num].UDPHS_EPTCFG = (interval << 8) | 00346 (bank << 6) | 00347 (type << 4) | 00348 (dir << 3) | 00349 (size << 0) ; 00350 00351 UDPHS->UDPHS_EPT[num].UDPHS_EPTCTLENB = 00352 (0x1 << 9) | /* Received OUT Data Interrupt Enable */ 00353 (0x1 << 10) | /* Transmitted IN Data Complete Interrupt Enable */ 00354 (0x1 << 4) | /* NYET Disable (Only for High Speed Bulk OUT endpoints) */ 00355 (0x1 << 13) ; /* Stall Sent /ISO CRC Error/Number of Transaction Error */ 00356 } 00357 } 00358 00359 00360 /* 00361 * Set Direction for USB Device Control Endpoint 00362 * Parameters: dir: Out (dir == 0), In (dir <> 0) 00363 * Return Value: None 00364 */ 00365 00366 void USBD_DirCtrlEP (uint32_t dir) { 00367 /* Performed by Hardware */ 00368 } 00369 00370 00371 /* 00372 * Enable USB Device Endpoint 00373 * Parameters: EPNum: Device Endpoint Number 00374 * EPNum.0..3: Address 00375 * EPNum.7: Dir 00376 * Return Value: None 00377 */ 00378 00379 void USBD_EnableEP (uint32_t EPNum) { 00380 UDPHS->UDPHS_EPT[EPNum & 0x0F].UDPHS_EPTCTLENB = (0x1 << 0); /* EP Enable */ 00381 } 00382 00383 00384 /* 00385 * Disable USB Device Endpoint 00386 * Parameters: EPNum: Device Endpoint Number 00387 * EPNum.0..3: Address 00388 * EPNum.7: Dir 00389 * Return Value: None 00390 */ 00391 00392 void USBD_DisableEP (uint32_t EPNum) { 00393 UDPHS->UDPHS_EPT[EPNum & 0x0F].UDPHS_EPTCTLDIS = (0x1 << 0); /* EP Disable */ 00394 } 00395 00396 00397 /* 00398 * Reset USB Device Endpoint 00399 * Parameters: EPNum: Device Endpoint Number 00400 * EPNum.0..3: Address 00401 * EPNum.7: Dir 00402 * Return Value: None 00403 */ 00404 00405 void USBD_ResetEP (uint32_t EPNum) { 00406 EPNum &= 0x0F; 00407 UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTCLRSTA = (0x1 << 6) | /* Data Toggle Clear*/ 00408 (0x1 << 5); /* Stall Req Set */ 00409 00410 UDPHS->UDPHS_EPTRST |= (1 << EPNum); /* Reset endpoint */ 00411 UDPHS->UDPHS_EPTRST &= ~(1 << EPNum); 00412 } 00413 00414 00415 /* 00416 * Set Stall for USB Device Endpoint 00417 * Parameters: EPNum: Device Endpoint Number 00418 * EPNum.0..3: Address 00419 * EPNum.7: Dir 00420 * Return Value: None 00421 */ 00422 00423 void USBD_SetStallEP (uint32_t EPNum) { 00424 UDPHS->UDPHS_EPT[EPNum & 0x0F].UDPHS_EPTSETSTA = (0x1 << 5); /* Stall Set */ 00425 } 00426 00427 00428 /* 00429 * Clear Stall for USB Device Endpoint 00430 * Parameters: EPNum: Device Endpoint Number 00431 * EPNum.0..3: Address 00432 * EPNum.7: Dir 00433 * Return Value: None 00434 */ 00435 00436 void USBD_ClrStallEP (uint32_t EPNum) { 00437 UDPHS->UDPHS_EPT[EPNum & 0x0F].UDPHS_EPTCLRSTA = (0x1 << 6) | /* Clr Toggle */ 00438 (0x1 << 5); /* Stall Clear*/ 00439 } 00440 00441 00442 /* 00443 * Read USB Device Endpoint Data 00444 * Parameters: EPNum: Device Endpoint Number 00445 * EPNum.0..3: Address 00446 * EPNum.7: Dir 00447 * pData: Pointer to Data Buffer 00448 * Return Value: Number of bytes read 00449 */ 00450 00451 uint32_t USBD_ReadEP (uint32_t EPNum, uint8_t *pData) { 00452 uint32_t cnt, n; 00453 uint8_t *pEPFIFO; /* Pointer to EP FIFO */ 00454 00455 EPNum &= 0x0F; 00456 pEPFIFO = (uint8_t *)((uint32_t *)UDPHS_EPTFIFO_BASE + (16384*EPNum)); 00457 cnt = (UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTSTA >> 20) & 0x07FF; /* Get by */ 00458 for (n = 0; n < cnt; n++) { 00459 *pData++ = *pEPFIFO++; 00460 } 00461 UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTCLRSTA = (0x1 << 9); /* Rece OUT Clear */ 00462 00463 /* RX_Setup must be cleared after Setup packet is read */ 00464 UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTCLRSTA = (0x1 << 12); /* Rece SETUP Clear */ 00465 00466 UDPHS->UDPHS_IEN |= (1 << (EPNum + 8)); /* Enable EP int after data read*/ 00467 00468 return (cnt); 00469 } 00470 00471 00472 /* 00473 * Write USB Device Endpoint Data 00474 * Parameters: EPNum: Device Endpoint Number 00475 * EPNum.0..3: Address 00476 * EPNum.7: Dir 00477 * pData: Pointer to Data Buffer 00478 * cnt: Number of bytes to write 00479 * Return Value: Number of bytes written 00480 */ 00481 00482 uint32_t USBD_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt) { 00483 uint32_t n; 00484 uint8_t *pEPFIFO; /* Pointer to the endpoint FIFO */ 00485 00486 EPNum &= 0x0F; 00487 if (UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTSTA & (0x1 << 5)) { /* If EP is stall */ 00488 return (cnt); 00489 } 00490 00491 if (UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTSTA & (0x1 << 11)) { /* Bank not ready */ 00492 return (0); 00493 } 00494 00495 pEPFIFO = (uint8_t *)((uint32_t *)UDPHS_EPTFIFO_BASE + (16384*EPNum)); 00496 for (n = 0; n < cnt; n++) { 00497 *pEPFIFO++ = *pData++; /* Write data to FIFO */ 00498 } 00499 00500 UDPHS->UDPHS_EPT[EPNum].UDPHS_EPTSETSTA = (0x1 << 11); /* Set packet ready */ 00501 00502 return (cnt); 00503 } 00504 00505 00506 /* 00507 * Get USB Device Last Frame Number 00508 * Parameters: None 00509 * Return Value: Frame Number 00510 */ 00511 00512 uint32_t USBD_GetFrame (void) { 00513 uint32_t val; 00514 00515 if ((UDPHS->UDPHS_FNUM & (1UL << 31)) == 0) { 00516 if (USBD_HighSpeed) val = UDPHS->UDPHS_FNUM & 0x7FFFFFFF; 00517 else val = (UDPHS->UDPHS_FNUM & UDPHS_FNUM_FRAME_NUMBER_Msk) >> 3; 00518 } else { 00519 val = 0xFFFFFFFF; 00520 } 00521 00522 return (val); 00523 } 00524 00525 00526 #ifdef __RTX 00527 uint32_t LastError; /* Last Error */ 00528 00529 /* 00530 * Get USB Device Last Error Code 00531 * Parameters: None 00532 * Return Value: Error Code 00533 */ 00534 00535 uint32_t USBD_GetError (void) { 00536 return (LastError); 00537 } 00538 #endif 00539 00540 00541 /* 00542 * USB Device Interrupt Service Routine 00543 */ 00544 00545 void UDPHS_IRQHandler (void) { 00546 uint32_t intsta, eptsta, n; 00547 00548 intsta = UDPHS->UDPHS_INTSTA & UDPHS->UDPHS_IEN; 00549 00550 /* End of Bus Reset Interrupt */ 00551 if (intsta & UDPHS_INTSTA_ENDRESET) { 00552 /* Get used speed (HighSpeed or FullSpeed) */ 00553 USBD_HighSpeed = (UDPHS->UDPHS_INTSTA & UDPHS_INTSTA_SPEED) ? 1 : 0; 00554 00555 USBD_Reset(); 00556 usbd_reset_core(); 00557 #ifdef __RTX 00558 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_ENDRESET; 00559 if (USBD_RTX_DevTask) { 00560 isr_evt_set(USBD_EVT_RESET, USBD_RTX_DevTask); 00561 } 00562 #else 00563 if (USBD_P_Reset_Event) { 00564 USBD_P_Reset_Event(); 00565 } 00566 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_ENDRESET; 00567 #endif 00568 } 00569 00570 /* USB Suspend Interrupt */ 00571 if (intsta & UDPHS_INTSTA_DET_SUSPD) { 00572 USBD_Suspend(); 00573 #ifdef __RTX 00574 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_DET_SUSPD; 00575 if (USBD_RTX_DevTask) { 00576 isr_evt_set(USBD_EVT_SUSPEND, USBD_RTX_DevTask); 00577 } 00578 #else 00579 if (USBD_P_Suspend_Event) { 00580 USBD_P_Suspend_Event(); 00581 } 00582 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_DET_SUSPD; 00583 #endif 00584 } 00585 00586 /* USB Resume Interrupt */ 00587 if (intsta & UDPHS_INTSTA_WAKE_UP) { 00588 USBD_Resume(); 00589 #ifdef __RTX 00590 UDPHS->UDPHS_CLRINT = UDPHS_INTSTA_WAKE_UP; 00591 if (USBD_RTX_DevTask) { 00592 isr_evt_set(USBD_EVT_RESUME, USBD_RTX_DevTask); 00593 } 00594 #else 00595 if (USBD_P_Resume_Event) { 00596 USBD_P_Resume_Event(); 00597 } 00598 UDPHS->UDPHS_CLRINT = UDPHS_INTSTA_WAKE_UP; 00599 #endif 00600 } 00601 00602 /* USB Remote Wakeup Interrupt */ 00603 if (intsta & UDPHS_INTSTA_UPSTR_RES) { 00604 UDPHS->UDPHS_CLRINT = UDPHS_INTSTA_UPSTR_RES; 00605 } 00606 00607 /* Start of Frame Interrupt */ 00608 if (intsta & UDPHS_INTSTA_INT_SOF) { 00609 if (USBD_HighSpeed == 0) { 00610 #ifdef __RTX 00611 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_INT_SOF; 00612 if (USBD_RTX_DevTask) { 00613 isr_evt_set(USBD_EVT_SOF, USBD_RTX_DevTask); 00614 } 00615 #else 00616 if (USBD_P_SOF_Event) { 00617 USBD_P_SOF_Event(); 00618 } 00619 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_INT_SOF; 00620 #endif 00621 } 00622 else UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_INT_SOF; 00623 } 00624 00625 /* Micro Frame Interrupt */ 00626 if (intsta & UDPHS_INTSTA_MICRO_SOF) { 00627 if (USBD_HighSpeed == 1) { 00628 #ifdef __RTX 00629 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_MICRO_SOF; 00630 if (USBD_RTX_DevTask) { 00631 isr_evt_set(USBD_EVT_SOF, USBD_RTX_DevTask); 00632 } 00633 #else 00634 if (USBD_P_SOF_Event) { 00635 USBD_P_SOF_Event(); 00636 } 00637 UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_MICRO_SOF; 00638 #endif 00639 } 00640 else UDPHS->UDPHS_CLRINT = UDPHS_CLRINT_MICRO_SOF; 00641 } 00642 00643 /* Endpoint Interrupts */ 00644 for (n = 0; n <= USBD_EP_NUM; n++) { 00645 if (intsta & (1 << (n + 8))) { 00646 eptsta = UDPHS->UDPHS_EPT[n].UDPHS_EPTSTA; /* Read EP status */ 00647 00648 /* Data Packet Sent Interrupt */ 00649 if (eptsta & (1 << 10)) { /* Transmitted IN Data Complete Int */ 00650 UDPHS->UDPHS_EPT[n].UDPHS_EPTCLRSTA = (1 << 10); /* Tx IN Clear */ 00651 #ifdef __RTX 00652 if (USBD_RTX_EPTask[n]) { /* IN Packet */ 00653 isr_evt_set(USBD_EVT_IN, USBD_RTX_EPTask[n]); 00654 } 00655 #else 00656 if (USBD_P_EP[n]) { 00657 USBD_P_EP[n](USBD_EVT_IN); 00658 } 00659 #endif 00660 } 00661 00662 /* Data Packet Received Interrupt */ 00663 if (eptsta & (1 << 9)) { /* Received OUT Data Interrupt */ 00664 UDPHS->UDPHS_IEN &= ~(1 << (n + 8)); /* Disable EP int until read*/ 00665 #ifdef __RTX 00666 if (USBD_RTX_EPTask[n]) { /* OUT Packet */ 00667 isr_evt_set(USBD_EVT_OUT, USBD_RTX_EPTask[n]); 00668 } 00669 #else 00670 if (USBD_P_EP[n]) { 00671 USBD_P_EP[n](USBD_EVT_OUT); 00672 } 00673 #endif 00674 } 00675 00676 /* STALL Packet Sent Interrupt */ 00677 if (eptsta & (0x1 << 13)) { /* Stall Sent */ 00678 if ((UDPHS->UDPHS_EPT[n].UDPHS_EPTCFG & UDPHS_EPTCFG_EPT_TYPE_Msk) == UDPHS_EPTCFG_EPT_TYPE_CTRL8) { 00679 #ifdef __RTX 00680 if (USBD_RTX_EPTask[n]) { 00681 isr_evt_set(USBD_EVT_IN_STALL, USBD_RTX_EPTask[n]); 00682 } 00683 #else 00684 if (USBD_P_EP[n]) { 00685 USBD_P_EP[n](USBD_EVT_IN_STALL); 00686 } 00687 #endif 00688 } 00689 UDPHS->UDPHS_EPT[n].UDPHS_EPTCLRSTA = UDPHS_EPTCLRSTA_STALL_SNT; 00690 } 00691 00692 /* Setup Packet Received Interrupt */ 00693 if (eptsta & (0x1 << 12)) { /* Received SETUP Interrupt */ 00694 UDPHS->UDPHS_IEN &= ~(1 << (n + 8)); /* Disable EP int until read*/ 00695 #ifdef __RTX 00696 if (USBD_RTX_EPTask[n]) { /* SETUP Packet */ 00697 isr_evt_set(USBD_EVT_SETUP, USBD_RTX_EPTask[n]); 00698 } 00699 #else 00700 if (USBD_P_EP[n]) { 00701 USBD_P_EP[n](USBD_EVT_SETUP); 00702 } 00703 #endif 00704 } 00705 } 00706 } 00707 }
Generated on Tue Jul 12 2022 15:37:27 by
1.7.2