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

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

commit 4e70cc1e696fd6de36da69019411869aeb2bfa73
Author: Michal Lenc <michall...@seznam.cz>
AuthorDate: Thu Feb 20 10:56:54 2025 +0100

    samv7/pwm: add support for PWMIOC_FAULTS_FETCH_AND_CLEAR ioctl
    
    This ioctl fetches and clears PWM faults.
    
    Signed-off-by: Michal Lenc <michall...@seznam.cz>
---
 arch/arm/src/samv7/sam_pwm.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/arch/arm/src/samv7/sam_pwm.c b/arch/arm/src/samv7/sam_pwm.c
index 23101e3f63..f503706b9b 100644
--- a/arch/arm/src/samv7/sam_pwm.c
+++ b/arch/arm/src/samv7/sam_pwm.c
@@ -1118,7 +1118,43 @@ static int pwm_stop(struct pwm_lowerhalf_s *dev)
 static int pwm_ioctl(struct pwm_lowerhalf_s *dev, int cmd,
                      unsigned long arg)
 {
-  return -ENOTTY;
+  struct sam_pwm_s *priv = (struct sam_pwm_s *)dev;
+  uint32_t regval;
+  int ret = OK;
+
+  switch (cmd)
+    {
+      case PWMIOC_FAULTS_FETCH_AND_CLEAR:
+        {
+          unsigned long clear = arg != 0 ?
+            *(unsigned long *)(uintptr_t)arg : FCR_FCLR_MASK;
+
+          /* Get current faults. */
+
+          regval = pwm_getreg(priv, SAMV7_PWM_FSR);
+
+          /* Clear the faults. */
+
+          clear &= ((regval & FSR_FS_MASK) >> FSR_FS_SHIFT);
+          pwm_putreg(priv, SAMV7_PWM_FCR, FCR_FCLR_SEL(clear));
+
+          /* And return the previously read faults. */
+
+          if (arg != 0)
+            {
+              *(unsigned long *)(uintptr_t)arg =
+              (regval & FSR_FS_MASK) >> FSR_FS_SHIFT;
+            }
+        }
+        break;
+      default:
+        {
+          pwmerr("ERROR: Unknown cmd: %d\n", cmd);
+          ret = -ENOTTY;
+      }
+    }
+
+  return ret;
 }
 
 /****************************************************************************

Reply via email to