Vajnar commented on code in PR #16491: URL: https://github.com/apache/nuttx/pull/16491#discussion_r2151660042
########## arch/risc-v/src/common/espressif/esp_pcnt.c: ########## @@ -642,8 +646,34 @@ static int esp_pcnt_unit_get_count(struct cap_lowerhalf_s *dev, int *ret) } flags = spin_lock_irqsave(&priv->lock); - *ret = pcnt_ll_get_count(ctx.dev, priv->unit_id) + - priv->accum_value; + tmp_count = pcnt_ll_get_count(ctx.dev, priv->unit_id); + + if (priv->config.accum_count) + { + intr_status = pcnt_ll_get_intr_status(ctx.dev); + if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(priv->unit_id)) + { + event_status = pcnt_ll_get_event_status(ctx.dev, priv->unit_id); + while (event_status) + { + int event_id = __builtin_ffs(event_status) - 1; + event_status &= (event_status - 1); + + if ((event_id == PCNT_LL_WATCH_EVENT_LOW_LIMIT) && \ + (tmp_count >= (priv->config.low_limit / 2))) + { + tmp_count += priv->config.low_limit; + } + else if ((event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) && \ + (tmp_count <= (priv->config.high_limit / 2))) + { + tmp_count += priv->config.high_limit; + } + } + } + } + + *ret = tmp_count + priv->accum_value; Review Comment: > There is important to check clearing conditions in the PCNT hardware. If the read of pcnt_ll_get_intr_status() is not changing internal state of the peripheral then it is correct. The loop is not necessary because only single test for one and another condition is enough. Hi @ppisa, I removed the loop. Please, check if You agree. I see coding style issue in: ``` ~/nuttx/arch/risc-v/src/common/espressif/esp_pcnt.c:662:78: error: Long line found ~/nuttx/arch/xtensa/src/common/espressif/esp_pcnt.c:699:78: error: Long line found ``` But I'm not sure if splitting the line helps readability. ########## arch/risc-v/src/common/espressif/esp_pcnt.c: ########## @@ -642,8 +646,34 @@ static int esp_pcnt_unit_get_count(struct cap_lowerhalf_s *dev, int *ret) } flags = spin_lock_irqsave(&priv->lock); - *ret = pcnt_ll_get_count(ctx.dev, priv->unit_id) + - priv->accum_value; + tmp_count = pcnt_ll_get_count(ctx.dev, priv->unit_id); + + if (priv->config.accum_count) + { + intr_status = pcnt_ll_get_intr_status(ctx.dev); + if (intr_status & PCNT_LL_UNIT_WATCH_EVENT(priv->unit_id)) + { + event_status = pcnt_ll_get_event_status(ctx.dev, priv->unit_id); + while (event_status) + { + int event_id = __builtin_ffs(event_status) - 1; + event_status &= (event_status - 1); + + if ((event_id == PCNT_LL_WATCH_EVENT_LOW_LIMIT) && \ + (tmp_count >= (priv->config.low_limit / 2))) + { + tmp_count += priv->config.low_limit; + } + else if ((event_id == PCNT_LL_WATCH_EVENT_HIGH_LIMIT) && \ + (tmp_count <= (priv->config.high_limit / 2))) + { + tmp_count += priv->config.high_limit; + } + } + } + } + + *ret = tmp_count + priv->accum_value; Review Comment: > There is important to check clearing conditions in the PCNT hardware. If the read of pcnt_ll_get_intr_status() is not changing internal state of the peripheral then it is correct. The loop is not necessary because only single test for one and another condition is enough. Hi @ppisa, I removed the loop. Please, check if You agree. I see coding style issue in: ``` ~/nuttx/arch/risc-v/src/common/espressif/esp_pcnt.c:662:78: error: Long line found ~/nuttx/arch/xtensa/src/common/espressif/esp_pcnt.c:699:78: error: Long line found ``` But I'm not sure if splitting the line helps readability. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org