Files
ESPC3-wireless/app/drivers/pin_io/pin_io.c

117 lines
2.8 KiB
C
Raw Normal View History

2025-08-28 16:03:47 +08:00
#include "pin_io.h"
/* 配置 */
#include "config/board_config.h"
#include "config/app_config.h"
#include "config/app_log.h"
#if defined(CONFIG_CAP_LED_STRIP)
#include "led_strip/config/led_strip_config.h"
#endif
/* SDK */
#include "driver/gpio.h"
/* 通用模块 */
#include "button/button.h"
#include "os/os.h"
#define CONFIG_SYS_LOG_LEVEL SYS_LOG_LEVEL_INF
#define SYS_LOG_DOMAIN "PIN"
#include "sys_log.h"
/**
* @brief IO
*
* @param pin 0..n
*/
void pin_cfg_input(const cfg_board_pin_io_t *pin)
{
if (GPIO_USED(pin->pin) == false)
{
SYS_LOG_WRN("pin %d not used", pin->pin);
return;
}
gpio_config_t io_conf;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = (pin->en_lev == 0 ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE);
io_conf.pull_down_en = (pin->en_lev ? GPIO_PULLDOWN_ENABLE : GPIO_PULLDOWN_DISABLE);
io_conf.pin_bit_mask = 1ULL << pin->pin;
io_conf.intr_type = GPIO_INTR_DISABLE;
gpio_config(&io_conf);
}
/**
* @brief IO
*
* @param pin 0..n
* @retval true
* @retval false
*/
bool pin_get_valid(const cfg_board_pin_io_t *pin)
{
if (GPIO_USED(pin->pin) == false)
{
SYS_LOG_WRN("pin %d not used", pin->pin);
return false;
}
return gpio_get_level(pin->pin) ^ !pin->en_lev;
}
/**
* @brief IO
*
* @param pin 0..n
*/
void pin_cfg_output(const cfg_board_pin_io_t *pin)
{
if (GPIO_USED(pin->pin) == false)
{
SYS_LOG_WRN("pin %d not used", pin->pin);
return;
}
gpio_config_t io_conf;
io_conf.mode = GPIO_MODE_INPUT_OUTPUT;
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
io_conf.pull_down_en = GPIO_PULLDOWN_ENABLE;
io_conf.pin_bit_mask = 1ULL << pin->pin;
io_conf.intr_type = GPIO_INTR_DISABLE;
gpio_config(&io_conf);
}
void gpio_to_high_z(const cfg_board_pin_io_t *pin)
{
gpio_config_t io = {
.pin_bit_mask = 1ULL << pin->pin,
.mode = GPIO_MODE_DISABLE, // 或 GPIO_MODE_INPUT都不会驱动外部
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io);
}
2025-08-28 16:03:47 +08:00
/**
* @brief IO 使
*
* @param pin 0..n
* @param en false: 使 true: 使
*/
void pin_set_valid(const cfg_board_pin_io_t *pin, bool en)
{
if (GPIO_USED(pin->pin) == false)
{
SYS_LOG_WRN("pin %d not used", pin->pin);
return;
}
gpio_set_level((gpio_num_t)pin->pin, !pin->en_lev ^ !!en);
}