/* 单根 GPIO 的方向与电平。74HC595 的三根线、五路 PG/FLT、风扇 TACH 都走这里。 */ #ifndef HAL_GPIO_H #define HAL_GPIO_H #include #include "hal_err.h" #ifdef __cplusplus extern "C" { #endif typedef enum { HAL_GPIO_INPUT = 0, HAL_GPIO_INPUT_PULLUP, HAL_GPIO_OUTPUT, } hal_gpio_mode_t; hal_err_t hal_gpio_config(int pin, hal_gpio_mode_t mode); /* 写一个没配成输出的脚返回 HAL_ERR_ARG,不是悄悄成功 —— 「把输入脚当输出用」是 PCA9555 那条禁令(计划 A6)的 GPIO 版本, 在宿主机测试里就要响。 */ hal_err_t hal_gpio_write(int pin, int level); /* level 用出参,是为了把「读到低电平」和「读失败」分开。 */ hal_err_t hal_gpio_read(int pin, int *level); /* 引脚保持(「重启不断电」用,warm_esp.c / rail_cfg.c)。on = 把**此刻的引脚状态**锁住: 之后的配置与写入只改寄存器、不改引脚,**跨软件复位 / 看门狗复位保持**,上电复位才释放。 off = 放开,引脚跟上寄存器现值 —— 所以接管的顺序是「先配成输出、写好电平,再放开」。 ⚠️ 锁着的脚固件写不动:`t_safety` 关不掉。只许在 esp_restart() 的前一刻锁,起来第一件事放开。 */ hal_err_t hal_gpio_hold(int pin, bool on); #ifdef __cplusplus } #endif #endif /* HAL_GPIO_H */