Skip to content

Commit 13d440d

Browse files
committed
initial commit
1 parent 83eb08e commit 13d440d

File tree

5 files changed

+233
-0
lines changed

5 files changed

+233
-0
lines changed

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set(srcs "driver/sigma_delta.c")
2+
set(include_dirs "include" "include/driver")

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,23 @@
11
# esp8266-sigma-delta
22
ESP8266_RTOS_SDK sigma-delta module driver
3+
4+
For unknown reasons sigma-delta module driver is not present in ESP8266_RTOS_SDK.
5+
6+
It can be used as Infrared carrier signal generator on any pin, or as cheap
7+
audio output
8+
9+
To use this module:
10+
11+
1. move to `components` directory of your ESP8266_RTOS_SDK project
12+
2. run `git clone https://github.com/QB4-dev/esp8266-sigma-delta`
13+
3. add driver header in your code and start the module:
14+
```
15+
#include "driver/sigma_delta.h"
16+
...
17+
#define IR_TX_IO_NUM 2
18+
...
19+
//generate 38kHz carrier
20+
sigma_delta_init(100,12);
21+
//set IR_TX_IO_NUM GPIO as signal output
22+
sigma_delta_set_output(IR_TX_IO_NUM);
23+
```

component.mk

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#
2+
# Component Makefile
3+
#
4+
5+
COMPONENT_ADD_INCLUDEDIRS += include
6+
COMPONENT_SRCDIRS := driver

driver/sigma_delta.c

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
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+
}

include/driver/sigma_delta.h

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* Copyright (c) 2022 <[email protected]>
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
#ifndef _SIGMA_DELTA_H
8+
#define _SIGMA_DELTA_H
9+
10+
#include <stdint.h>
11+
#include "esp_err.h"
12+
13+
/**
14+
* @brief Setup sigma-delta signal generator
15+
* The target frequency is defined as:
16+
* - for 0<target<128 freq = 80,000,000/prescaler * target /256 Hz
17+
* - for 128<target<256 freq = 80,000,000/prescaler * (256-target) /256
18+
*
19+
* @note The target and prescaler will both affect the freq.
20+
* CPU_FREQ has no influence on the sigma-delta frequency.
21+
*
22+
* @param[in] prescaler clock divider, range 0-255
23+
* @param[in] target duty cycle,range 0-255
24+
* @return
25+
* - ESP_OK Success
26+
*/
27+
esp_err_t sigma_delta_init(uint8_t prescale,uint8_t target);
28+
29+
/**
30+
* @brief Set sigma-delta signal generator prescale
31+
*
32+
* @param[in] prescale clock divider, range 0-255
33+
* @return
34+
* - ESP_OK Success
35+
*/
36+
esp_err_t sigma_delta_set_prescale(uint8_t prescale);
37+
38+
/**
39+
* @brief Get sigma-delta signal generator prescale
40+
*
41+
* @param[out] prescale clock divider
42+
* @return
43+
* - ESP_OK Success
44+
* - ESP_ERR_INVALID_ARG when prescale is NULL
45+
*/
46+
esp_err_t sigma_delta_get_prescale(uint8_t *prescale);
47+
48+
/**
49+
* @brief Set sigma-delta signal generator target
50+
*
51+
* @param[in] target duty cycle,range 0-255
52+
* @return
53+
* - ESP_OK Success
54+
*/
55+
esp_err_t sigma_delta_set_target(uint8_t target);
56+
57+
/**
58+
* @brief Get sigma-delta signal generator target
59+
*
60+
* @param[out] target duty cycle
61+
* @return
62+
* - ESP_OK Success
63+
* - ESP_ERR_INVALID_ARG when target is NULL
64+
*/
65+
esp_err_t sigma_delta_get_target(uint8_t *target);
66+
67+
/**
68+
* @brief Disable sigma-delta signal generator
69+
*
70+
* @return
71+
* - ESP_OK Success
72+
*/
73+
esp_err_t sigma_delta_deinit(void);
74+
75+
/**
76+
* @brief Set sigma-delta signal generator output
77+
* on selected GPIO
78+
*
79+
* @param[in] gpio_num selected gpio pin
80+
* @return
81+
* - ESP_OK Success
82+
* - ESP_ERR_INVALID_ARG GPIO number error
83+
*/
84+
esp_err_t sigma_delta_set_output(gpio_num_t gpio_num);
85+
86+
/**
87+
* @brief Clear sigma-delta signal generator output
88+
* on selected GPIO
89+
*
90+
* @param[in] gpio_num selected gpio pin
91+
* @return
92+
* - ESP_OK Success
93+
* - ESP_ERR_INVALID_ARG GPIO number error
94+
*/
95+
esp_err_t sigma_delta_clear_output(gpio_num_t gpio_num);
96+
97+
#endif

0 commit comments

Comments
 (0)