/* This function initializes the USB module. */ CyU3PReturnStatus_t CyFxApplnInit (void) { CyU3POtgConfig_t otgCfg; CyU3PGpioClock_t clkCfg; CyU3PGpioSimpleConfig_t simpleCfg; CyU3PReturnStatus_t status; /* Initialize GPIO module. */ clkCfg.fastClkDiv = 2; clkCfg.slowClkDiv = 0; clkCfg.halfDiv = CyFalse; clkCfg.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2; clkCfg.clkSrc = CY_U3P_SYS_CLK; status = CyU3PGpioInit (&clkCfg, NULL); if (status != CY_U3P_SUCCESS) { return status; } /* Override GPIO 21 for VBUS control. */ status = CyU3PDeviceGpioOverride (21, CyTrue); if (status != CY_U3P_SUCCESS) { return status; } /* Configure GPIO 21 as output for VBUS control. */ simpleCfg.outValue = CY_FX_HOST_VBUS_DISABLE_VALUE; simpleCfg.driveLowEn = CyTrue; simpleCfg.driveHighEn = CyTrue; simpleCfg.inputEn = CyFalse; simpleCfg.intrMode = CY_U3P_GPIO_NO_INTR; status = CyU3PGpioSetSimpleConfig (21, &simpleCfg); if (status != CY_U3P_SUCCESS) { return status; } /* Wait until VBUS is stabilized. */ CyU3PThreadSleep (100); /* Initialize the OTG module. */ otgCfg.otgMode = CY_U3P_OTG_MODE_OTG; otgCfg.chargerMode = CY_U3P_OTG_CHARGER_DETECT_ACA_MODE; otgCfg.cb = CyFxOtgEventCb; status = CyU3POtgStart (&otgCfg); if (status != CY_U3P_SUCCESS) { return status; } /* Since VBATT or VBUS is required for OTG operation enable it. */ status = CyU3PUsbVBattEnable (CyTrue); return status; }
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); }
/* GPIO application initialization function. */ void CyFxGpioInit (void) { CyU3PGpioClock_t gpioClock; CyU3PGpioComplexConfig_t gpioConfig; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; /* Init the GPIO module. The GPIO block will be running * with a fast clock at SYS_CLK / 2 and slow clock is not * used. For the DVK, the SYS_CLK is running at 403 MHz.*/ gpioClock.fastClkDiv = 2; gpioClock.slowClkDiv = 0; gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2; gpioClock.clkSrc = CY_U3P_SYS_CLK; gpioClock.halfDiv = 0; apiRetStatus = CyU3PGpioInit(&gpioClock, NULL); if (apiRetStatus != 0) { /* Error Handling */ CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Configure GPIO 50 as PWM output */ gpioConfig.outValue = CyFalse; gpioConfig.inputEn = CyFalse; gpioConfig.driveLowEn = CyTrue; gpioConfig.driveHighEn = CyTrue; gpioConfig.pinMode = CY_U3P_GPIO_MODE_PWM; gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; gpioConfig.timerMode = CY_U3P_GPIO_TIMER_HIGH_FREQ; gpioConfig.timer = 0; gpioConfig.period = CY_FX_PWM_PERIOD; gpioConfig.threshold = CY_FX_PWM_25P_THRESHOLD; apiRetStatus = CyU3PGpioSetComplexConfig(50, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "CyU3PGpioSetComplexConfig failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Configure GPIO 51 as input for single time low measurement. */ gpioConfig.outValue = CyTrue; gpioConfig.inputEn = CyTrue; gpioConfig.driveLowEn = CyFalse; gpioConfig.driveHighEn = CyFalse; /* For doing one time measurements, this value should be * set to static. For doing contiunous measurement, this * value should be set to the required mode. */ gpioConfig.pinMode = CY_U3P_GPIO_MODE_STATIC; gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; gpioConfig.timerMode = CY_U3P_GPIO_TIMER_HIGH_FREQ; gpioConfig.timer = 0; /* Load the period to the maximum value * so that the count is not reset. */ gpioConfig.period = 0xFFFFFFFF; gpioConfig.threshold = 0; apiRetStatus = CyU3PGpioSetComplexConfig(51, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "CyU3PGpioSetComplexConfig failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Enable a weak pullup on GPIO 52. */ apiRetStatus = CyU3PGpioSetIoMode (52, CY_U3P_GPIO_IO_MODE_WPU); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "CyU3PGpioSetIoMode failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Configure GPIO 52 as input for counter mode. */ gpioConfig.outValue = CyTrue; gpioConfig.inputEn = CyTrue; gpioConfig.driveLowEn = CyFalse; gpioConfig.driveHighEn = CyFalse; gpioConfig.pinMode = CY_U3P_GPIO_MODE_STATIC; gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; gpioConfig.timerMode = CY_U3P_GPIO_TIMER_NEG_EDGE; gpioConfig.timer = 0; /* Load the period to the maximum value * so that the count is not reset. */ gpioConfig.period = 0xFFFFFFFF; gpioConfig.threshold = 0; apiRetStatus = CyU3PGpioSetComplexConfig(52, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint (4, "CyU3PGpioSetComplexConfig failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } }
void CyFxGpioInit (void) { CyU3PGpioClock_t gpioClock; CyU3PGpioSimpleConfig_t gpioConfig; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; /* Init the GPIO module */ gpioClock.fastClkDiv = 2; gpioClock.slowClkDiv = 0; gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2; gpioClock.clkSrc = CY_U3P_SYS_CLK; gpioClock.halfDiv = 0; apiRetStatus = CyU3PGpioInit(&gpioClock, CyFxGpioIntrCb); if (apiRetStatus != 0) { /* Error Handling */ CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Configure GPIO 45 as input with interrupt enabled for both edges */ gpioConfig.outValue = CyTrue; gpioConfig.inputEn = CyTrue; gpioConfig.driveLowEn = CyFalse; gpioConfig.driveHighEn = CyFalse; gpioConfig.intrMode = CY_U3P_GPIO_INTR_BOTH_EDGE; apiRetStatus = CyU3PGpioSetSimpleConfig(45, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Override GPIO 21 as this pin is associated with GPIF Control signal. * The IO cannot be selected as GPIO by CyU3PDeviceConfigureIOMatrix call * as it is part of the GPIF IOs. Override API call must be made with * caution as this will change the functionality of the pin. If the IO * line is used as part of GPIF and is connected to some external device, * then the line will no longer behave as a GPIF IO.. Here CTL4 line is * not used and so it is safe to override. */ apiRetStatus = CyU3PDeviceGpioOverride (21, CyTrue); if (apiRetStatus != 0) { /* Error Handling */ CyU3PDebugPrint (4, "CyU3PDeviceGpioOverride failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } /* Configure GPIO 21 as output */ gpioConfig.outValue = CyFalse; gpioConfig.driveLowEn = CyTrue; gpioConfig.driveHighEn = CyTrue; gpioConfig.inputEn = CyFalse; gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR; apiRetStatus = CyU3PGpioSetSimpleConfig(21, &gpioConfig); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n", apiRetStatus); CyFxAppErrorHandler(apiRetStatus); } }