diff --git a/driver/gpio_map.c b/driver/gpio_map.c new file mode 100644 index 0000000..655ec9d --- /dev/null +++ b/driver/gpio_map.c @@ -0,0 +1,233 @@ +#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; +} + diff --git a/include/gpio_map.h b/include/gpio_map.h new file mode 100644 index 0000000..d1b6819 --- /dev/null +++ b/include/gpio_map.h @@ -0,0 +1,46 @@ +#ifndef GPIO_MAP_H +#define GPIO_MAP_H + +typedef enum +{ + USER_GPIO_4 = 0, + USER_GPIO_5, + USER_GPIO_12, + USER_GPIO_13, + USER_GPIO_14, + USER_GPIO_15, + USER_GPIO_16, + USER_GPIO_MAX +} USER_GPIO_NAME; + +typedef enum +{ + USER_FUNC_NC = 0, + USER_FUNC_GPIO, + USER_FUNC_MCU_STA, + USER_FUNC_HSPI_MISO, + USER_FUNC_HSPI_MOSI, + USER_FUNC_UART0_CTS, + USER_FUNC_WIFI_STA, + USER_FUNC_HSPI_CLK, + USER_FUNC_MTDO, + USER_FUNC_HSPI_CS, + USER_FUNC_UART0_RTS, + USER_FUNC_WAKEUP, +} USER_GPIO_FUNC; +#if 0 +typedef struct +{ + USER_GPIO_NAME name; + USER_GPIO_FUNC func; + GPIO_Pullup_IF pullUp; + GPIOMode_TypeDef dir; + GPIO_INT_TYPE intr; +} USER_GPIO_INFO, *PUSER_GPIO_INFO; +#endif + +int gpio_user_cfg(void); +int gpio_set_level(USER_GPIO_NAME gpio, int level); +int gpio_get_level(USER_GPIO_NAME gpio); +int pin_cfg_gpio(USER_GPIO_NAME pin, int func, int mode, int pullUp, int intr); +#endif