From f50b5481faba516ff83f945ebbb8af4893a7e379 Mon Sep 17 00:00:00 2001 From: Nilay Date: Fri, 16 Jun 2017 11:11:52 +0530 Subject: [PATCH 1/2] PCNT: Fixed pcnt_counter_clear, Pulse Count now able to resume after API call --- components/driver/pcnt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/driver/pcnt.c b/components/driver/pcnt.c index 9c16e92eb..907221edf 100644 --- a/components/driver/pcnt.c +++ b/components/driver/pcnt.c @@ -143,7 +143,9 @@ esp_err_t pcnt_counter_clear(pcnt_unit_t pcnt_unit) { PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - PCNT.ctrl.val &= (~(BIT(PCNT_PLUS_CNT_RST_U0_S + (pcnt_unit * 2)))); + uint32_t reset_bit = BIT(PCNT_PLUS_CNT_RST_U0_S + (pcnt_unit * 2)); + PCNT.ctrl.val |= reset_bit; + PCNT.ctrl.val &= ~reset_bit; PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } From 769944b067b2b4be4c45cd10fa68981fe411ec2e Mon Sep 17 00:00:00 2001 From: Nilay Date: Fri, 16 Jun 2017 11:18:00 +0530 Subject: [PATCH 2/2] PCNT: fix for pcnt_set_pin API, it can now use all pcnt channels --- components/driver/pcnt.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/driver/pcnt.c b/components/driver/pcnt.c index 907221edf..3f2d866c1 100644 --- a/components/driver/pcnt.c +++ b/components/driver/pcnt.c @@ -96,8 +96,16 @@ esp_err_t pcnt_set_pin(pcnt_unit_t unit, pcnt_channel_t channel, int pulse_io, i PCNT_CHECK(channel < PCNT_CHANNEL_MAX, PCNT_CHANNEL_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(GPIO_IS_VALID_GPIO(pulse_io) || pulse_io < 0, PCNT_GPIO_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(GPIO_IS_VALID_GPIO(ctrl_io) || ctrl_io < 0, PCNT_GPIO_ERR_STR, ESP_ERR_INVALID_ARG); - int input_sig_index = (channel == 0 ? PCNT_SIG_CH0_IN0_IDX + 4 * unit : PCNT_SIG_CH1_IN0_IDX + 4 * unit); - int ctrl_sig_index = (channel == 0 ? PCNT_CTRL_CH0_IN0_IDX + 4 * unit : PCNT_CTRL_CH1_IN0_IDX + 4 * unit); + + int sig_base = (channel == 0) ? PCNT_SIG_CH0_IN0_IDX : PCNT_SIG_CH1_IN0_IDX; + int ctrl_base = (channel == 0) ? PCNT_CTRL_CH0_IN0_IDX : PCNT_CTRL_CH1_IN0_IDX; + if (unit > 4) { + sig_base += 12; // GPIO matrix assignments have a gap between units 4 & 5 + ctrl_base += 12; + } + int input_sig_index = sig_base + (4 * unit); + int ctrl_sig_index = ctrl_base + (4 * unit); + if(pulse_io >= 0) { PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[pulse_io], PIN_FUNC_GPIO); gpio_set_direction(pulse_io, GPIO_MODE_INPUT);