You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2022/07/18 09:31:15 UTC

[GitHub] [incubator-nuttx] xiaoxiang781216 commented on a diff in pull request #6537: drivers/ipcc: add Inter Processor Communication driver

xiaoxiang781216 commented on code in PR #6537:
URL: https://github.com/apache/incubator-nuttx/pull/6537#discussion_r922983914


##########
drivers/ipcc/Make.defs:
##########
@@ -0,0 +1,41 @@
+############################################################################
+# drivers/ipcc/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+ifeq ($(CONFIG_IPCC),y)
+
+# Include ipcc driver
+
+CSRCS += ipcc_poll.c
+CSRCS += ipcc_read.c
+CSRCS += ipcc_write.c
+CSRCS += ipcc_register.c
+
+ifneq ($(CONFIG_DISABLE_PSEUDOFS_OPERATIONS),y)
+CSRCS += ipcc_open.c
+CSRCS += ipcc_close.c

Review Comment:
   open/close is always required?



##########
include/nuttx/ipcc.h:
##########
@@ -0,0 +1,188 @@
+/****************************************************************************
+ * include/nuttx/ipcc.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/mm/circbuf.h>
+#include <nuttx/semaphore.h>
+
+#include <poll.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* IPCC is a two-part driver:
+ *
+ * 1) A common upper half driver, that provides the character device
+ *    interface for the user
+ * 2) Platform-specific lower half drivers that provide interface
+ *    between upper and lower layer. Lower half also contains
+ *    common objects like semaphore to inform
+ */
+
+/* This structure defines all of the operations provided by the
+ * architecture specific logic. All fields must be provided with
+ * non-NULL function pointers.
+ */
+
+struct ipcc_lower_s;
+struct ipcc_ops_s
+{
+  /* Reads data directly from IPCC mbox, should not block, ever.
+   * If no data is available, 0 should be returned. Partial read
+   * is possible. In that case function will return value less
+   * than buflen.
+   */
+
+  CODE ssize_t (*read)(FAR struct ipcc_lower_s *ipcc,
+                       FAR char *buffer, size_t buflen);
+
+  /* Writes data directly to IPCC mbox, should not block, ever.
+   * If IPCC memory is full, or busy or otherwise unavailable for
+   * write, 0 should be returned. Partial write is possible. In
+   * that case function will return value less then buflen.
+   */
+
+  CODE ssize_t (*write)(FAR struct ipcc_lower_s *ipcc,
+                        FAR const char *buffer, size_t buflen);
+
+  /* Lower driver should copy data from IPCC to cirbuf on demand.
+   * It does not have to copy all data (in case rxbuf is full), but
+   * it should keep internal pointer to track uncopied data, and copy
+   * what is left on the next call to this function.
+   */
+
+  CODE ssize_t (*buffer_data)(FAR struct ipcc_lower_s *ipcc,
+                              FAR struct circbuf_s *rxbuf);
+
+  /* Upper half notifies lower half driver that new data has been
+   * copied to circ buffer
+   */
+
+  CODE ssize_t (*write_notify)(FAR struct ipcc_lower_s *ipcc);
+};
+
+/* This structure defines the interface between upper and lower halves.
+ * Such instance is passed to ipcc_register() function after driver
+ * has been initialized, binding the upper and lower halves into one
+ * driver.
+ */
+
+struct ipcc_lower_s
+{
+  FAR struct pollfd        *fds[CONFIG_IPCC_NPOLLWAITERS];
+  FAR struct ipcc_ops_s     ops;      /* Arch specific functions */
+  sem_t                     rxsem;    /* Data ready to read semaphore */
+  sem_t                     txsem;    /* Data ready to send semaphore */
+  int                       chan;     /* IPCC channel */
+
+#ifdef CONFIG_IPCC_BUFFERED
+  struct circbuf_s          rxbuf;    /* Receive buffer */
+  struct circbuf_s          txbuf;    /* Transmit buffer */
+
+  /* 1- not all data could fit into buffer, some unread data is still
+   * in IPCC mbox. State of this variable is maintained by lower half,
+   * upper half only reads it to know when to inform lower driver that
+   * buffer got free.
+   */
+
+  int                       overflow;
+#endif /* CONFIG_IPCC_BUFFERED */
+};
+
+/* Driver state structure */
+
+struct ipcc_driver_s
+{
+  FAR struct ipcc_lower_s   ipcc;     /* Lower half driver state */
+  int                       crefs;    /* Count number of open references */
+  int                       unlinked; /* 1 - driver has been unlinked */
+  sem_t                     exclsem;  /* Mutual exclusion for driver */
+};
+
+/****************************************************************************
+ * Public Functions Prototypes
+ ****************************************************************************/
+
+void ipcc_pollnotify(FAR struct ipcc_lower_s *ipcc, pollevent_t eventset);
+void ipcc_cleanup(FAR struct ipcc_driver_s *priv);
+void ipcc_txfree_notify(FAR struct ipcc_lower_s *priv);
+void ipcc_rxfree_notify(FAR struct ipcc_lower_s *ipcc);
+
+#ifdef CONFIG_IPCC_BUFFERED
+int ipcc_register(int chan, size_t rxbuflen, size_t txbuflen);
+#else
+int ipcc_register(int chan);
+#endif
+
+/****************************************************************************
+ * Name: up_ipcc_init
+ *
+ * Description:
+ *   Initializes lower half of the driver. This function should be
+ *   implemented by lower half driver in microcontroller code. Function
+ *   should not initialize ipcc_lower_s structure with the exception of
+ *   explicitly specified fields like setting pointer to read and write
+ *   function pointers. Rest of the fields are initialized in upper half
+ *   driver.
+ *
+ *   This function is called once in ipcc_register() function.
+ *
+ * Input Parameters:
+ *   ipcc - interface between upper and lower half drivers. Only some
+ *          of the fields should be initialized in this function.
+ *   chan - channel number to initialize.
+ *
+ * Returned Value:
+ *   0 on success or negated errno otherwise.
+ *
+ * Assumptions/Limitations:
+ *
+ ****************************************************************************/
+
+int up_ipcc_init(FAR struct ipcc_lower_s *ipcc, int chan);

Review Comment:
   up_xxx is reserved to the core os interact with the arch/chip specific code, it isn't good to use up api for the normal driver communication.



##########
drivers/ipcc/ipcc_unlink.c:
##########
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * drivers/ipcc/ipcc_unlink.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/ipcc.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/semaphore.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ipcc_unlink
+ *
+ * Description:
+ *   Action to take upon file unlinking. Function will free resources if
+ *   noone is using the driver when unlinking occured. If driver is still
+ *   in use, it will be marked as unlinked and resource freeing will take
+ *   place in ipcc_close() function instead, once last reference is closed.
+ *
+ * Input Parameters:
+ *   inode - driver inode that is being unlinked
+ *
+ * Returned Value:
+ *   OK on successfull close, or negated errno on failure.
+ *
+ * Assumptions/Limitations:
+ *
+ ****************************************************************************/
+
+int ipcc_unlink(FAR struct inode *inode)

Review Comment:
   since the IPC existence is determined statically, it doesn't make sense to let user unlink it.



##########
drivers/ipcc/ipcc_register.c:
##########
@@ -0,0 +1,208 @@
+/****************************************************************************
+ * drivers/ipcc/ipcc_register.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/ipcc.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/mm/circbuf.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Device naming ************************************************************/
+
+#define DEVNAME_FMT     "/dev/ipcc%d"
+#define DEVNAME_FMTLEN  (9 + 3 + 1)
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+int     ipcc_open(FAR struct file *filep);
+int     ipcc_close(FAR struct file *filep);
+int     ipcc_unlink(FAR struct inode *inode);
+#endif
+int     ipcc_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+ssize_t ipcc_read(FAR struct file *filep, FAR char *buffer, size_t buflen);
+ssize_t ipcc_write(FAR struct file *filep, FAR const char *buffer,
+                          size_t buflen);
+int     ipcc_poll(FAR struct file *filep, FAR struct pollfd *fds,
+                  bool setup);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct file_operations ipcc_fops =
+{
+#ifdef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+  .open   = NULL,
+  .close  = NULL,
+  .unlink = NULL,
+#else /* CONFIG_DISABLE_PSEUDOFS_OPERATIONS */
+  .open   = ipcc_open,
+  .close  = ipcc_close,
+  .unlink = ipcc_unlink,
+#endif /* CONFIG_DISABLE_PSEUDOFS_OPERATIONS */
+  .poll   = ipcc_poll,
+  .read   = ipcc_read,
+  .write  = ipcc_write,
+  .ioctl  = NULL,
+  .seek   = NULL
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ipcc_cleanup
+ *
+ * Description:
+ *   Cleans up resources allocated by ipcc_register()
+ *
+ * Input Parameters:
+ *   priv - ipcc driver instance to clean up
+ *
+ * Returned Value:
+ *   None
+ *
+ * Assumptions/Limitations:
+ *   This function should be called only when ipcc_register is run with
+ *   success and all resources in driver instance are properly allocated.
+ *
+ ****************************************************************************/
+
+void ipcc_cleanup(FAR struct ipcc_driver_s *priv)
+{
+#ifdef CONFIG_IPCC_BUFFERED
+  circbuf_uninit(&priv->ipcc.rxbuf);
+  circbuf_uninit(&priv->ipcc.txbuf);
+#endif
+  nxsem_destroy(&priv->ipcc.rxsem);
+  nxsem_destroy(&priv->ipcc.txsem);
+  up_ipcc_cleanup(&priv->ipcc);
+  nxsem_destroy(&priv->exclsem);
+  kmm_free(priv);
+}
+
+/****************************************************************************
+ * Name: ipcc_register
+ *
+ * Description:
+ *   Create and register the IPCC character driver.
+ *
+ *   IPCC is a simple character driver that supports inter processor
+ *   communication.
+ *
+ * Input Parameters:
+ *   ipcc - An instance of the lower half IPCC driver
+ *   chan - IPCC channel. This will be used ad IPCC minor number.
+ *     IPPC will be registered as /dev/ipccN where N is the minor number.
+ *   buflen - Length of tx and rx buffers, 0 for unbuffered communication.
+ *
+ * Returned Value:
+ *   OK if the driver was successfully registered, or negated errno on
+ *   failure.
+ *
+ * Assumptions/Limitations:
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_IPCC_BUFFERED
+int ipcc_register(int chan, size_t rxbuflen, size_t txbuflen)
+#else
+int ipcc_register(int chan)
+#endif
+{
+  FAR struct ipcc_driver_s *priv;
+  char devname[DEVNAME_FMTLEN];
+  int ret;
+
+  /* Allocate a IPCC character device structure */
+
+  if ((priv = kmm_zalloc(sizeof(*priv))) == NULL)
+    {
+      return -ENOMEM;
+    }
+
+  if ((ret = up_ipcc_init(&priv->ipcc, chan)))

Review Comment:
   why not let the implementor pass  ipcc_driver_s directly to ipcc_register?



##########
include/nuttx/ipcc.h:
##########
@@ -0,0 +1,188 @@
+/****************************************************************************
+ * include/nuttx/ipcc.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/mm/circbuf.h>
+#include <nuttx/semaphore.h>
+
+#include <poll.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* IPCC is a two-part driver:
+ *
+ * 1) A common upper half driver, that provides the character device
+ *    interface for the user
+ * 2) Platform-specific lower half drivers that provide interface
+ *    between upper and lower layer. Lower half also contains
+ *    common objects like semaphore to inform
+ */
+
+/* This structure defines all of the operations provided by the
+ * architecture specific logic. All fields must be provided with
+ * non-NULL function pointers.
+ */
+
+struct ipcc_lower_s;
+struct ipcc_ops_s
+{
+  /* Reads data directly from IPCC mbox, should not block, ever.
+   * If no data is available, 0 should be returned. Partial read
+   * is possible. In that case function will return value less
+   * than buflen.
+   */
+
+  CODE ssize_t (*read)(FAR struct ipcc_lower_s *ipcc,
+                       FAR char *buffer, size_t buflen);
+
+  /* Writes data directly to IPCC mbox, should not block, ever.
+   * If IPCC memory is full, or busy or otherwise unavailable for
+   * write, 0 should be returned. Partial write is possible. In
+   * that case function will return value less then buflen.
+   */
+
+  CODE ssize_t (*write)(FAR struct ipcc_lower_s *ipcc,
+                        FAR const char *buffer, size_t buflen);
+
+  /* Lower driver should copy data from IPCC to cirbuf on demand.
+   * It does not have to copy all data (in case rxbuf is full), but
+   * it should keep internal pointer to track uncopied data, and copy
+   * what is left on the next call to this function.
+   */
+
+  CODE ssize_t (*buffer_data)(FAR struct ipcc_lower_s *ipcc,
+                              FAR struct circbuf_s *rxbuf);
+
+  /* Upper half notifies lower half driver that new data has been
+   * copied to circ buffer
+   */
+
+  CODE ssize_t (*write_notify)(FAR struct ipcc_lower_s *ipcc);
+};
+
+/* This structure defines the interface between upper and lower halves.
+ * Such instance is passed to ipcc_register() function after driver
+ * has been initialized, binding the upper and lower halves into one
+ * driver.
+ */
+
+struct ipcc_lower_s
+{
+  FAR struct pollfd        *fds[CONFIG_IPCC_NPOLLWAITERS];
+  FAR struct ipcc_ops_s     ops;      /* Arch specific functions */
+  sem_t                     rxsem;    /* Data ready to read semaphore */
+  sem_t                     txsem;    /* Data ready to send semaphore */
+  int                       chan;     /* IPCC channel */
+
+#ifdef CONFIG_IPCC_BUFFERED
+  struct circbuf_s          rxbuf;    /* Receive buffer */
+  struct circbuf_s          txbuf;    /* Transmit buffer */
+
+  /* 1- not all data could fit into buffer, some unread data is still
+   * in IPCC mbox. State of this variable is maintained by lower half,
+   * upper half only reads it to know when to inform lower driver that
+   * buffer got free.
+   */
+
+  int                       overflow;
+#endif /* CONFIG_IPCC_BUFFERED */
+};
+
+/* Driver state structure */
+
+struct ipcc_driver_s
+{
+  FAR struct ipcc_lower_s   ipcc;     /* Lower half driver state */
+  int                       crefs;    /* Count number of open references */
+  int                       unlinked; /* 1 - driver has been unlinked */
+  sem_t                     exclsem;  /* Mutual exclusion for driver */
+};
+
+/****************************************************************************
+ * Public Functions Prototypes
+ ****************************************************************************/
+
+void ipcc_pollnotify(FAR struct ipcc_lower_s *ipcc, pollevent_t eventset);
+void ipcc_cleanup(FAR struct ipcc_driver_s *priv);
+void ipcc_txfree_notify(FAR struct ipcc_lower_s *priv);
+void ipcc_rxfree_notify(FAR struct ipcc_lower_s *ipcc);
+
+#ifdef CONFIG_IPCC_BUFFERED
+int ipcc_register(int chan, size_t rxbuflen, size_t txbuflen);
+#else
+int ipcc_register(int chan);
+#endif
+
+/****************************************************************************
+ * Name: up_ipcc_init
+ *
+ * Description:
+ *   Initializes lower half of the driver. This function should be
+ *   implemented by lower half driver in microcontroller code. Function
+ *   should not initialize ipcc_lower_s structure with the exception of
+ *   explicitly specified fields like setting pointer to read and write
+ *   function pointers. Rest of the fields are initialized in upper half
+ *   driver.
+ *
+ *   This function is called once in ipcc_register() function.
+ *
+ * Input Parameters:
+ *   ipcc - interface between upper and lower half drivers. Only some
+ *          of the fields should be initialized in this function.
+ *   chan - channel number to initialize.
+ *
+ * Returned Value:
+ *   0 on success or negated errno otherwise.
+ *
+ * Assumptions/Limitations:
+ *
+ ****************************************************************************/
+
+int up_ipcc_init(FAR struct ipcc_lower_s *ipcc, int chan);
+
+/****************************************************************************
+ * Name: up_ipcc_cleanup
+ *
+ * Description:
+ *   Cleans up lower half of the driver. This function should be
+ *   implemented by lower half driver in microcontroller code. Function
+ *   should not deinitialize anyting in ipcc structure - upper half driver
+ *   will handle that.
+ *
+ *   Function is called once driver has been unlinked and all descriptors
+ *   to ipcc instance are closed.
+ *
+ * Input Parameters:
+ *   ipcc - driver instance that is being cleaned up.
+ *
+ * Returned Value:
+ *   0 on success or negated errno otherwise.
+ *
+ * Assumptions/Limitations:
+ *
+ ****************************************************************************/
+
+int up_ipcc_cleanup(FAR struct ipcc_lower_s *ipcc);

Review Comment:
   let's change to a callback in ipcc_lower_s instead



##########
drivers/ipcc/ipcc_register.c:
##########
@@ -0,0 +1,208 @@
+/****************************************************************************
+ * drivers/ipcc/ipcc_register.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/ipcc.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/mm/circbuf.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Device naming ************************************************************/
+
+#define DEVNAME_FMT     "/dev/ipcc%d"
+#define DEVNAME_FMTLEN  (9 + 3 + 1)
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+int     ipcc_open(FAR struct file *filep);

Review Comment:
   why not implement ipcc_xxx in one file like other drivers?



##########
drivers/ipcc/ipcc_register.c:
##########
@@ -0,0 +1,208 @@
+/****************************************************************************
+ * drivers/ipcc/ipcc_register.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/ipcc.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/mm/circbuf.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Device naming ************************************************************/
+
+#define DEVNAME_FMT     "/dev/ipcc%d"
+#define DEVNAME_FMTLEN  (9 + 3 + 1)
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+int     ipcc_open(FAR struct file *filep);
+int     ipcc_close(FAR struct file *filep);
+int     ipcc_unlink(FAR struct inode *inode);
+#endif
+int     ipcc_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+ssize_t ipcc_read(FAR struct file *filep, FAR char *buffer, size_t buflen);
+ssize_t ipcc_write(FAR struct file *filep, FAR const char *buffer,
+                          size_t buflen);
+int     ipcc_poll(FAR struct file *filep, FAR struct pollfd *fds,
+                  bool setup);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct file_operations ipcc_fops =
+{
+#ifdef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+  .open   = NULL,
+  .close  = NULL,

Review Comment:
   open/close must always implement, only unlink is optional.



-- 
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-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org