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/03/08 17:37:25 UTC

[GitHub] [incubator-nuttx] eenurkka commented on a change in pull request #5688: MPFS USB driver

eenurkka commented on a change in pull request #5688:
URL: https://github.com/apache/incubator-nuttx/pull/5688#discussion_r821908498



##########
File path: arch/risc-v/src/mpfs/mpfs_usb.c
##########
@@ -0,0 +1,3770 @@
+/****************************************************************************
+ * arch/risc-v/src/mpfs/mpfs_usb.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 <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/irq.h>
+#include <nuttx/signal.h>
+#include <nuttx/usb/usb.h>
+#include <nuttx/usb/usbdev.h>
+#include <nuttx/usb/usbdev_trace.h>
+
+#include <nuttx/usb/usbhost.h>
+#include <nuttx/usb/usbhost_devaddr.h>
+#include <nuttx/usb/usbhost_trace.h>
+
+#include <nuttx/spinlock.h>
+
+#include <arch/board/board.h>
+#include <arch/board/board_liberodefs.h>
+
+#include "hardware/mpfs_usb.h"
+#include "riscv_arch.h"
+#include "chip.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* USB trace error codes */
+
+#define MPFS_TRACEERR_ALLOCFAIL            0x0001
+#define MPFS_TRACEERR_BADCLEARFEATURE      0x0002
+#define MPFS_TRACEERR_BADDEVGETSTATUS      0x0003
+#define MPFS_TRACEERR_BADEPGETSTATUS       0x0004
+#define MPFS_TRACEERR_BADEPNO              0x0006
+#define MPFS_TRACEERR_BADEPTYPE            0x0007
+#define MPFS_TRACEERR_BADGETCONFIG         0x0008
+#define MPFS_TRACEERR_BADGETSTATUS         0x0009
+#define MPFS_TRACEERR_BADSETADDRESS        0x000a
+#define MPFS_TRACEERR_BADSETCONFIG         0x000b
+#define MPFS_TRACEERR_BADSETFEATURE        0x000c
+#define MPFS_TRACEERR_BINDFAILED           0x000d
+#define MPFS_TRACEERR_DISPATCHSTALL        0x000e
+#define MPFS_TRACEERR_EP0SETUPSTALLED      0x000f
+#define MPFS_TRACEERR_EPOUTNULLPACKET      0x0010
+#define MPFS_TRACEERR_INVALIDCTRLREQ       0x0011
+#define MPFS_TRACEERR_IRQREGISTRATION      0x0012
+#define MPFS_TRACEERR_TXCOMPERR            0x0013
+#define MPFS_TRACEERR_INVALID_EP0_STATE    0x0014
+
+/* USB trace interrupt codes */
+
+#define MPFS_TRACEINTID_INTERRUPT          0x0001
+#define MPFS_TRACEINTID_EP_TX_IRQ          0x0002
+#define MPFS_TRACEINTID_EP_RX_IRQ          0x0003
+#define MPFS_TRACEINTID_EP_RX_CSR          0x0004
+#define MPFS_TRACEINTID_EP_RX_COUNT        0x0005
+#define MPFS_TRACEINTID_EP_TX_CSR          0x0006
+#define MPFS_TRACEINTID_EP0_CSR0           0x0007
+#define MPFS_TRACEINTID_EP0_COUNT0         0x0008
+#define MPFS_TRACEINTID_EP0SETUPSETADDRESS 0x0009
+#define MPFS_TRACEINTID_GETSTATUS          0x000a
+#define MPFS_TRACEINTID_DEVGETSTATUS       0x000b
+#define MPFS_TRACEINTID_IFGETSTATUS        0x000c
+#define MPFS_TRACEINTID_CLEARFEATURE       0x000d
+#define MPFS_TRACEINTID_SETFEATURE         0x000e
+#define MPFS_TRACEINTID_GETCONFIG          0x000f
+#define MPFS_TRACEINTID_SETCONFIG          0x0010
+#define MPFS_TRACEINTID_GETSETIF           0x0011
+#define MPFS_TRACEINTID_SYNCHFRAME         0x0012
+#define MPFS_TRACEINTID_DISPATCH           0x0013
+#define MPFS_TRACEINTID_EP0_STALLSENT      0x0014
+#define MPFS_TRACEINTID_DATA_END           0x0015
+
+/* USB PMP configuration registers */
+
+#define MPFS_PMPCFG_USB_0    (MPFS_MPUCFG_BASE + 0x600)
+#define MPFS_PMPCFG_USB_1    (MPFS_MPUCFG_BASE + 0x608)
+#define MPFS_PMPCFG_USB_2    (MPFS_MPUCFG_BASE + 0x610)
+#define MPFS_PMPCFG_USB_3    (MPFS_MPUCFG_BASE + 0x618)
+
+/* IOMUX registers */
+
+#define MPFS_SYSREG_IOMUX3   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_IOMUX3_CR_OFFSET)
+#define MPFS_SYSREG_IOMUX4   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_IOMUX4_CR_OFFSET)
+
+#define MPFS_SYSREG_B2_CFG   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_CFG_CR)
+
+#define MPFS_SYSREG_B2_0_1   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_0_1_CR_OFFSET)
+#define MPFS_SYSREG_B2_2_3   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_2_3_CR_OFFSET)
+#define MPFS_SYSREG_B2_4_5   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_4_5_CR_OFFSET)
+#define MPFS_SYSREG_B2_6_7   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_6_7_CR_OFFSET)
+#define MPFS_SYSREG_B2_8_9   (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_8_9_CR_OFFSET)
+#define MPFS_SYSREG_B2_10_11 (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_10_11_CR_OFFSET)
+#define MPFS_SYSREG_B2_12_13  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_12_13_CR_OFFSET)
+#define MPFS_SYSREG_B2_14_15  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_14_15_CR_OFFSET)
+#define MPFS_SYSREG_B2_16_17  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_16_17_CR_OFFSET)
+#define MPFS_SYSREG_B2_18_19  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_18_19_CR_OFFSET)
+#define MPFS_SYSREG_B2_20_21  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_20_21_CR_OFFSET)
+#define MPFS_SYSREG_B2_22_23  (MPFS_SYSREG_BASE + \
+                              MPFS_SYSREG_MSSIO_BANK2_IO_CFG_22_23_CR_OFFSET)
+
+/* Reset and clock control registers */
+
+#define MPFS_SYSREG_SOFT_RESET_CR     (MPFS_SYSREG_BASE + \
+                                       MPFS_SYSREG_SOFT_RESET_CR_OFFSET)
+#define MPFS_SYSREG_SUBBLK_CLOCK_CR   (MPFS_SYSREG_BASE + \
+                                       MPFS_SYSREG_SUBBLK_CLOCK_CR_OFFSET)
+
+#ifdef CONFIG_ENDIAN_BIG
+#  define LSB 1
+#  define MSB 0
+#else
+#  define LSB 0
+#  define MSB 1
+#endif
+
+#define MPFS_NUM_USB_PKT      1
+#define MPFS_MIN_EP_FIFO_SIZE 8
+#define MPFS_USB_REG_MAX      0x2000
+
+/* Request queue operations *************************************************/
+
+#define mpfs_rqempty(q)      ((q)->head == NULL)
+#define mpfs_rqpeek(q)       ((q)->head)
+
+#define MPFS_EPSET_ALL             (0xff)    /* All endpoints */
+#define MPFS_EPSET_NOTEP0          (0xfe)    /* All endpoints except EP0 */
+#define MPFS_EP_BIT(ep)            (1 << (ep))
+#define MPFS_MAX_MULTIPACKET_SIZE  (0x3fff)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+enum mpfs_epstate_e
+{
+  USB_EPSTATE_DISABLED = 0, /* Endpoint is disabled */
+  USB_EPSTATE_STALLED,      /* Endpoint is stalled */
+  USB_EPSTATE_IDLE,         /* Endpoint is idle */
+  USB_EPSTATE_SENDING,      /* Endpoint is sending data */
+  USB_EPSTATE_RXSTOPPED,    /* EP is stopped waiting for a read request */
+  USB_EPSTATE_EP0DATAOUT,   /* Endpoint 0 is receiving SETUP OUT data */
+  USB_EPSTATE_EP0STATUSIN,  /* Endpoint 0 is sending SETUP status */
+  USB_EPSTATE_EP0ADDRESS    /* Address change is pending completion */
+};
+
+/* Device states */
+
+enum mpfs_devstate_e
+{
+  USB_DEVSTATE_SUSPENDED = 0, /* The device is currently suspended */
+  USB_DEVSTATE_POWERED,       /* Host is powered through the USB cable */
+  USB_DEVSTATE_DEFAULT,       /* Device has been reset */
+  USB_DEVSTATE_ADDRESSED,     /* The device has an address on the bus */
+  USB_DEVSTATE_CONFIGURED     /* A valid configuration has been selected. */
+};
+
+/* The result of EP0 SETUP */
+
+enum mpfs_ep0setup_e
+{
+  USB_EP0SETUP_SUCCESS = 0,   /* The SETUP was handled without incident */
+  USB_EP0SETUP_DISPATCHED,    /* The SETUP was forwarded */
+  USB_EP0SETUP_ADDRESS,       /* A new device address is pending */
+  USB_EP0SETUP_STALL          /* An error occurred */
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static int    mpfs_ep_configure(struct usbdev_ep_s *ep,
+                const struct usb_epdesc_s *desc, bool last);
+static int    mpfs_ep_disable(struct usbdev_ep_s *ep);
+static struct usbdev_req_s *
+              mpfs_ep_allocreq(struct usbdev_ep_s *ep);
+#ifdef CONFIG_USBDEV_DMA
+static void  *mpfs_ep_allocbuffer(struct usbdev_ep_s *ep, uint16_t nbytes);
+static void   mpfs_ep_freebuffer(struct usbdev_ep_s *ep, void *buf);
+#endif
+static void   mpfs_ep_freereq(struct usbdev_ep_s *ep,
+                struct usbdev_req_s *);
+static int    mpfs_ep_submit(struct usbdev_ep_s *ep,
+                struct usbdev_req_s *req);
+static int    mpfs_ep_cancel(struct usbdev_ep_s *ep,
+                struct usbdev_req_s *req);
+static int    mpfs_ep_stallresume(struct usbdev_ep_s *ep, bool resume);
+
+/* USB device controller operations */
+
+static struct usbdev_ep_s *
+              mpfs_allocep(struct usbdev_s *dev, uint8_t epno, bool in,
+                uint8_t eptype);
+static void   mpfs_freeep(struct usbdev_s *dev, struct usbdev_ep_s *ep);
+static int    mpfs_getframe(struct usbdev_s *dev);
+static int    mpfs_wakeup(struct usbdev_s *dev);
+static int    mpfs_selfpowered(struct usbdev_s *dev, bool selfpowered);
+static int    mpfs_pullup(struct usbdev_s *dev,  bool enable);
+
+/* Interrupt level processing */
+
+static void   mpfs_ep0_ctrlread(struct mpfs_usbdev_s *priv);
+static void   mpfs_ep0_wrstatus(struct mpfs_usbdev_s *priv,
+                const uint8_t *buffer, size_t buflen);

Review comment:
       Now I read the comments, I'll address the suggestions on a separate patch (as the request appears merged). Thanks for the suggestions.




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