diff --git a/arch/arm/src/cxd56xx/cxd56_usbdev.c b/arch/arm/src/cxd56xx/cxd56_usbdev.c index 418665e1f6..07f93a6b8d 100644 --- a/arch/arm/src/cxd56xx/cxd56_usbdev.c +++ b/arch/arm/src/cxd56xx/cxd56_usbdev.c @@ -104,7 +104,7 @@ #endif #ifndef CONFIG_USBDEV_SETUP_MAXDATASIZE -# define CONFIG_USBDEV_SETUP_MAXDATASIZE CONFIG_USBDEV_EP0_MAXSIZE +# define CONFIG_USBDEV_SETUP_MAXDATASIZE (CONFIG_USBDEV_EP0_MAXSIZE * 4) #endif #define CONFIG_DEFAULT_PHY_CFG0 \ @@ -386,6 +386,7 @@ struct cxd56_usbdev_s uint8_t ep0data[CONFIG_USBDEV_SETUP_MAXDATASIZE]; uint16_t ep0datlen; + uint16_t ep0reqlen; /* The endpoint list */ @@ -1269,6 +1270,8 @@ static inline void cxd56_ep0setup(FAR struct cxd56_usbdev_s *priv) value = GETUINT16(priv->ctrl.value); len = GETUINT16(priv->ctrl.len); + priv->ep0reqlen = len; + uinfo("type=%02x req=%02x value=%04x index=%04x len=%04x\n", priv->ctrl.type, priv->ctrl.req, value, index, len); @@ -1525,6 +1528,7 @@ static int cxd56_epinterrupt(int irq, FAR void *context) uint32_t eps; uint32_t stat; uint32_t ctrl; + uint16_t len; int n; eps = getreg32(CXD56_USB_DEV_EP_INTR); @@ -1670,33 +1674,49 @@ static int cxd56_epinterrupt(int irq, FAR void *context) putreg32(USB_INT_OUT_DATA, CXD56_USB_OUT_EP_STATUS(n)); if (n == 0) { - priv->ep0datlen = g_ep0out.status & DESC_SIZE_MASK; + len = g_ep0out.status & DESC_SIZE_MASK; /* Reset DMA descriptor for next packet */ g_ep0out.status = privep->ep.maxpacket | DESC_LAST; - /* Ready to receive the next SETUP packet */ - - ctrl = getreg32(CXD56_USB_OUT_EP_CONTROL(0)); - putreg32(ctrl | USB_SNAK | USB_RRDY, - CXD56_USB_OUT_EP_CONTROL(0)); - - /* Dispatch setup packet and out transaction */ - - if (priv->ep0datlen > 0) + if (0 < len) { - memcpy(priv->ep0data, (const void *)g_ep0out.buf, - priv->ep0datlen); + ASSERT(priv->ep0datlen + len <= sizeof(priv->ep0data)); + memcpy(priv->ep0data + priv->ep0datlen, + (const void *)g_ep0out.buf, + len); + + priv->ep0datlen += len; + } + + /* Dispatch to cxd56_ep0setup if received all OUT data */ + + if (priv->ep0datlen == priv->ep0reqlen) + { if (((priv->ctrl.type & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) && USB_REQ_ISOUT(priv->ctrl.type)) { + /* Ready to receive the next setup packet */ + + ctrl = getreg32(CXD56_USB_OUT_EP_CONTROL(0)); + putreg32(ctrl | USB_SNAK | USB_RRDY, + CXD56_USB_OUT_EP_CONTROL(0)); + cxd56_ep0setup(priv); priv->ep0datlen = 0; } } + else + { + /* Ready to receive the next OUT packet */ + + ctrl = getreg32(CXD56_USB_OUT_EP_CONTROL(0)); + putreg32(ctrl | USB_CNAK | USB_RRDY, + CXD56_USB_OUT_EP_CONTROL(0)); + } } else { diff --git a/configs/spresense/rndis/defconfig b/configs/spresense/rndis/defconfig new file mode 100644 index 0000000000..028d8710c3 --- /dev/null +++ b/configs/spresense/rndis/defconfig @@ -0,0 +1,97 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_STANDARD_SERIAL is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="spresense" +CONFIG_ARCH_BOARD_SPRESENSE=y +CONFIG_ARCH_CHIP_CXD56XX=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARDCTL_USBDEVCTRL=y +CONFIG_BOARD_LOOPSPERMSEC=5434 +CONFIG_BOOT_RUNFROMISRAM=y +CONFIG_BUILTIN=y +CONFIG_CLOCK_MONOTONIC=y +CONFIG_CODECS_HASH_MD5=y +CONFIG_CXD56_SDIO=y +CONFIG_CXD56_USBDEV=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_WEBSERVER=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_MAXFNAME=64 +CONFIG_FS_FAT=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_I2C=y +CONFIG_MAX_TASKS=16 +CONFIG_MAX_WDOGPARMS=2 +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDEVICES=y +CONFIG_NETINIT_MACADDR_1=0xdeadbeff +CONFIG_NETINIT_NOMAC=y +CONFIG_NETINIT_THREAD=y +CONFIG_NETUTILS_CODECS=y +CONFIG_NETUTILS_DHCPC=y +CONFIG_NETUTILS_TELNETD=y +CONFIG_NETUTILS_WEBCLIENT=y +CONFIG_NETUTILS_WEBSERVER=y +CONFIG_NET_ARP_SEND=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1500 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_LOOPBACK=y +CONFIG_NET_PKT=y +CONFIG_NET_ROUTE=y +CONFIG_NET_STATISTICS=y +CONFIG_NET_TCP=y +CONFIG_NET_UDP=y +CONFIG_NET_UDP_BINDTODEVICE=y +CONFIG_NFILE_DESCRIPTORS=8 +CONFIG_NFILE_STREAMS=8 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_READLINE=y +CONFIG_NSH_TELNETD_CLIENTSTACKSIZE=3072 +CONFIG_NSH_WGET_USERAGENT="NuttX/7.2x.x (; http://www.nuttx.org/)" +CONFIG_PREALLOC_MQ_MSGS=4 +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PREALLOC_WDOGS=16 +CONFIG_RAM_SIZE=1572864 +CONFIG_RAM_START=0x0d000000 +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RNDIS=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SPI=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NSH_CXXINITIALIZE=y +CONFIG_SYSTEM_PING=y +CONFIG_TELNET_CHARACTER_MODE=y +CONFIG_UART1_SERIAL_CONSOLE=y +CONFIG_USBDEV=y +CONFIG_USBDEV_DMA=y +CONFIG_USBDEV_DUALSPEED=y +CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/configs/spresense/src/Makefile b/configs/spresense/src/Makefile index eedd0c9700..225b1c18ca 100644 --- a/configs/spresense/src/Makefile +++ b/configs/spresense/src/Makefile @@ -68,4 +68,8 @@ ifeq ($(CONFIG_USBMSC),y) CSRCS += cxd56_usbmsc.c endif +ifeq ($(CONFIG_NETDEVICES),y) +CSRCS += cxd56_netinit.c +endif + include $(TOPDIR)/configs/Board.mk diff --git a/configs/spresense/src/cxd56_bringup.c b/configs/spresense/src/cxd56_bringup.c index 12a98f6599..fa02aacfd2 100644 --- a/configs/spresense/src/cxd56_bringup.c +++ b/configs/spresense/src/cxd56_bringup.c @@ -48,6 +48,10 @@ #include #include +#ifdef CONFIG_RNDIS +#include +#endif + #include #include "chip.h" @@ -234,5 +238,16 @@ int cxd56_bringup(void) up_pm_release_wakelock(&wlock); +#if defined(CONFIG_RNDIS) + uint8_t mac[6]; + mac[0] = 0xa0; /* TODO */ + mac[1] = (CONFIG_NETINIT_MACADDR_2 >> (8 * 0)) & 0xff; + mac[2] = (CONFIG_NETINIT_MACADDR_1 >> (8 * 3)) & 0xff; + mac[3] = (CONFIG_NETINIT_MACADDR_1 >> (8 * 2)) & 0xff; + mac[4] = (CONFIG_NETINIT_MACADDR_1 >> (8 * 1)) & 0xff; + mac[5] = (CONFIG_NETINIT_MACADDR_1 >> (8 * 0)) & 0xff; + usbdev_rndis_initialize(mac); +#endif + return 0; } diff --git a/configs/spresense/src/cxd56_netinit.c b/configs/spresense/src/cxd56_netinit.c new file mode 100644 index 0000000000..b9f0d13a04 --- /dev/null +++ b/configs/spresense/src/cxd56_netinit.c @@ -0,0 +1,55 @@ +/**************************************************************************** + * configs/spresense/src/cxd56_netinit.c + * + * Copyright 2019 Sony Home Entertainment & Sound Products Inc. + * Author: Masayuki Ishikawa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_netinitialize + ****************************************************************************/ + +#if defined(CONFIG_NET) && !defined(CONFIG_NETDEV_LATEINIT) +void up_netinitialize(void) +{ +} +#endif +