void CyFxGpifAppInit ( void) { CyU3PReturnStatus_t status; CyU3PGpioClock_t gpioClock; CyU3PPibClock_t pibClock; /* GPIO module needs to be initialized before SIB is initialized. This is required because GPIOs are used in the SIB code. */ gpioClock.fastClkDiv = 2; gpioClock.slowClkDiv = 16; gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2; gpioClock.clkSrc = CY_U3P_SYS_CLK; gpioClock.halfDiv = 0; status = CyU3PGpioInit (&gpioClock, NULL); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "GPIO Init failed, code=%d\r\n", status); CyFxGpifAppErrorHandler (status); } /* Initialize PIB and load the GPIF waveform. */ pibClock.clkDiv = 2; pibClock.clkSrc = CY_U3P_SYS_CLK; pibClock.isHalfDiv = CyFalse; pibClock.isDllEnable = CyFalse; status = CyU3PPibInit (CyTrue, &pibClock); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "Error: PIB Init failed with code %d\r\n", status); CyFxGpifAppErrorHandler (status); } status = CyU3PGpifLoad (&Async_Admux_CyFxGpifConfig); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint (2, "Error: GPIF load failed with code %d\r\n", status); CyFxGpifAppErrorHandler (status); } /* Register a callback that will receive notifications of incoming requests. */ CyU3PMboxInit (CyFxAppMboxCallback); }
/* This function starts the RF data transport mechanism. This is the second * interface of the first and only descriptor. */ static void NuandRFLinkStart(void) { uint16_t size = 0; CyU3PEpConfig_t epCfg; CyU3PDmaChannelConfig_t dmaCfg; CyU3PDmaMultiChannelConfig_t dmaMultiConfig; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; CyU3PUSBSpeed_t usbSpeed = CyU3PUsbGetSpeed(); NuandAllowSuspend(CyFalse); NuandGPIOReconfigure(CyTrue, CyTrue); /* Restart the PIB block, due to a bug where 16-bit to 32-bit GPIF transitions mess up the first DMA transaction. Restarting the PIB wipes all of the GPIF configurations */ CyU3PPibClock_t pibClock; apiRetStatus = CyU3PPibDeInit(); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "P-Port DeInitialization failed, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Initialize the P-Port here */ pibClock.clkDiv = 4; pibClock.clkSrc = CY_U3P_SYS_CLK; pibClock.isHalfDiv = CyFalse; /* Enable DLL for async GPIF */ pibClock.isDllEnable = CyFalse; apiRetStatus = CyU3PPibInit(CyTrue, &pibClock); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "P-Port Initialization failed, Error Code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } CyU3PGpioSetValue(GPIO_SYS_RST, CyTrue); CyU3PGpioSetValue(GPIO_RX_EN, CyFalse); CyU3PGpioSetValue(GPIO_TX_EN, CyFalse); CyU3PGpioSetValue(GPIO_SYS_RST, CyFalse); /* Load the GPIF configuration for loading the RF transceiver */ apiRetStatus = CyU3PGpifLoad(&Rflink_CyFxGpifConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "CyU3PGpifLoad failed, Error Code = %d\n",apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Start the state machine. */ apiRetStatus = CyU3PGpifSMStart(RFLINK_START, RFLINK_ALPHA_START); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PGpifSMStart failed, Error Code = %d\n",apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Determine max packet size based on USB speed */ switch (usbSpeed) { case CY_U3P_FULL_SPEED: size = 64; break; case CY_U3P_HIGH_SPEED: size = 512; break; case CY_U3P_SUPER_SPEED: size = 1024; break; default: CyU3PDebugPrint (4, "Error! Invalid USB speed.\n"); CyFxAppErrorHandler (CY_U3P_ERROR_FAILURE); break; } CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg)); epCfg.enable = CyTrue; epCfg.epType = CY_U3P_USB_EP_BULK; epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED ? 15 : 1); epCfg.streams = 0; epCfg.pcktSize = size; /* Producer endpoint configuration */ apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_PRODUCER, &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } /* Consumer endpoint configuration */ apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_CONSUMER, &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler (apiRetStatus); } // multi variant dmaMultiConfig.size = size * 2; dmaMultiConfig.count = 22; dmaMultiConfig.validSckCount = 2; dmaMultiConfig.prodSckId[0] = BLADE_RF_SAMPLE_EP_PRODUCER_USB_SOCKET; dmaMultiConfig.consSckId[0] = CY_U3P_PIB_SOCKET_2; dmaMultiConfig.consSckId[1] = CY_U3P_PIB_SOCKET_3; dmaMultiConfig.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaMultiConfig.notification = 0; dmaMultiConfig.cb = 0; dmaMultiConfig.prodHeader = 0; dmaMultiConfig.prodFooter = 0; dmaMultiConfig.consHeader = 0; dmaMultiConfig.prodAvailCount = 0; // non multi variant CyU3PMemSet((uint8_t *)&dmaCfg, 0, sizeof(dmaCfg)); dmaCfg.size = size * 2; dmaCfg.count = 22; dmaCfg.prodSckId = BLADE_RF_SAMPLE_EP_PRODUCER_USB_SOCKET; dmaCfg.consSckId = CY_U3P_PIB_SOCKET_3; dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaCfg.notification = 0; dmaCfg.cb = 0; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0; apiRetStatus = CyU3PDmaChannelCreate(&glChHandleUtoP, CY_U3P_DMA_TYPE_AUTO, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaMultiChannelCreate failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } dmaCfg.prodSckId = CY_U3P_PIB_SOCKET_0; dmaCfg.consSckId = BLADE_RF_SAMPLE_EP_CONSUMER_USB_SOCKET; apiRetStatus = CyU3PDmaChannelCreate(&glChHandlePtoU, CY_U3P_DMA_TYPE_AUTO, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaMultiChannelCreate failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Flush the Endpoint memory */ CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_PRODUCER); CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_CONSUMER); /* Set DMA channel transfer size. */ apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleUtoP, BLADE_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandlePtoU, BLADE_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } UartBridgeStart(); glAppMode = MODE_RF_CONFIG; }