|
| 1 | +/* |
| 2 | + * Copyright (c) 2022 <[email protected]> |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: LGPL-2.1-or-later |
| 5 | + */ |
| 6 | + |
| 7 | +#include <esp_err.h> |
| 8 | +#include <esp_log.h> |
| 9 | + |
| 10 | +#include <esp8266/eagle_soc.h> |
| 11 | +#include <esp8266/pin_mux_register.h> |
| 12 | +#include <esp8266/gpio_register.h> |
| 13 | +#include <esp8266/gpio_struct.h> |
| 14 | + |
| 15 | +#include <driver/gpio.h> |
| 16 | +#include "driver/sigma_delta.h" |
| 17 | + |
| 18 | +static const char *TAG = "sigma-delta"; |
| 19 | + |
| 20 | +#define SIGMA_DELTA_CHECK(a, str, ret_val) \ |
| 21 | + if (!(a)) { \ |
| 22 | + ESP_LOGE(TAG,"%s(%d): %s", __FUNCTION__, __LINE__, str); \ |
| 23 | + return (ret_val); \ |
| 24 | + } |
| 25 | + |
| 26 | +#define GPIO_SIGMA_DELTA_TARGET_MASK (SIGMA_DELTA_TARGET << SIGMA_DELTA_TARGET_S) |
| 27 | +#define GPIO_SIGMA_DELTA_TARGET_GET(x) (((x) & GPIO_SIGMA_DELTA_TARGET_MASK) >> SIGMA_DELTA_TARGET_S) |
| 28 | +#define GPIO_SIGMA_DELTA_TARGET_SET(x) (((x) << SIGMA_DELTA_TARGET_S) & GPIO_SIGMA_DELTA_TARGET_MASK) |
| 29 | + |
| 30 | +#define GPIO_SIGMA_DELTA_PRESCALE_MASK (SIGMA_DELTA_PRESCALAR << SIGMA_DELTA_PRESCALAR_S) |
| 31 | +#define GPIO_SIGMA_DELTA_PRESCALE_GET(x) (((x) & GPIO_SIGMA_DELTA_PRESCALE_MASK) >> SIGMA_DELTA_PRESCALAR_S) |
| 32 | +#define GPIO_SIGMA_DELTA_PRESCALE_SET(x) (((x) << SIGMA_DELTA_PRESCALAR_S) & GPIO_SIGMA_DELTA_PRESCALE_MASK) |
| 33 | + |
| 34 | +#define GPIO_AS_PIN_SOURCE 0 |
| 35 | +#define SIGMA_AS_PIN_SOURCE 1 |
| 36 | + |
| 37 | +esp_err_t sigma_delta_init(uint8_t prescaler,uint8_t target) |
| 38 | +{ |
| 39 | + GPIO.sigma_delta = SIGMA_DELTA_ENABLE | |
| 40 | + GPIO_SIGMA_DELTA_TARGET_SET(target) | |
| 41 | + GPIO_SIGMA_DELTA_PRESCALE_SET(prescaler); |
| 42 | + |
| 43 | + ESP_LOGI(TAG,"enabled with prescale=%d and target=%d", prescaler, target); |
| 44 | + return ESP_OK; |
| 45 | +} |
| 46 | + |
| 47 | +esp_err_t sigma_delta_set_prescale(uint8_t prescale) |
| 48 | +{ |
| 49 | + GPIO.sigma_delta = (GPIO.sigma_delta & (~GPIO_SIGMA_DELTA_PRESCALE_MASK)) | |
| 50 | + GPIO_SIGMA_DELTA_PRESCALE_SET(prescale); |
| 51 | + return ESP_OK; |
| 52 | +} |
| 53 | + |
| 54 | +esp_err_t sigma_delta_get_prescale(uint8_t *prescale) |
| 55 | +{ |
| 56 | + SIGMA_DELTA_CHECK(prescale, "prescale is null", ESP_ERR_INVALID_ARG); |
| 57 | + *prescale = GPIO_SIGMA_DELTA_PRESCALE_GET(GPIO.sigma_delta); |
| 58 | + return ESP_OK; |
| 59 | +} |
| 60 | + |
| 61 | +esp_err_t sigma_delta_set_target(uint8_t target) |
| 62 | +{ |
| 63 | + GPIO.sigma_delta = (GPIO.sigma_delta & (~GPIO_SIGMA_DELTA_TARGET_MASK)) | |
| 64 | + GPIO_SIGMA_DELTA_TARGET_SET(target); |
| 65 | + return ESP_OK; |
| 66 | +} |
| 67 | + |
| 68 | +esp_err_t sigma_delta_get_target(uint8_t *target) |
| 69 | +{ |
| 70 | + SIGMA_DELTA_CHECK(target, "target is null", ESP_ERR_INVALID_ARG); |
| 71 | + *target = GPIO_SIGMA_DELTA_TARGET_GET(GPIO.sigma_delta); |
| 72 | + return ESP_OK; |
| 73 | +} |
| 74 | + |
| 75 | +esp_err_t sigma_delta_deinit(void) |
| 76 | +{ |
| 77 | + GPIO.sigma_delta = 0x00; |
| 78 | + |
| 79 | + ESP_LOGI(TAG,"disabled"); |
| 80 | + return ESP_OK; |
| 81 | +} |
| 82 | + |
| 83 | +esp_err_t sigma_delta_set_output(gpio_num_t gpio_num) |
| 84 | +{ |
| 85 | + gpio_config_t io_config = { |
| 86 | + .pin_bit_mask = (1 << gpio_num), |
| 87 | + .mode = GPIO_MODE_OUTPUT, |
| 88 | + .pull_up_en = 0, |
| 89 | + .pull_down_en = GPIO_PULLDOWN_ENABLE, |
| 90 | + .intr_type = GPIO_INTR_DISABLE |
| 91 | + }; |
| 92 | + ESP_ERROR_CHECK(gpio_config(&io_config)); |
| 93 | + |
| 94 | + GPIO.pin[gpio_num].source = SIGMA_AS_PIN_SOURCE; |
| 95 | + ESP_LOGI(TAG,"signal output set on GPIO[%d]", gpio_num); |
| 96 | + return ESP_OK; |
| 97 | +} |
| 98 | + |
| 99 | +esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num) |
| 100 | +{ |
| 101 | + ESP_ERROR_CHECK(gpio_set_level(gpio_num,0)); |
| 102 | + ESP_ERROR_CHECK(gpio_set_direction(gpio_num,GPIO_MODE_DISABLE)); |
| 103 | + |
| 104 | + GPIO.pin[gpio_num].source = GPIO_AS_PIN_SOURCE; |
| 105 | + ESP_LOGI(TAG,"signal output clear on GPIO[%d]", gpio_num); |
| 106 | + return ESP_OK; |
| 107 | +} |
0 commit comments