esp8266-std/driver/gpio_map.c

234 lines
4.8 KiB
C
Raw Permalink Normal View History

2019-01-22 07:39:15 +00:00
#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;
}