diff --git a/components/esp8266/CMakeLists.txt b/components/esp8266/CMakeLists.txt index 887f9b6e6..32bef0a54 100644 --- a/components/esp8266/CMakeLists.txt +++ b/components/esp8266/CMakeLists.txt @@ -46,6 +46,7 @@ else() "driver/i2c.c" "driver/i2s.c" "driver/pwm.c" + "driver/sigma_delta.c" "driver/spi.c" "driver/hspi_logic_layer.c" "driver/uart.c" diff --git a/components/esp8266/driver/sigma_delta.c b/components/esp8266/driver/sigma_delta.c new file mode 100644 index 000000000..d0ba4bded --- /dev/null +++ b/components/esp8266/driver/sigma_delta.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2023 + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include +#include + +#include +#include +#include +#include + +#include +#include "driver/sigma_delta.h" + +static const char *TAG = "sigma-delta"; + +#define SIGMA_DELTA_CHECK(a, str, ret_val) \ + if (!(a)) { \ + ESP_LOGE(TAG,"%s(%d): %s", __FUNCTION__, __LINE__, str); \ + return (ret_val); \ + } + +#define GPIO_SIGMA_DELTA_TARGET_MASK (SIGMA_DELTA_TARGET << SIGMA_DELTA_TARGET_S) +#define GPIO_SIGMA_DELTA_TARGET_GET(x) (((x) & GPIO_SIGMA_DELTA_TARGET_MASK) >> SIGMA_DELTA_TARGET_S) +#define GPIO_SIGMA_DELTA_TARGET_SET(x) (((x) << SIGMA_DELTA_TARGET_S) & GPIO_SIGMA_DELTA_TARGET_MASK) + +#define GPIO_SIGMA_DELTA_PRESCALE_MASK (SIGMA_DELTA_PRESCALAR << SIGMA_DELTA_PRESCALAR_S) +#define GPIO_SIGMA_DELTA_PRESCALE_GET(x) (((x) & GPIO_SIGMA_DELTA_PRESCALE_MASK) >> SIGMA_DELTA_PRESCALAR_S) +#define GPIO_SIGMA_DELTA_PRESCALE_SET(x) (((x) << SIGMA_DELTA_PRESCALAR_S) & GPIO_SIGMA_DELTA_PRESCALE_MASK) + +#define GPIO_AS_PIN_SOURCE 0 +#define SIGMA_AS_PIN_SOURCE 1 + +esp_err_t sigma_delta_init(uint8_t prescaler,uint8_t target) +{ + GPIO.sigma_delta = SIGMA_DELTA_ENABLE | + GPIO_SIGMA_DELTA_TARGET_SET(target) | + GPIO_SIGMA_DELTA_PRESCALE_SET(prescaler); + + ESP_LOGI(TAG,"enabled with prescale=%d and target=%d", prescaler, target); + return ESP_OK; +} + +esp_err_t sigma_delta_set_prescale(uint8_t prescale) +{ + GPIO.sigma_delta = (GPIO.sigma_delta & (~GPIO_SIGMA_DELTA_PRESCALE_MASK)) | + GPIO_SIGMA_DELTA_PRESCALE_SET(prescale); + return ESP_OK; +} + +esp_err_t sigma_delta_get_prescale(uint8_t *prescale) +{ + SIGMA_DELTA_CHECK(prescale, "prescale is null", ESP_ERR_INVALID_ARG); + *prescale = GPIO_SIGMA_DELTA_PRESCALE_GET(GPIO.sigma_delta); + return ESP_OK; +} + +esp_err_t sigma_delta_set_target(uint8_t target) +{ + GPIO.sigma_delta = (GPIO.sigma_delta & (~GPIO_SIGMA_DELTA_TARGET_MASK)) | + GPIO_SIGMA_DELTA_TARGET_SET(target); + return ESP_OK; +} + +esp_err_t sigma_delta_get_target(uint8_t *target) +{ + SIGMA_DELTA_CHECK(target, "target is null", ESP_ERR_INVALID_ARG); + *target = GPIO_SIGMA_DELTA_TARGET_GET(GPIO.sigma_delta); + return ESP_OK; +} + +esp_err_t sigma_delta_deinit(void) +{ + GPIO.sigma_delta = 0x00; + + ESP_LOGI(TAG,"disabled"); + return ESP_OK; +} + +esp_err_t sigma_delta_set_output(gpio_num_t gpio_num) +{ + GPIO.pin[gpio_num].source = SIGMA_AS_PIN_SOURCE; + return ESP_OK; +} + +esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num) +{ + GPIO.pin[gpio_num].source = GPIO_AS_PIN_SOURCE; + return ESP_OK; +} diff --git a/components/esp8266/include/driver/sigma_delta.h b/components/esp8266/include/driver/sigma_delta.h new file mode 100644 index 000000000..e52b857ed --- /dev/null +++ b/components/esp8266/include/driver/sigma_delta.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2023 + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Setup sigma-delta signal generator + * The target frequency is defined as: + * - for 0 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy