xiaoxiang781216 commented on code in PR #12081:
URL: https://github.com/apache/nuttx/pull/12081#discussion_r1554790484


##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;
+  new_pos += (int16_t) (current_pos - new_pos);
+  *(volatile uint32_t *) &priv->last_pos = new_pos;
+
+  return (int32_t) new_pos;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_indx_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of the last index position.
+ *   Last reading is saved to priv->last_index.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_indx_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                              uint32_t current_indx_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_index = *(volatile uint32_t *) &priv->last_pos;
+  new_index += (int16_t) (current_indx_pos - new_index);
+  *(volatile uint32_t *) &priv->last_index = new_index;
+
+  return (int32_t) new_index;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qeindex
+ *
+ * Description:
+ *   A function used for a GETINDEX ioctl call. Works with the internal
+ *   variables needed for the 32 bit extension.
+ *
+ ****************************************************************************/
+
+static int sam_qeindex(struct qe_lowerhalf_s *lower, struct qe_index_s *dest)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  /* Perform the current position retrieval everytime */
+
+  int32_t current_pos;

Review Comment:
   ALL variable definition need be at the begin of the function.



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;
+  new_pos += (int16_t) (current_pos - new_pos);
+  *(volatile uint32_t *) &priv->last_pos = new_pos;
+
+  return (int32_t) new_pos;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_indx_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of the last index position.
+ *   Last reading is saved to priv->last_index.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_indx_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                              uint32_t current_indx_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_index = *(volatile uint32_t *) &priv->last_pos;
+  new_index += (int16_t) (current_indx_pos - new_index);
+  *(volatile uint32_t *) &priv->last_index = new_index;
+
+  return (int32_t) new_index;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qeindex
+ *
+ * Description:
+ *   A function used for a GETINDEX ioctl call. Works with the internal
+ *   variables needed for the 32 bit extension.
+ *
+ ****************************************************************************/
+
+static int sam_qeindex(struct qe_lowerhalf_s *lower, struct qe_index_s *dest)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;

Review Comment:
   ```suggestion
     struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *)lower;
   ```
   remove space after ALL cast.



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -138,6 +174,11 @@ static struct sam_lowerhalf_s g_tc3lower =
   .ops      = &g_qecallbacks,
   .tcid     = 3,
   .inuse    = false,
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX

Review Comment:
   remove, don't need for zero value



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;

Review Comment:
   ditto



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;
+  new_pos += (int16_t) (current_pos - new_pos);
+  *(volatile uint32_t *) &priv->last_pos = new_pos;
+
+  return (int32_t) new_pos;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_indx_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of the last index position.
+ *   Last reading is saved to priv->last_index.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_indx_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                              uint32_t current_indx_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_index = *(volatile uint32_t *) &priv->last_pos;

Review Comment:
   why need cast to `volatile uint32_t *`



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;
+  new_pos += (int16_t) (current_pos - new_pos);
+  *(volatile uint32_t *) &priv->last_pos = new_pos;

Review Comment:
   ditto



##########
arch/arm/src/samv7/sam_qencoder.c:
##########
@@ -270,11 +316,139 @@ static int sam_reset(struct qe_lowerhalf_s *lower)
 static int sam_ioctl(struct qe_lowerhalf_s *lower, int cmd,
                      unsigned long arg)
 {
-  /* No ioctl commands supported */
-
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+  switch (cmd)
+    {
+      case QEIOC_GETINDEX:
+        {
+          /* Call the qeindex function */
+
+          sam_qeindex(lower, (struct qe_index_s *) arg);
+          return OK;
+        }
+
+      default:
+        {
+          return -ENOTTY;
+        }
+    }
+#else
   return -ENOTTY;
+#endif
 }
 
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of current position.
+ *   Last reading is saved to priv->last_pos.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                         uint32_t current_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_pos = *(volatile uint32_t *) &priv->last_pos;
+  new_pos += (int16_t) (current_pos - new_pos);
+  *(volatile uint32_t *) &priv->last_pos = new_pos;
+
+  return (int32_t) new_pos;
+}
+#endif
+
+#ifdef CONFIG_SAMV7_QENCODER_ENABLE_GETINDEX
+/****************************************************************************
+ * Name: sam_qe_indx_pos_16to32b
+ *
+ * Description:
+ *   An inline function performing the extension of the last index position.
+ *   Last reading is saved to priv->last_index.
+ *
+ ****************************************************************************/
+
+static inline int32_t sam_qe_indx_pos_16to32b(struct qe_lowerhalf_s *lower,
+                                              uint32_t current_indx_pos)
+{
+  struct sam_lowerhalf_s *priv = (struct sam_lowerhalf_s *) lower;
+
+  uint32_t new_index = *(volatile uint32_t *) &priv->last_pos;
+  new_index += (int16_t) (current_indx_pos - new_index);
+  *(volatile uint32_t *) &priv->last_index = new_index;

Review Comment:
   ditto



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to