mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-06 19:47:02 +03:00
add writable expander GPIOs
This commit is contained in:
@@ -102,8 +102,8 @@ struct gpio_exp_s *gpio_exp_get_expander(int gpio) {
|
||||
struct gpio_exp_s* gpio_exp_create(const gpio_exp_config_t *config) {
|
||||
struct gpio_exp_s *expander = expanders + n_expanders;
|
||||
|
||||
if (config->base < GPIO_EXP_BASE_MIN || n_expanders == sizeof(expanders)/sizeof(struct gpio_exp_s)) {
|
||||
ESP_LOGE(TAG, "Base %d GPIO must be > %d for %s or too many expanders %d", config->base, GPIO_EXP_BASE_MIN, config->model, n_expanders);
|
||||
if (config->base < GPIO_NUM_MAX || n_expanders == sizeof(expanders)/sizeof(struct gpio_exp_s)) {
|
||||
ESP_LOGE(TAG, "Base %d GPIO must be at least %d for %s or too many expanders %d", config->base, GPIO_NUM_MAX, config->model, n_expanders);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -305,22 +305,22 @@ void gpio_exp_enumerate(gpio_exp_enumerator enumerator, struct gpio_exp_s *expan
|
||||
* Wrapper function
|
||||
*/
|
||||
esp_err_t gpio_set_pull_mode_u(int gpio, gpio_pull_mode_t mode) {
|
||||
if (gpio < GPIO_EXP_BASE_MIN) return gpio_set_pull_mode(gpio, mode);
|
||||
if (gpio < GPIO_NUM_MAX) return gpio_set_pull_mode(gpio, mode);
|
||||
return gpio_exp_set_pull_mode(gpio, mode, NULL);
|
||||
}
|
||||
|
||||
esp_err_t gpio_set_direction_u(int gpio, gpio_mode_t mode) {
|
||||
if (gpio < GPIO_EXP_BASE_MIN) return gpio_set_direction(gpio, mode);
|
||||
if (gpio < GPIO_NUM_MAX) return gpio_set_direction(gpio, mode);
|
||||
return gpio_exp_set_direction(gpio, mode, NULL);
|
||||
}
|
||||
|
||||
int gpio_get_level_u(int gpio) {
|
||||
if (gpio < GPIO_EXP_BASE_MIN) return gpio_get_level(gpio);
|
||||
if (gpio < GPIO_NUM_MAX) return gpio_get_level(gpio);
|
||||
return gpio_exp_get_level(gpio, 50, NULL);
|
||||
}
|
||||
|
||||
esp_err_t gpio_set_level_u(int gpio, int level) {
|
||||
if (gpio < GPIO_EXP_BASE_MIN) return gpio_set_level(gpio, level);
|
||||
if (gpio < GPIO_NUM_MAX) return gpio_set_level(gpio, level);
|
||||
return gpio_exp_set_level(gpio, level, false, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
#define GPIO_EXP_BASE_MIN 100
|
||||
|
||||
struct gpio_exp_s;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/ledc.h"
|
||||
#include "platform_config.h"
|
||||
#include "gpio_exp.h"
|
||||
#include "led.h"
|
||||
#include "globdefs.h"
|
||||
#include "accessors.h"
|
||||
@@ -54,7 +55,7 @@ static int led_max = 2;
|
||||
*
|
||||
*/
|
||||
static void set_level(struct led_s *led, bool on) {
|
||||
if (led->pwm < 0) gpio_set_level(led->gpio, on ? led->onstate : !led->onstate);
|
||||
if (led->pwm < 0 || led->gpio >= GPIO_NUM_MAX) gpio_set_level_u(led->gpio, on ? led->onstate : !led->onstate);
|
||||
else {
|
||||
ledc_set_duty(LEDC_HIGH_SPEED_MODE, led->channel, on ? led->pwm : (led->onstate ? 0 : pwm_system.max));
|
||||
ledc_update_duty(LEDC_HIGH_SPEED_MODE, led->channel);
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "driver/ledc.h"
|
||||
#include "driver/i2c.h"
|
||||
#include "platform_config.h"
|
||||
#include "gpio_exp.h"
|
||||
#include "battery.h"
|
||||
#include "led.h"
|
||||
#include "monitor.h"
|
||||
@@ -44,12 +45,12 @@ void set_power_gpio(int gpio, char *value) {
|
||||
if (!strcasecmp(value, "vcc") ) {
|
||||
gpio_pad_select_gpio(gpio);
|
||||
gpio_set_direction(gpio, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level(gpio, 1);
|
||||
gpio_set_level_u(gpio, 1);
|
||||
} else if (!strcasecmp(value, "gnd")) {
|
||||
gpio_pad_select_gpio(gpio);
|
||||
gpio_set_direction(gpio, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level(gpio, 0);
|
||||
} else parsed = false ;
|
||||
gpio_set_level_u(gpio, 0);
|
||||
} else parsed = false;
|
||||
|
||||
if (parsed) ESP_LOGI(TAG, "set GPIO %u to %s", gpio, value);
|
||||
}
|
||||
@@ -69,7 +70,11 @@ void services_init(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
// set potential power GPIO
|
||||
// create GPIO expander
|
||||
const gpio_exp_config_t * gpio_exp_config = config_gpio_exp_get();
|
||||
if (gpio_exp_config) gpio_exp_create(gpio_exp_config);
|
||||
|
||||
// set potential power GPIO (a GPIO-powered expander might be an issue)
|
||||
parse_set_GPIO(set_power_gpio);
|
||||
|
||||
// shared I2C bus
|
||||
@@ -100,10 +105,6 @@ void services_init(void) {
|
||||
ESP_LOGW(TAG, "no SPI configured");
|
||||
}
|
||||
|
||||
// create GPIO expander
|
||||
const gpio_exp_config_t * gpio_exp_config = config_gpio_exp_get();
|
||||
if (gpio_exp_config) gpio_exp_create(gpio_exp_config);
|
||||
|
||||
// system-wide PWM timer configuration
|
||||
ledc_timer_config_t pwm_timer = {
|
||||
.duty_resolution = LEDC_TIMER_13_BIT,
|
||||
|
||||
@@ -43,6 +43,7 @@ sure that using rate_delay would fix that
|
||||
#include "led.h"
|
||||
#include "monitor.h"
|
||||
#include "platform_config.h"
|
||||
#include "gpio_exp.h"
|
||||
#include "accessors.h"
|
||||
#include "equalizer.h"
|
||||
#include "globdefs.h"
|
||||
@@ -131,10 +132,10 @@ static bool handler(u8_t *data, int len){
|
||||
|
||||
if (jack_mutes_amp && jack_inserted_svc()) {
|
||||
adac->speaker(false);
|
||||
if (amp_control.gpio != -1) gpio_set_level(amp_control.gpio, !amp_control.active);
|
||||
if (amp_control.gpio != -1) gpio_set_level_u(amp_control.gpio, !amp_control.active);
|
||||
} else {
|
||||
adac->speaker(true);
|
||||
if (amp_control.gpio != -1) gpio_set_level(amp_control.gpio, amp_control.active);
|
||||
if (amp_control.gpio != -1) gpio_set_level_u(amp_control.gpio, amp_control.active);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +158,7 @@ static void jack_handler(bool inserted) {
|
||||
if (jack_mutes_amp) {
|
||||
LOG_INFO("switching amplifier %s", inserted ? "OFF" : "ON");
|
||||
adac->speaker(!inserted);
|
||||
if (amp_control.gpio != -1) gpio_set_level(amp_control.gpio, inserted ? !amp_control.active : amp_control.active);
|
||||
if (amp_control.gpio != -1) gpio_set_level_u(amp_control.gpio, inserted ? !amp_control.active : amp_control.active);
|
||||
}
|
||||
|
||||
// activate headset
|
||||
@@ -179,7 +180,7 @@ static void set_amp_gpio(int gpio, char *value) {
|
||||
|
||||
gpio_pad_select_gpio(amp_control.gpio);
|
||||
gpio_set_direction(amp_control.gpio, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level(amp_control.gpio, !amp_control.active);
|
||||
gpio_set_level_u(amp_control.gpio, !amp_control.active);
|
||||
|
||||
LOG_INFO("setting amplifier GPIO %d (active:%d)", amp_control.gpio, amp_control.active);
|
||||
}
|
||||
@@ -455,14 +456,14 @@ static void output_thread_i2s(void *arg) {
|
||||
LOG_INFO("Output state is %d", output.state);
|
||||
if (output.state == OUTPUT_OFF) {
|
||||
led_blink(LED_GREEN, 100, 2500);
|
||||
if (amp_control.gpio != -1) gpio_set_level(amp_control.gpio, !amp_control.active);
|
||||
if (amp_control.gpio != -1) gpio_set_level_u(amp_control.gpio, !amp_control.active);
|
||||
LOG_INFO("switching off amp GPIO %d", amp_control.gpio);
|
||||
} else if (output.state == OUTPUT_STOPPED) {
|
||||
adac->speaker(false);
|
||||
led_blink(LED_GREEN, 200, 1000);
|
||||
} else if (output.state == OUTPUT_RUNNING) {
|
||||
if (!jack_mutes_amp || !jack_inserted_svc()) {
|
||||
if (amp_control.gpio != -1) gpio_set_level(amp_control.gpio, amp_control.active);
|
||||
if (amp_control.gpio != -1) gpio_set_level_u(amp_control.gpio, amp_control.active);
|
||||
adac->speaker(true);
|
||||
}
|
||||
led_on(LED_GREEN);
|
||||
|
||||
Reference in New Issue
Block a user