From 0f7b125fd0f1237d3ebd3f4ebb9399bcaf12874d Mon Sep 17 00:00:00 2001 From: kuba Date: Sun, 15 Jan 2023 15:07:50 +0100 Subject: [PATCH 1/2] added sigma-delta driver --- components/esp8266/CMakeLists.txt | 1 + components/esp8266/driver/sigma_delta.c | 107 ++++++++++++++++++ .../esp8266/include/driver/sigma_delta.h | 97 ++++++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 components/esp8266/driver/sigma_delta.c create mode 100644 components/esp8266/include/driver/sigma_delta.h 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..521261fab --- /dev/null +++ b/components/esp8266/driver/sigma_delta.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2022 + * + * 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_config_t io_config = { + .pin_bit_mask = (1 << gpio_num), + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = 0, + .pull_down_en = 0, + .intr_type = GPIO_INTR_DISABLE + }; + ESP_ERROR_CHECK(gpio_config(&io_config)); + + GPIO.pin[gpio_num].source = SIGMA_AS_PIN_SOURCE; + ESP_LOGI(TAG,"signal output set on GPIO[%d]", gpio_num); + return ESP_OK; +} + +esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num) +{ + ESP_ERROR_CHECK(gpio_set_level(gpio_num,0)); + ESP_ERROR_CHECK(gpio_set_direction(gpio_num,GPIO_MODE_DISABLE)); + + GPIO.pin[gpio_num].source = GPIO_AS_PIN_SOURCE; + ESP_LOGI(TAG,"signal output clear on GPIO[%d]", gpio_num); + 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..86b981072 --- /dev/null +++ b/components/esp8266/include/driver/sigma_delta.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2022 + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef _SIGMA_DELTA_H +#define _SIGMA_DELTA_H + +#include +#include "esp_err.h" + +/** + * @brief Setup sigma-delta signal generator + * The target frequency is defined as: + * - for 0 Date: Sun, 15 Jan 2023 20:06:10 +0100 Subject: [PATCH 2/2] make sigma_delta_set/clear_output usable in ISR --- components/esp8266/driver/sigma_delta.c | 16 +--------------- components/esp8266/include/driver/sigma_delta.h | 14 ++++++++++---- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/components/esp8266/driver/sigma_delta.c b/components/esp8266/driver/sigma_delta.c index 521261fab..d0ba4bded 100644 --- a/components/esp8266/driver/sigma_delta.c +++ b/components/esp8266/driver/sigma_delta.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 + * Copyright (c) 2023 * * SPDX-License-Identifier: LGPL-2.1-or-later */ @@ -82,26 +82,12 @@ esp_err_t sigma_delta_deinit(void) esp_err_t sigma_delta_set_output(gpio_num_t gpio_num) { - gpio_config_t io_config = { - .pin_bit_mask = (1 << gpio_num), - .mode = GPIO_MODE_OUTPUT, - .pull_up_en = 0, - .pull_down_en = 0, - .intr_type = GPIO_INTR_DISABLE - }; - ESP_ERROR_CHECK(gpio_config(&io_config)); - GPIO.pin[gpio_num].source = SIGMA_AS_PIN_SOURCE; - ESP_LOGI(TAG,"signal output set on GPIO[%d]", gpio_num); return ESP_OK; } esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num) { - ESP_ERROR_CHECK(gpio_set_level(gpio_num,0)); - ESP_ERROR_CHECK(gpio_set_direction(gpio_num,GPIO_MODE_DISABLE)); - GPIO.pin[gpio_num].source = GPIO_AS_PIN_SOURCE; - ESP_LOGI(TAG,"signal output clear on GPIO[%d]", gpio_num); return ESP_OK; } diff --git a/components/esp8266/include/driver/sigma_delta.h b/components/esp8266/include/driver/sigma_delta.h index 86b981072..e52b857ed 100644 --- a/components/esp8266/include/driver/sigma_delta.h +++ b/components/esp8266/include/driver/sigma_delta.h @@ -1,15 +1,17 @@ /* - * Copyright (c) 2022 + * Copyright (c) 2023 * * SPDX-License-Identifier: LGPL-2.1-or-later */ -#ifndef _SIGMA_DELTA_H -#define _SIGMA_DELTA_H +#pragma once -#include #include "esp_err.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * @brief Setup sigma-delta signal generator * The target frequency is defined as: @@ -76,6 +78,8 @@ esp_err_t sigma_delta_deinit(void); * @brief Set sigma-delta signal generator output * on selected GPIO * + * @note GPIO should already been configured as output + * * @param[in] gpio_num selected gpio pin * @return * - ESP_OK Success @@ -94,4 +98,6 @@ esp_err_t sigma_delta_set_output(gpio_num_t gpio_num); */ esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num); +#ifdef __cplusplus +} #endif