#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "cfg.h" #include "log.h" #include "user_main.h" #include "gpio.h" #include "freertos/timers.h" #include "gpio_map.h" #define GPIO_Pin_16 (BIT(16)) /* Pin 16 selected */ static const int g_GpioTbl[USER_GPIO_MAX][2] = { {GPIO_Pin_4, 4}, {GPIO_Pin_5, 5}, {GPIO_Pin_12, 12}, {GPIO_Pin_13, 13}, {GPIO_Pin_14, 14}, {GPIO_Pin_15, 15}, {GPIO_Pin_16, 16}, }; static GPIO_ITEM g_GpioCfg[USER_GPIO_MAX] = {0}; void gpio_cfg_dump(GPIO_ConfigTypeDef* pCfg) { //IHW_LOG_BUF(LOG_Debug, "GPIO", (unsigned char*)pCfg, sizeof(GPIO_ConfigTypeDef)); LOG_EX(LOG_Debug, "Gpio Cofingure:\n"); LOG_RAW(LOG_Debug, "\tPin: %d\n", pCfg->GPIO_Pin); LOG_RAW(LOG_Debug, "\tMode: %d\n", pCfg->GPIO_Mode); LOG_RAW(LOG_Debug, "\tPullUp: %d\n", pCfg->GPIO_Pullup); LOG_RAW(LOG_Debug, "\tIntr: %d\n", pCfg->GPIO_IntrType); } static void __hal_gpio_config(int pin, int mode, int pullUp, int intr) { GPIO_ConfigTypeDef gpioCfg; memset(&gpioCfg, 0, sizeof(GPIO_ConfigTypeDef)); if(pin == GPIO_Pin_16) { if(mode == GPIO_Mode_Input) { //g_GpioCfg[pItem->Id].Dir = GPIO_Mode_Input; gpio16_input_conf(); } else { //g_GpioCfg[pItem->Id].Dir = GPIO_Mode_Output; gpio16_output_conf(); } } else { gpioCfg.GPIO_IntrType = intr; gpioCfg.GPIO_Mode = mode; gpioCfg.GPIO_Pin = pin; gpioCfg.GPIO_Pullup = pullUp ? 1 : 0; //g_GpioCfg[pItem->Id].Interrupt = pItem->Interrupt; //g_GpioCfg[pItem->Id].PullUp = pItem->PullUp; gpio_config(&gpioCfg); // gpio_cfg_dump(&gpioCfg); } } static uint8 __hal_gpio_output(int pin, int level) { int val = level ? 1 : 0; if(pin == 16) { gpio16_output_set(val); } else { GPIO_OUTPUT_SET(GPIO_ID_PIN(pin), val); } } static uint8 __hal_gpio_get(int pin) { int val; if(pin == 16) { val = gpio16_input_get(); } else { val = GPIO_INPUT_GET(GPIO_ID_PIN(pin)) ? 1 : 0; } return val; } int gpio_set_level(USER_GPIO_NAME gpio, int level) { int val = level ? 1 : 0; if(gpio < 0 || gpio >= USER_GPIO_MAX) { LOG_EX(LOG_Error, "GPIO %d unused\n", gpio); return -ERR_INPUT_PARAMS; } if(g_GpioCfg[gpio].Func != 1) { LOG_EX(LOG_Error, "PIN %d don't configure to GPIO\n", gpio); return -ERR_GPIO_NOT_CONFIG; } if(g_GpioCfg[gpio].Dir != GPIO_Mode_Output || g_GpioCfg[gpio].Dir != GPIO_Mode_Out_OD) { LOG_EX(LOG_Error, "GPIO %d don't configure to output mode\n", gpio); return -ERR_GPIO_MODE_UNSUPPORT; } LOG_EX(LOG_Debug, "GPIO %d Output %d\n", gpio, val); __hal_gpio_output(g_GpioTbl[gpio][1], level); return ERR_OK; } int gpio_get_level(USER_GPIO_NAME gpio) { uint8 val; if(gpio < 0 || gpio >= USER_GPIO_MAX) { LOG_EX(LOG_Error, "GPIO %d unused\n", gpio); return -ERR_INPUT_PARAMS; } if(g_GpioCfg[gpio].Func != 1) { LOG_EX(LOG_Error, "PIN %d don't configure to GPIO\n", gpio); return -ERR_GPIO_NOT_CONFIG; } if(g_GpioCfg[gpio].Dir != GPIO_Mode_Input) { LOG_EX(LOG_Error, "GPIO %d don't configure to input mode\n", gpio); return -ERR_GPIO_MODE_UNSUPPORT; } val = __hal_gpio_get(g_GpioTbl[gpio][1]); LOG_EX(LOG_Debug, "GPIO %d input %d\n", gpio, val); return val; } int pin_cfg_gpio(USER_GPIO_NAME pin, int func, int mode, int pullUp, int intr) { if(pin < 0 || pin >= USER_GPIO_MAX) { LOG_EX(LOG_Error, "GPIO %d unused\n", pin); return -ERR_GPIO_NOT_SUPPORT; } if(func != 1) { LOG_EX(LOG_Error, "GPIO %d mux %d unsupport\n", pin, func); return -ERR_GPIO_MUX_UNSUPPORT; } if(mode < 0 || mode > GPIO_Mode_Output) { LOG_EX(LOG_Error, "GPIO %d mode %d unsupport\n", pin, mode); return -ERR_GPIO_MODE_UNSUPPORT; } if(intr < GPIO_PIN_INTR_DISABLE || intr > GPIO_PIN_INTR_HILEVEL) { LOG_EX(LOG_Error, "GPIO %d interrupt mode %d unsupport\n", pin, intr); return -ERR_GPIO_INTR_UNSUPPORT; } __hal_gpio_config(g_GpioTbl[pin][0], mode, pullUp, intr); return ERR_OK; } int gpio_user_cfg(void) { int i = 0; PUSER_CONFIG pCfg = ne_cfg_get_user_cfg(); for(i = 0; (i < pCfg->GPIO.iSize) && (pCfg->GPIO.pGpioCfg); i++) { PGPIO_ITEM pItem = &pCfg->GPIO.pGpioCfg[i]; if(pItem->Id < 0 || pItem->Id >= USER_GPIO_MAX) { LOG_EX(LOG_Error, "GPIO %d unused\n", pItem->Id); continue; } g_GpioCfg[pItem->Id].Id = pItem->Id; g_GpioCfg[pItem->Id].Func = pItem->Func; if(pItem->Func != 1) { LOG_EX(LOG_Warn, "PIN(%d) Work Mode is Not GPIO\n", pItem->Id); continue; } if(pItem->Id == USER_GPIO_16) { if(pItem->Dir == GPIO_Mode_Input) { g_GpioCfg[pItem->Id].Dir = GPIO_Mode_Input; } else { g_GpioCfg[pItem->Id].Dir = GPIO_Mode_Output; } } else { g_GpioCfg[pItem->Id].Interrupt = pItem->Interrupt; g_GpioCfg[pItem->Id].PullUp = pItem->PullUp; } __hal_gpio_config(g_GpioTbl[pItem->Id][0], pItem->Dir, pItem->PullUp, pItem->Interrupt); } return ERR_OK; }