This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit f86b05351f51a3a99f3a3837aa46f4bd136c1392
Author: raiden00pl <[email protected]>
AuthorDate: Thu Sep 24 15:32:29 2026 +0200

    arm/nrf52,nrf53,nrf91: fix RTC driver bugs
    
    - setcc/getcc accepted channel index equal to the channel count
    - init never marked the instance as in use
    - NRFxx_RTC_GETCC called setcc instead of getcc
    
    Assisted-by: Claude Code
    Signed-off-by: raiden00pl <[email protected]>
---
 arch/arm/src/nrf52/nrf52_rtc.c | 8 ++++++--
 arch/arm/src/nrf52/nrf52_rtc.h | 2 +-
 arch/arm/src/nrf53/nrf53_rtc.c | 8 ++++++--
 arch/arm/src/nrf53/nrf53_rtc.h | 2 +-
 arch/arm/src/nrf91/nrf91_rtc.c | 8 ++++++--
 arch/arm/src/nrf91/nrf91_rtc.h | 2 +-
 6 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/arch/arm/src/nrf52/nrf52_rtc.c b/arch/arm/src/nrf52/nrf52_rtc.c
index 1cb618612f4..a99e80c79f6 100644
--- a/arch/arm/src/nrf52/nrf52_rtc.c
+++ b/arch/arm/src/nrf52/nrf52_rtc.c
@@ -405,7 +405,7 @@ static int nrf52_rtc_setcc(struct nrf52_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -435,7 +435,7 @@ static int nrf52_rtc_getcc(struct nrf52_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -797,6 +797,10 @@ struct nrf52_rtc_dev_s *nrf52_rtc_init(int rtc)
 
       priv = NULL;
     }
+  else
+    {
+      priv->inuse = true;
+    }
 
 errout:
   return (struct nrf52_rtc_dev_s *)priv;
diff --git a/arch/arm/src/nrf52/nrf52_rtc.h b/arch/arm/src/nrf52/nrf52_rtc.h
index 80b704e6f54..39eb3710209 100644
--- a/arch/arm/src/nrf52/nrf52_rtc.h
+++ b/arch/arm/src/nrf52/nrf52_rtc.h
@@ -45,7 +45,7 @@
 #define NRF52_RTC_TRGOVRFLW(d)            ((d)->ops->trgovrflw(d))
 #define NRF52_RTC_GETCOUNTER(d, c)        ((d)->ops->getcounter(d, c))
 #define NRF52_RTC_SETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
-#define NRF52_RTC_GETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
+#define NRF52_RTC_GETCC(d, i, cc)         ((d)->ops->getcc(d, i, cc))
 #define NRF52_RTC_SETPRE(d, pre)          ((d)->ops->setpre(d, pre))
 #define NRF52_RTC_SETISR(d, hnd, arg)     ((d)->ops->setisr(d, hnd, arg))
 #define NRF52_RTC_ENABLEINT(d, s)         ((d)->ops->enableint(d, s))
diff --git a/arch/arm/src/nrf53/nrf53_rtc.c b/arch/arm/src/nrf53/nrf53_rtc.c
index e02543279b3..4d492e7ed16 100644
--- a/arch/arm/src/nrf53/nrf53_rtc.c
+++ b/arch/arm/src/nrf53/nrf53_rtc.c
@@ -392,7 +392,7 @@ static int nrf53_rtc_setcc(struct nrf53_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -422,7 +422,7 @@ static int nrf53_rtc_getcc(struct nrf53_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -776,6 +776,10 @@ struct nrf53_rtc_dev_s *nrf53_rtc_init(int rtc)
 
       priv = NULL;
     }
+  else
+    {
+      priv->inuse = true;
+    }
 
 errout:
   return (struct nrf53_rtc_dev_s *)priv;
diff --git a/arch/arm/src/nrf53/nrf53_rtc.h b/arch/arm/src/nrf53/nrf53_rtc.h
index d74e1186158..5f9d1262c2f 100644
--- a/arch/arm/src/nrf53/nrf53_rtc.h
+++ b/arch/arm/src/nrf53/nrf53_rtc.h
@@ -45,7 +45,7 @@
 #define NRF53_RTC_TRGOVRFLW(d)            ((d)->ops->trgovrflw(d))
 #define NRF53_RTC_GETCOUNTER(d, c)        ((d)->ops->getcounter(d, c))
 #define NRF53_RTC_SETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
-#define NRF53_RTC_GETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
+#define NRF53_RTC_GETCC(d, i, cc)         ((d)->ops->getcc(d, i, cc))
 #define NRF53_RTC_SETPRE(d, pre)          ((d)->ops->setpre(d, pre))
 #define NRF53_RTC_SETISR(d, hnd, arg)     ((d)->ops->setisr(d, hnd, arg))
 #define NRF53_RTC_ENABLEINT(d, s)         ((d)->ops->enableint(d, s))
diff --git a/arch/arm/src/nrf91/nrf91_rtc.c b/arch/arm/src/nrf91/nrf91_rtc.c
index d45fd2ab9b9..7905973b42c 100644
--- a/arch/arm/src/nrf91/nrf91_rtc.c
+++ b/arch/arm/src/nrf91/nrf91_rtc.c
@@ -392,7 +392,7 @@ static int nrf91_rtc_setcc(struct nrf91_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -422,7 +422,7 @@ static int nrf91_rtc_getcc(struct nrf91_rtc_dev_s *dev, 
uint8_t i,
 
   /* Is the channel supported? */
 
-  if (i > rtc->chan)
+  if (i >= rtc->chan)
     {
       rtcerr("ERROR: unsupported RTCER channel %d\n", i);
       ret = -EINVAL;
@@ -776,6 +776,10 @@ struct nrf91_rtc_dev_s *nrf91_rtc_init(int rtc)
 
       priv = NULL;
     }
+  else
+    {
+      priv->inuse = true;
+    }
 
 errout:
   return (struct nrf91_rtc_dev_s *)priv;
diff --git a/arch/arm/src/nrf91/nrf91_rtc.h b/arch/arm/src/nrf91/nrf91_rtc.h
index 5d0ed48eb0a..2a566822cf0 100644
--- a/arch/arm/src/nrf91/nrf91_rtc.h
+++ b/arch/arm/src/nrf91/nrf91_rtc.h
@@ -45,7 +45,7 @@
 #define NRF91_RTC_TRGOVRFLW(d)            ((d)->ops->trgovrflw(d))
 #define NRF91_RTC_GETCOUNTER(d, c)        ((d)->ops->getcounter(d, c))
 #define NRF91_RTC_SETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
-#define NRF91_RTC_GETCC(d, i, cc)         ((d)->ops->setcc(d, i, cc))
+#define NRF91_RTC_GETCC(d, i, cc)         ((d)->ops->getcc(d, i, cc))
 #define NRF91_RTC_SETPRE(d, pre)          ((d)->ops->setpre(d, pre))
 #define NRF91_RTC_SETISR(d, hnd, arg)     ((d)->ops->setisr(d, hnd, arg))
 #define NRF91_RTC_ENABLEINT(d, s)         ((d)->ops->enableint(d, s))

Reply via email to