|
|
@@ -0,0 +1,85 @@
|
|
|
+#ifdef CHLCD_ON_ESP
|
|
|
+
|
|
|
+#include <cx/chlcd.h>
|
|
|
+
|
|
|
+#include <driver/gpio.h>
|
|
|
+#include <driver/ledc.h>
|
|
|
+#include <rom/ets_sys.h>
|
|
|
+#include <freertos/FreeRTOS.h>
|
|
|
+#include <freertos/task.h>
|
|
|
+
|
|
|
+#ifndef CHLCD_LED_PWM_TIMER
|
|
|
+#define CHLCD_LED_PWM_TIMER LEDC_TIMER_MAX
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef CHLCD_LED_PWM_CHANNEL
|
|
|
+#define CHLCD_LED_PWM_CHANNEL LEDC_CHANNEL_MAX
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef CHLCD_LED_PWM_FREQUENCY
|
|
|
+#define CHLCD_LED_PWM_FREQUENCY 20000
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+chlcd_error_t chlcd_pin_set_output(chlcd_pin_t target) {
|
|
|
+ if (gpio_output_enable(target) == ESP_OK) {
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return CHLCD_BAD_ARGUMENT;
|
|
|
+}
|
|
|
+
|
|
|
+chlcd_error_t chlcd_pin_write(chlcd_pin_t target, bool state) {
|
|
|
+ if (gpio_set_level(target, state ? 1 : 0) == ESP_OK) {
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return CHLCD_BAD_ARGUMENT;
|
|
|
+}
|
|
|
+
|
|
|
+chlcd_error_t chlcd_pin_set_pwm(chlcd_pin_t target) {
|
|
|
+ ledc_timer_config_t timer_config[1] = {0};
|
|
|
+ timer_config->speed_mode = LEDC_LOW_SPEED_MODE;
|
|
|
+ timer_config->duty_resolution = LEDC_TIMER_12_BIT;
|
|
|
+ timer_config->clk_cfg = LEDC_AUTO_CLK;
|
|
|
+ timer_config->freq_hz = CHLCD_LED_PWM_FREQUENCY;
|
|
|
+ timer_config->timer_num = CHLCD_LED_PWM_CHANNEL;
|
|
|
+
|
|
|
+ if (ledc_timer_config(timer_config) != ESP_OK) {
|
|
|
+ return CHLCD_BAD_ARGUMENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ ledc_channel_config_t channel_config[1] = {0};
|
|
|
+ channel_config->speed_mode = LEDC_LOW_SPEED_MODE;
|
|
|
+ channel_config->channel = CHLCD_LED_PWM_CHANNEL;
|
|
|
+ channel_config->timer_sel = CHLCD_LED_PWM_TIMER;
|
|
|
+ channel_config->gpio_num = target;
|
|
|
+ channel_config->duty = 0;
|
|
|
+ channel_config->hpoint = 0;
|
|
|
+ channel_config->sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE;
|
|
|
+
|
|
|
+ if (ledc_channel_config(channel_config) != ESP_OK) {
|
|
|
+ return CHLCD_BAD_ARGUMENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+chlcd_error_t chlcd_pin_write_pwm(
|
|
|
+ chlcd_pin_t target,
|
|
|
+ uint16_t pwm
|
|
|
+) {
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+static inline chlcd_error_t chlcd_sleep_us(uint32_t time) {
|
|
|
+ if (time < 1000) {
|
|
|
+ ets_delay_us(time);
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ vTaskDelay(time / 1000 / portTICK_PERIOD_MS);
|
|
|
+ return CHLCD_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|