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


##########
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:
   Oh wait, but to what should I change it to? I cannot move it to ops struct, 
it needs to be known name so that upper half can call it so that lower half can 
initialize that ops struct.



-- 
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

Reply via email to