00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #include "board.h"
00084
00085 #include "USBD.h"
00086 #include "CDCDEEMDriver.h"
00087
00088 #include <stdbool.h>
00089 #include <stdint.h>
00090 #include <string.h>
00091
00092
00093
00094
00095
00096
00097 #define MAXPACKETSIZE 1536
00098 #if defined ( __CC_ARM ) && defined ( sram )
00099 #define ETH_TX_BUFFERS 32
00100 #define ETH_RX_BUFFERS 32
00101 #else
00102 #define ETH_TX_BUFFERS 64
00103 #define ETH_RX_BUFFERS 64
00104 #endif
00105
00106 #define ETH_BUFF_SIZE 1536
00107
00108 #define DUMMY_BUFFERS 2
00109 #define DUMMY_BUFF_SIZE 128
00110
00111
00112
00113
00114
00115 extern const USBDDriverDescriptors cdcdEEMDriverDescriptors;
00116
00117
00118
00119
00120
00121 static uint8_t gUsbConnected = 0;
00122
00123
00124 static uint8_t gUsbRxBuffer[MAXPACKETSIZE];
00125
00126
00127 static const Pin gmacPins[] = { BOARD_GMAC_RUN_PINS };
00128 static const Pin gmacResetPins[] = { BOARD_GMAC_RESET_PIN };
00129
00130
00131 static uint8_t gMacAddress[6] = { 0x3a, 0x1f, 0x34, 0x08, 0x54, 0x54 };
00132
00133
00134 static sGmacd gGmacd;
00135
00136
00137 static GMacb gGmacb;
00138
00139
00140 COMPILER_SECTION(".ram_nocache")
00141 COMPILER_ALIGNED(8)
00142 static sGmacTxDescriptor gTxDs[ETH_TX_BUFFERS], gDummyTxDs[DUMMY_BUFFERS];
00143
00144
00145 COMPILER_ALIGNED(8) static fGmacdTransferCallback gTxCbs[ETH_TX_BUFFERS], gDummyTxCbs[DUMMY_BUFFERS];
00146
00147
00148 COMPILER_SECTION(".ram_nocache")
00149 COMPILER_ALIGNED(8)
00150 static sGmacRxDescriptor gRxDs[ETH_RX_BUFFERS], gDummyRxDs[DUMMY_BUFFERS];
00151
00152
00153
00154
00155
00156 COMPILER_ALIGNED(8)
00157 static uint8_t gTxBuffer[ETH_TX_BUFFERS * ETH_BUFF_SIZE], gTxDummyBuffer[DUMMY_BUFFERS * DUMMY_BUFF_SIZE];
00158
00159
00160 COMPILER_ALIGNED(8)
00161 static uint8_t gRxBuffer[ETH_RX_BUFFERS * ETH_BUFF_SIZE], gRxDummyBuffer[DUMMY_BUFFERS * DUMMY_BUFF_SIZE];
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 void GMAC_Handler(void)
00176 {
00177 GMACD_Handler(&gGmacd, GMAC_QUE_0);
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
00189 {
00190 CDCDEEMDriver_ConfigurationChangedHandler(cfgnum);
00191 }
00192
00193
00194
00195
00196
00197
00198 void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
00199 {
00200 CDCDEEMDriver_RequestHandler(request);
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210 static void _ConfigureUotghs(void)
00211 {
00212
00213
00214 PMC->PMC_SCDR = PMC_SCDR_USBCLK;
00215
00216 PMC->PMC_USB = PMC_USB_USBS;
00217
00218 PMC_EnablePeripheral(ID_USBHS);
00219 USBHS->USBHS_CTRL = USBHS_CTRL_UIMOD_DEVICE;
00220
00221 PMC->CKGR_UCKR = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0xF);
00222
00223 while( !(PMC->PMC_SR & PMC_SR_LOCKU) );
00224 }
00225
00226
00227
00228
00229 static void _UsbDataReceived(void *unused,
00230 uint8_t status,
00231 uint32_t received,
00232 uint32_t remaining)
00233 {
00234
00235 (void)unused;
00236 (void)remaining;
00237
00238
00239 if (status == USBD_STATUS_SUCCESS)
00240 {
00241 TRACE_INFO("%u USB_RECV(%u)\n\r",
00242 (unsigned int)GetTicks(), (unsigned int)received);
00243
00244
00245 if (GMACD_Send(&gGmacd, gUsbRxBuffer, received, NULL, GMAC_QUE_0)
00246 != GMACD_OK) {
00247 TRACE_WARNING("_UsbDataReceived: GMAC send overflow\n\r");
00248 }
00249 } else {
00250 TRACE_WARNING("_UsbDataReceived: Transfer error\n\r");
00251 }
00252
00253
00254 CDCDEEMDriver_Read(gUsbRxBuffer, MAXPACKETSIZE, _UsbDataReceived, 0);
00255 }
00256
00257
00258
00259
00260 static void _EthDataReceived(uint32_t status)
00261 {
00262 uint8_t buffer[MAXPACKETSIZE];
00263 uint32_t frmSize;
00264
00265
00266 (void)status;
00267
00268 TRACE_INFO("%u ETH_RXCB(%u)\n\r", (unsigned int)GetTicks(), (unsigned int)status);
00269
00270
00271 while (
00272 GMACD_OK == GMACD_Poll(&gGmacd, buffer, sizeof(buffer), &frmSize, GMAC_QUE_0)) {
00273 TRACE_INFO("%u ETH_RECV(%u)\n\r", (unsigned int)GetTicks(), (unsigned int)frmSize);
00274
00275
00276 if (CDCDEEMDriver_Write(buffer, frmSize, NULL, 0) != USBD_STATUS_SUCCESS) {
00277 TRACE_WARNING("_EthDataReceived: USB send overflow\n\r");
00278 }
00279 }
00280
00281
00282 GMACD_SetRxCallback(&gGmacd, _EthDataReceived, GMAC_QUE_0);
00283 }
00284
00285
00286
00287
00288
00289 int main(void)
00290 {
00291 sGmacInit Queue0, Queue12;
00292
00293
00294 WDT_Disable( WDT ) ;
00295
00296 SCB_EnableICache();
00297 SCB_EnableDCache();
00298
00299
00300 printf("-- USB Device CDC EEM Project %s --\n\r", SOFTPACK_VERSION);
00301 printf("-- %s\n\r", BOARD_NAME);
00302 printf( "-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ , COMPILER_NAME) ;
00303
00304
00305 _ConfigureUotghs();
00306
00307
00308 TimeTick_Configure();
00309
00310
00311 memset(&Queue0, 0, sizeof(Queue0));
00312 Queue0.bIsGem = 1;
00313 Queue0.bDmaBurstLength = 4;
00314 Queue0.pRxBuffer = gRxBuffer;
00315 Queue0.pRxD = gRxDs;
00316 Queue0.wRxBufferSize = ETH_BUFF_SIZE;
00317 Queue0.wRxSize = ETH_RX_BUFFERS;
00318 Queue0.pTxBuffer = gTxBuffer;
00319 Queue0.pTxD = gTxDs;
00320 Queue0.wTxBufferSize = ETH_BUFF_SIZE;
00321 Queue0.wTxSize = ETH_TX_BUFFERS;
00322 Queue0.pTxCb = gTxCbs;
00323
00324
00325 memset(&Queue12, 0, sizeof(Queue12));
00326 Queue12.bIsGem = 1;
00327 Queue12.bDmaBurstLength = 4;
00328 Queue12.pRxBuffer = gRxDummyBuffer;
00329 Queue12.pRxD = gDummyRxDs;
00330 Queue12.wRxBufferSize = DUMMY_BUFF_SIZE;
00331 Queue12.wRxSize = DUMMY_BUFFERS;
00332 Queue12.pTxBuffer = gTxDummyBuffer;
00333 Queue12.pTxD = gDummyTxDs;
00334 Queue12.wTxBufferSize = DUMMY_BUFF_SIZE;
00335 Queue12.wTxSize = DUMMY_BUFFERS;
00336 Queue12.pTxCb = gDummyTxCbs;
00337
00338
00339 GMACD_Init(&gGmacd, GMAC, ID_GMAC, 1, 0);
00340 GMACD_InitTransfer(&gGmacd, &Queue12, GMAC_QUE_2);
00341 GMACD_InitTransfer(&gGmacd, &Queue12, GMAC_QUE_1);
00342 GMACD_InitTransfer(&gGmacd, &Queue0, GMAC_QUE_0);
00343 GMAC_SetAddress(gGmacd.pHw, 0, gMacAddress);
00344
00345
00346 NVIC_ClearPendingIRQ(GMAC_IRQn);
00347 NVIC_EnableIRQ(GMAC_IRQn);
00348 NVIC_ClearPendingIRQ(USBHS_IRQn);
00349 NVIC_EnableIRQ(USBHS_IRQn);
00350
00351
00352 GMACB_Init(&gGmacb, &gGmacd, BOARD_GMAC_PHY_ADDR);
00353 GMACB_ResetPhy(&gGmacb);
00354 if (!GMACB_InitPhy(
00355 &gGmacb, BOARD_MCK, gmacResetPins, 1, gmacPins, PIO_LISTSIZE(gmacPins))) {
00356 TRACE_ERROR("PHY Initialize ERROR!\n\r");
00357 return 0;
00358 }
00359 if (!GMACB_AutoNegotiate(&gGmacb)) {
00360 TRACE_ERROR("Auto Negotiate ERROR!\n\r");
00361 return 0;
00362 }
00363
00364
00365 CDCDEEMDriver_Initialize(&cdcdEEMDriverDescriptors);
00366
00367
00368 USBD_Connect();
00369
00370
00371 while (1)
00372 {
00373
00374 if (USBD_GetState() < USBD_STATE_CONFIGURED) {
00375 gUsbConnected = 0;
00376 } else if (!gUsbConnected) {
00377 gUsbConnected = 1;
00378
00379
00380 CDCDEEMDriver_Read(gUsbRxBuffer, MAXPACKETSIZE, _UsbDataReceived, 0);
00381
00382
00383 GMACD_SetRxCallback(&gGmacd, _EthDataReceived, GMAC_QUE_0);
00384 }
00385 }
00386 }