From 237c0cca0984a541650ee60e5ea0d6af9ab1b06c Mon Sep 17 00:00:00 2001 From: Adam Feuer Date: Fri, 10 Jan 2020 07:13:37 -0300 Subject: [PATCH] CDC ECM Ethernet over USB High Speed for SAMA5D36-Xplained #68 Author: Alan Carvalho de Assis Run nxstyle against .c .h files and fix it Author: Adam Feuer Summary Adds CDC ECM Ethernet over USB High Speed for SAMA5D36-Xplained (and maybe other boards) (most of the code was there already, but didn't work out of the box for the SAMA5D36-Xplained) Only SAMA5D36-Xplained has been tested so far Impact None if you don't use the CDC ECM Ethernet driver On SAMA5D36-Xplained, this adds high-speed Internet connectivity over USB 2.0 High Speed. via the USB CDC ECM Gadget driver. It may work on other boards too. This also fixed full-speed (low-speed) mode for the board too. Limitations Hasn't been tested on anything other than SAMA5D36-Xplained board. TODO Ideally this would include a composite RNDIS device so it would also work seamlessly on Windows. That is for a future PR Ideally this would include software to help configuration via mDNS/DNS-SD for plug and play compatibility with Linux and macOS. That is for a future PR. Detail Only a few lines of C driver code needed to be changed, since the capability was there already. The rest is config and documentation. Changes the SAMA5D3-Xplained board bringup to match the SAMA5D3-EK board bringup A helper script to configure Linux routing and iptables NAT is also provided, along with documentation on how to use it. Testing Manual, on a Ubuntu Linux 19.10 system and MacOS 10.14.6 Mojave MacBook Pro. How To Verify Follow the new CDC ECM Ethernet over USB instructions in the board README.txt file Commits: remove non-UTF-8 chars in comment and reformat removed unneeded comment markers instructions for using the defconfigs removed EMAC from config - to prove this example only needs the CDC ECM Ethernet over USB to work added CDC-ECM Ethernet over USB info to README added U-Boot image added netusb helper script - this can configure the Linux network interface and routes so you can ping or access the NuttX system via TCP/IP. renamed defconfig dirs to be ethernet-over-usb - was usb-over-ethernet which is not right added USB DMA to defconfigs updated readme with autoboot and debugging info bringing ethernet-over-usb examples into parity added cdc ecm ethernet over usb with telnetd config added defconfig only use phy interrupt if netdevices is ethernet - because now netdevice could be CDC ECM ethernet over usb which has no PHY interrupt add bringup to Makefile add bringup app init cleanup init cdc ecm driver and rndis driver; some cleanup fixed some typos and odd characters usb over ethernet working over usb 2.0 hs --- arch/arm/src/sama5/sam_ehci.c | 12 +- boards/Kconfig | 2 +- boards/arm/sama5/sama5d3-xplained/README.txt | 117 +++++- boards/arm/sama5/sama5d3-xplained/boot/uImage | Bin 0 -> 212280 bytes .../ethernet-over-usb-telnetd/defconfig | 120 ++++++ .../configs/ethernet-over-usb/defconfig | 119 ++++++ .../sama5d3-xplained/helpers/netusb-up.sh | 35 ++ .../arm/sama5/sama5d3-xplained/src/Makefile | 1 + .../sama5/sama5d3-xplained/src/sam_appinit.c | 139 +------ .../sama5/sama5d3-xplained/src/sam_bringup.c | 368 ++++++++++++++++++ .../sama5d3-xplained/src/sama5d3-xplained.h | 16 +- drivers/usbdev/cdcecm.c | 15 +- 12 files changed, 795 insertions(+), 149 deletions(-) create mode 100755 boards/arm/sama5/sama5d3-xplained/boot/uImage create mode 100644 boards/arm/sama5/sama5d3-xplained/configs/ethernet-over-usb-telnetd/defconfig create mode 100644 boards/arm/sama5/sama5d3-xplained/configs/ethernet-over-usb/defconfig create mode 100755 boards/arm/sama5/sama5d3-xplained/helpers/netusb-up.sh create mode 100755 boards/arm/sama5/sama5d3-xplained/src/sam_bringup.c diff --git a/arch/arm/src/sama5/sam_ehci.c b/arch/arm/src/sama5/sam_ehci.c index 4d1ada715d1..b2b3050cca2 100644 --- a/arch/arm/src/sama5/sam_ehci.c +++ b/arch/arm/src/sama5/sam_ehci.c @@ -438,7 +438,7 @@ static int sam_reset(void); /**************************************************************************** * Private Data ****************************************************************************/ -/* In this driver implementation, support is provided for only a single a single +/* In this driver implementation, support is provided for only a single * USB device. All status information can be simply retained in a single global * instance. */ @@ -4924,18 +4924,18 @@ FAR struct usbhost_connection_s *sam_ehci_initialize(int controller) /* "In order to initialize the host controller, software should perform the * following steps: * - * • "Program the CTRLDSSEGMENT register with 4-Gigabyte segment where all + * - "Program the CTRLDSSEGMENT register with 4-Gigabyte segment where all * of the interface data structures are allocated. [64-bit mode] - * • "Write the appropriate value to the USBINTR register to enable the + * - "Write the appropriate value to the USBINTR register to enable the * appropriate interrupts. - * • "Write the base address of the Periodic Frame List to the PERIODICLIST + * - "Write the base address of the Periodic Frame List to the PERIODICLIST * BASE register. If there are no work items in the periodic schedule, * all elements of the Periodic Frame List should have their T-Bits set * to a one. - * • "Write the USBCMD register to set the desired interrupt threshold, + * - "Write the USBCMD register to set the desired interrupt threshold, * frame list size (if applicable) and turn the host controller ON via * setting the Run/Stop bit. - * • Write a 1 to CONFIGFLAG register to route all ports to the EHCI controller + * - Write a 1 to CONFIGFLAG register to route all ports to the EHCI controller * ... * * "At this point, the host controller is up and running and the port registers diff --git a/boards/Kconfig b/boards/Kconfig index aed15fd802d..fc2bf68c05d 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -1300,7 +1300,7 @@ config ARCH_BOARD_SAMA5D3_XPLAINED select ARCH_HAVE_LEDS select ARCH_HAVE_BUTTONS select ARCH_HAVE_IRQBUTTONS - select ARCH_PHY_INTERRUPT if NETDEVICES + select ARCH_PHY_INTERRUPT if NETDEVICES && (SAMA5_EMACA || SAMA5_EMAC0 || SAMA5_EMAC1 || SAMA5_GMAC) ---help--- The port of NuttX to the Atmel SAMA5D3 Xplained development board. diff --git a/boards/arm/sama5/sama5d3-xplained/README.txt b/boards/arm/sama5/sama5d3-xplained/README.txt index 24daaebbca9..1273b4aec84 100644 --- a/boards/arm/sama5/sama5d3-xplained/README.txt +++ b/boards/arm/sama5/sama5d3-xplained/README.txt @@ -90,7 +90,7 @@ Development Environment Several possible development environments may be used: - Linux or macOS native - - Cygwin unders Windows + - Cygwin under Windows - MinGW + MSYS under Windows - Windows native (with GNUMake from GNUWin32). @@ -278,7 +278,14 @@ Loading Code into SRAM with J-Link (gdb) target remote localhost:2331 (gdb) mon reset (gdb) load nuttx - (gdb) ... start debugging ... + (gdb) breakpoint nsh_main + (gdb) continue + Continuing. + + Breakpoint 1, nsh_main (argc=1, argv=0x2007757c) at nsh_main.c:218 + 218 sched_getparam(0, ¶m); + (gdb) continue + (gdb) ... debugging ... Loading code using J-Link Commander ---------------------------------- @@ -578,6 +585,28 @@ Load NuttX with U-Boot on AT91 boards NuttShell (NSH) NuttX-7.2 nsh> + It is possible to autoboot from the SD Card: + + 1. Format an SD Card as FAT. + 2. Copy the file nuttx/boards/arm/sama5/sama5d3-xplained/boot/uImage file to the SD Card. + 3. Copy the file nuttx.bin you just compiled to the SD Card. + 4. Attach a 3.3V USB-serial adapter to the DEBUG console port. + 5. Open a serial terminal to the debug console. In Linux, do this: + + picocom -b 115200 /dev/ttyUSB0 + + 6. Press the RESET button. You should see a U-Boot prompt. Press a key to stop the booting process. + 7. Issue the following commands to U-Boot: + + U-Boot> setenv load_nuttx 'fatload mmc 0 0x20008000 nuttx.bin' + U-Boot> setenv run_nuttx 'go 0x20008040' + U-Boot> setenv boot_nuttx 'run load_nuttx; run run_nuttx' + U-Boot> setenv bootcmd 'boot_nuttx' + U-Boot> saveenv + U-Boot> reset + + 8. The board should now always boot to NuttX if you have the SD Card inserted. + Loading through network On a development system, it is useful to get the kernel and root file @@ -1349,6 +1378,90 @@ USB High-Speed Device Application Configuration -> Examples: CONFIG_SYSTEM_CDCACM=y : Enable an CDC/ACM example + CDC/ECM Ethernet Over USB + ------------------------- + + This will select the CDC/ECM Ethernet over USB device. Defaults for the other + options should be okay. + + CONFIG_NET_CDCECM=y + CONFIG_CDCECM_EP0MAXPACKET=64 + CONFIG_CDCECM_EPINTIN=1 + CONFIG_CDCECM_EPINTIN_FSSIZE=16 + CONFIG_CDCECM_EPINTIN_HSSIZE=16 + CONFIG_CDCECM_EPBULKOUT=5 + CONFIG_CDCECM_EPBULKOUT_FSSIZE=64 + CONFIG_CDCECM_EPBULKOUT_HSSIZE=512 # needed for non-fragmentation IP and ICMP packets in HS mode + CONFIG_CDCECM_EPBULKIN=2 + CONFIG_CDCECM_EPBULKIN_FSSIZE=64 + CONFIG_CDCECM_EPBULKIN_HSSIZE=512 # needed for non-fragmentation IP and ICMP packets in HS mode + CONFIG_CDCECM_VENDORID=0x0525 + CONFIG_CDCECM_PRODUCTID=0xa4a2 + CONFIG_CDCECM_VENDORSTR="NuttX" + CONFIG_CDCECM_PRODUCTSTR="CDC/ECM Ethernet" + + There are two defconfig files that have been tested with these configurations: + + ethernet-over-usb/defconfig + ethernet-over-usb-telnetd/defconfig + + The latter has a telnetd enabled, so once the system boots, you can issue the telnetd command, + and then telnet into it from the host. + + To use them, copy them to .config, and run 'make menuconfig' (you don't have to change anything), + then save the file. Then run 'make' to make NuttX. + + On Linux, a helper script is provided called helpers/netusb-up.sh. This script can be used + to configure the Linux USB Ethernet Gadget network interface. Once you boot a NuttX system with the + CDC ECM Ethernet over USB device, the Linux network interface will be added to your system. You should + see something like the following messages in /var/log/kern.log: + + [302074.552879] usb 1-2: new high-speed USB device number 107 using ehci-pci + [302074.718264] usb 1-2: New USB device found, idVendor=0525, idProduct=a4a2, bcdDevice= 1.00 + [302074.718267] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 + [302074.718269] usb 1-2: Product: CDC/ECM Ethernet + [302074.718271] usb 1-2: Manufacturer: NuttX + [302074.718272] usb 1-2: SerialNumber: 0 + [302074.760638] cdc_ether 1-2:1.0 usb0: register 'cdc_ether' at usb-0000:02:03.0-2, CDC Ethernet Device, 02:00:00:11:22:33 + [302074.796215] cdc_ether 1-2:1.0 ens35u2: renamed from usb0 + + If you execute the command 'ifconfig -a' you should see a new interface: + + $ ifconfig -a + + ens35u2: flags=4098 mtu 576 + ether 02:00:00:11:22:33 txqueuelen 1000 (Ethernet) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + + If you run the netusb-up.sh script, then do ifconfig, you should see the following: + + $ sudo ./netusb-up.sh + $ ifconfig -a + + ens35u2: flags=4163 mtu 576 + ether 02:00:00:11:22:33 txqueuelen 1000 (Ethernet) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 15 bytes 2477 (2.4 KB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + + ens35u2:0: flags=4163 mtu 576 + inet 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 + ether 02:00:00:11:22:33 txqueuelen 1000 (Ethernet) + + Now that the new interface has an IP address, you can ping the NuttX box at 10.0.0.2 + (or whatever IP address you configured it to have). If you used the telnet defconfig, + you should be able to telnet to the board using: + + $ telnet 10.0.0.2 + + The helper script also sets up Network Address Translation (NAT) so the NuttX system + can access the Internet. If that is not what you want, you can remove the iptables + NAT commands from the script. + Debugging USB Device -------------------- diff --git a/boards/arm/sama5/sama5d3-xplained/boot/uImage b/boards/arm/sama5/sama5d3-xplained/boot/uImage new file mode 100755 index 0000000000000000000000000000000000000000..910d93407d1af801863db436a9e396912824a22e GIT binary patch literal 212280 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 XjAbOCs0A7yqjoEv>Z)m&C<{Ih8hO+E= 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 + * + * 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 + +#include + +#include +#include +#include +#include + +#ifdef CONFIG_USBMONITOR +# include +#endif + +#include +#include + +#include "sam_twi.h" +#include "sama5d3-xplained.h" + +#ifdef HAVE_ROMFS +# include +#endif + +#ifdef CONFIG_NET_CDCECM +# include +# include +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define NSECTORS(n) \ + (((n)+CONFIG_SAMA5D4EK_ROMFS_ROMDISK_SECTSIZE-1) / \ + CONFIG_SAMA5D4EK_ROMFS_ROMDISK_SECTSIZE) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sam_i2c_register + * + * Description: + * Register one I2C drivers for the I2C tool. + * + ****************************************************************************/ + +#ifdef HAVE_I2CTOOL +static void sam_i2c_register(int bus) +{ + FAR struct i2c_master_s *i2c; + int ret; + + i2c = sam_i2cbus_initialize(bus); + if (i2c == NULL) + { + _err("ERROR: Failed to get I2C%d interface\n", bus); + } + else + { + ret = i2c_register(i2c, bus); + if (ret < 0) + { + _err("ERROR: Failed to register I2C%d driver: %d\n", bus, ret); + sam_i2cbus_uninitialize(i2c); + } + } +} +#endif + +/**************************************************************************** + * Name: sam_i2ctool + * + * Description: + * Register I2C drivers for the I2C tool. + * + ****************************************************************************/ + +#ifdef HAVE_I2CTOOL +static void sam_i2ctool(void) +{ +#ifdef CONFIG_SAMA5_TWI0 + sam_i2c_register(0); +#endif +#ifdef CONFIG_SAMA5_TWI1 + sam_i2c_register(1); +#endif +#ifdef CONFIG_SAMA5_TWI2 + sam_i2c_register(2); +#endif +#ifdef CONFIG_SAMA5_TWI3 + sam_i2c_register(3); +#endif +} +#else +# define sam_i2ctool() +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sam_bringup + * + * Description: + * Bring up board features + * + ****************************************************************************/ + +int sam_bringup(void) +{ + int ret; + + /* Register I2C drivers on behalf of the I2C tool */ + + sam_i2ctool(); + +#ifdef HAVE_HSMCI +#ifdef CONFIG_SAMA5_HSMCI0 + /* Initialize the HSMCI0 driver */ + + ret = sam_hsmci_initialize(HSMCI0_SLOTNO, HSMCI0_MINOR); + if (ret < 0) + { + _err("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n", + HSMCI0_SLOTNO, HSMCI0_MINOR, ret); + } + +#ifdef CONFIG_SAMA5D4EK_HSMCI0_MOUNT + else + { + /* REVISIT: + * A delay seems to be required here or the mount will fail. + */ + + /* Mount the volume on HSMCI0 */ + + ret = mount(CONFIG_SAMA5D4EK_HSMCI0_MOUNT_BLKDEV, + CONFIG_SAMA5D4EK_HSMCI0_MOUNT_MOUNTPOINT, + CONFIG_SAMA5D4EK_HSMCI0_MOUNT_FSTYPE, + 0, NULL); + + if (ret < 0) + { + _err("ERROR: Failed to mount %s: %d\n", + CONFIG_SAMA5D4EK_HSMCI0_MOUNT_MOUNTPOINT, errno); + } + } +#endif +#endif + +#ifdef CONFIG_SAMA5_HSMCI1 + /* Initialize the HSMCI1 driver */ + + ret = sam_hsmci_initialize(HSMCI1_SLOTNO, HSMCI1_MINOR); + if (ret < 0) + { + _err("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n", + HSMCI1_SLOTNO, HSMCI1_MINOR, ret); + } + +#ifdef CONFIG_SAMA5D4EK_HSMCI1_MOUNT + else + { + /* REVISIT: A delay seems to be required here or the mount will fail. */ + + /* Mount the volume on HSMCI1 */ + + ret = mount(CONFIG_SAMA5D4EK_HSMCI1_MOUNT_BLKDEV, + CONFIG_SAMA5D4EK_HSMCI1_MOUNT_MOUNTPOINT, + CONFIG_SAMA5D4EK_HSMCI1_MOUNT_FSTYPE, + 0, NULL); + + if (ret < 0) + { + _err("ERROR: Failed to mount %s: %d\n", + CONFIG_SAMA5D4EK_HSMCI1_MOUNT_MOUNTPOINT, errno); + } + } +#endif +#endif +#endif + +#ifdef HAVE_AUTOMOUNTER + /* Initialize the auto-mounter */ + + sam_automount_initialize(); +#endif + +#ifdef HAVE_ROMFS + /* Create a ROM disk for the /etc filesystem */ + + ret = romdisk_register(CONFIG_SAMA5D4EK_ROMFS_ROMDISK_MINOR, romfs_img, + NSECTORS(romfs_img_len), + CONFIG_SAMA5D4EK_ROMFS_ROMDISK_SECTSIZE); + if (ret < 0) + { + _err("ERROR: romdisk_register failed: %d\n", -ret); + } + else + { + /* Mount the file system */ + + ret = mount(CONFIG_SAMA5D4EK_ROMFS_ROMDISK_DEVNAME, + CONFIG_SAMA5D4EK_ROMFS_MOUNT_MOUNTPOINT, + "romfs", MS_RDONLY, NULL); + if (ret < 0) + { + _err("ERROR: mount(%s,%s,romfs) failed: %d\n", + CONFIG_SAMA5D4EK_ROMFS_ROMDISK_DEVNAME, + CONFIG_SAMA5D4EK_ROMFS_MOUNT_MOUNTPOINT, errno); + } + } +#endif + +#ifdef HAVE_USBHOST + /* Initialize USB host operation. sam_usbhost_initialize() starts a thread + * will monitor for USB connection and disconnection events. + */ + + ret = sam_usbhost_initialize(); + if (ret != OK) + { + _err("ERROR: Failed to initialize USB host: %d\n", ret); + } +#endif + +#ifdef HAVE_USBMONITOR + /* Start the USB Monitor */ + + ret = usbmonitor_start(); + if (ret != OK) + { + _err("ERROR: Failed to start the USB monitor: %d\n", ret); + } +#endif + +#ifdef HAVE_MAXTOUCH + /* Initialize the touchscreen */ + + ret = sam_tsc_setup(0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: sam_tsc_setup failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_PWM + /* Initialize PWM and register the PWM device. */ + + ret = sam_pwm_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: sam_pwm_setup() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_ADC + /* Initialize ADC and register the ADC driver. */ + + ret = sam_adc_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: sam_adc_setup failed: %d\n", ret); + } +#endif + +#ifdef HAVE_WM8904 + /* Configure WM8904 audio */ + + ret = sam_wm8904_initialize(0); + if (ret != OK) + { + _err("ERROR: Failed to initialize WM8904 audio: %d\n", ret); + } +#endif + +#ifdef HAVE_AUDIO_NULL + /* Configure the NULL audio device */ + + ret = sam_audio_null_initialize(0); + if (ret != OK) + { + _err("ERROR: Failed to initialize the NULL audio device: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = mount(NULL, SAMA5_PROCFS_MOUNTPOINT, "procfs", 0, NULL); + if (ret < 0) + { + _err("ERROR: Failed to mount procfs at %s: %d\n", + SAMA5_PROCFS_MOUNTPOINT, ret); + } +#endif + +#if defined(CONFIG_RNDIS) + /* Set up a MAC address for the RNDIS device. */ + + 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 + +#ifdef CONFIG_NET_CDCECM + ret = cdcecm_initialize(0, NULL); + if (ret < 0) + { + _err("ERROR: cdcecm_initialize() failed: %d\n", ret); + } +#endif + + /* If we got here then perhaps not all initialization was successful, but + * at least enough succeeded to bring-up NSH with perhaps reduced + * capabilities. + */ + + UNUSED(ret); + return OK; +} diff --git a/boards/arm/sama5/sama5d3-xplained/src/sama5d3-xplained.h b/boards/arm/sama5/sama5d3-xplained/src/sama5d3-xplained.h index cf9cb49c1c4..b0cf5a612e5 100644 --- a/boards/arm/sama5/sama5d3-xplained/src/sama5d3-xplained.h +++ b/boards/arm/sama5/sama5d3-xplained/src/sama5d3-xplained.h @@ -480,9 +480,9 @@ * KSZ9021/31) operating at 10/100/1000 Mbps. * The board supports RGMII interface mode. * The Ethernet interface consists of 4 pairs of low voltage differential - * pair signals designated from GRX± and GTx± plus control signals for link - * activity indicators. These signals can be used to connect to a - * 10/100/1000 BaseT RJ45 connector integrated on the main board. + * pair signals designated from TXRXP_A/TXRXM_A to TXRXP_D/TXRXM_D plus control + * signals for link activity indicators. These signals can be used to connect + * to a 10/100/1000 BaseT RJ45 connector integrated on the main board. * * The KSZ9021/31 interrupt is available on PB35 INT_GETH0. The sense of * the interrupt is configurable but is, by default, active low. @@ -803,5 +803,15 @@ int sam_can_setup(void); void weak_function sam_netinitialize(void); #endif +/**************************************************************************** + * Name: sam_bringup + * + * Description: + * Bring up board features + * + ****************************************************************************/ + +int sam_bringup(void); + #endif /* __ASSEMBLY__ */ #endif /* __BOARDS_ARM_SAMA5_SAMA5D3_XPLAINED_SRC_SAMA5D3_XPLAINED_H */ diff --git a/drivers/usbdev/cdcecm.c b/drivers/usbdev/cdcecm.c index 8c0d4f3f577..a19ab5f5c47 100644 --- a/drivers/usbdev/cdcecm.c +++ b/drivers/usbdev/cdcecm.c @@ -1299,7 +1299,8 @@ static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config) self->epint->priv = self; - cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, &epdesc, &self->devinfo, false); + bool is_high_speed = (self->usbdev.speed == USB_SPEED_HIGH); + cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, &epdesc, &self->devinfo, is_high_speed); ret = EP_CONFIGURE(self->epbulkin, &epdesc, false); if (ret < 0) @@ -1309,7 +1310,7 @@ static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config) self->epbulkin->priv = self; - cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, &epdesc, &self->devinfo, false); + cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, &epdesc, &self->devinfo, is_high_speed); ret = EP_CONFIGURE(self->epbulkout, &epdesc, true); if (ret < 0) @@ -1697,11 +1698,17 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, len += USB_SIZEOF_IFDESC; + #ifdef CONFIG_USBDEV_DUALSPEED + bool is_high_speed = USB_SPEED_HIGH; + #else + bool is_high_speed = USB_SPEED_LOW; + #endif + if (desc) { FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc; - cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, false); + cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, is_high_speed); desc += USB_SIZEOF_EPDESC; } @@ -1711,7 +1718,7 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, { FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc; - cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, false); + cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, is_high_speed); desc += USB_SIZEOF_EPDESC; }