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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-21 16:18:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|