Extend CDC/ACM driver so that can be connected/disconnected under software control; Add new NSH commands sercon and serdis that will connect and disconnect the CDC/ACM serial device

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4436 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo
2012-02-28 18:14:55 +00:00
parent 2ac7d84029
commit 56bcc7b105
16 changed files with 516 additions and 52 deletions
+2
View File
@@ -196,3 +196,5 @@
backspace or a DEL character as a backspace (i.e., deleting the character backspace or a DEL character as a backspace (i.e., deleting the character
to the left of the cursor). This makes NSH less dependent on particular to the left of the cursor). This makes NSH less dependent on particular
keyboard mappings of the Backspace key. Submitted by Mike Smith. keyboard mappings of the Backspace key. Submitted by Mike Smith.
* apps/examples/cdcacm: An example that illustrates how the CDC/ACM driver
may to connected and disconnected through software control.
+5 -5
View File
@@ -37,10 +37,10 @@
# Sub-directories # Sub-directories
SUBDIRS = adc buttons can composite dhcpd ftpc ftpd hello helloxx hidkbd \ SUBDIRS = adc buttons can cdcacm composite dhcpd ftpc ftpd hello helloxx \
igmp lcdrw mm mount nettest nsh null nx nxffs nxflat nxhello nximage \ hidkbd igmp lcdrw mm mount nettest nsh null nx nxffs nxflat nxhello \
nxlines nxtext ostest pashello pipe poll pwm qencoder rgmp romfs \ nximage nxlines nxtext ostest pashello pipe poll pwm qencoder rgmp \
serloop telnetd thttpd tiff touchscreen udp uip usbserial \ romfs serloop telnetd thttpd tiff touchscreen udp uip usbserial \
sendmail usbstorage usbterm wget wlan sendmail usbstorage usbterm wget wlan
# Sub-directories that might need context setup. Directories may need # Sub-directories that might need context setup. Directories may need
@@ -56,7 +56,7 @@ SUBDIRS = adc buttons can composite dhcpd ftpc ftpd hello helloxx hidkbd \
CNTXTDIRS = pwm CNTXTDIRS = pwm
ifeq ($(CONFIG_NSH_BUILTIN_APPS),y) ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
CNTXTDIRS += adc can composite ftpd dhcpd nettest qencoder telnetd CNTXTDIRS += adc can cdcacm composite ftpd dhcpd nettest qencoder telnetd
endif endif
ifeq ($(CONFIG_EXAMPLES_HELLOXX_BUILTIN),y) ifeq ($(CONFIG_EXAMPLES_HELLOXX_BUILTIN),y)
+22
View File
@@ -110,6 +110,28 @@ examples/can
built-in, the default is 32. Otherwise messages are sent and received built-in, the default is 32. Otherwise messages are sent and received
indefinitely. indefinitely.
examples/cdcacm
^^^^^^^^^^^^^^^
This very simple example shows how a USB CDC/ACM serial can be dynamically
connected and disconnected from a host. This example can only be used as
an NSH built-int command. If built-in, then two new NSH commands will be
supported:
1. sercon - Connect the CDC/ACM serial device
2. serdis - Disconnect the CDC/ACM serial device
Configuration prequisites (not complete):
CONFIG_USBDEV=y : USB device support must be enabled
CONFIG_CDCACM=y : The CDC/ACM driver must be built
CONFIG_NSH_BUILTIN_APPS : NSH built-in application support must be enabled
Configuration options specific to this example:
CONFIG_EXAMPLES_CDCACM_DEVMINOR : The minor number of the CDC/ACM device.
: i.e., the 'x' in /dev/ttyACMx
examples/composite examples/composite
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
+109
View File
@@ -0,0 +1,109 @@
############################################################################
# apps/examples/cdcacm/Makefile
#
# Copyright (C) 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# USB CDC/ACM serial mass storage example
ASRCS =
CSRCS = cdcacm_main.c
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ifeq ($(WINTOOL),y)
BIN = "${shell cygpath -w $(APPDIR)/libapps$(LIBEXT)}"
else
BIN = "$(APPDIR)/libapps$(LIBEXT)"
endif
ROOTDEPPATH = --dep-path .
# USB CDC/ACM built-in application info
APPNAME1 = sercon
PRIORITY1 = SCHED_PRIORITY_DEFAULT
STACKSIZE1 = 2048
APPNAME2 = serdis
PRIORITY2 = SCHED_PRIORITY_DEFAULT
STACKSIZE2 = 2048
# Common build
VPATH =
all: .built
.PHONY: context clean depend distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
.built: $(OBJS)
@( for obj in $(OBJS) ; do \
$(call ARCHIVE, $(BIN), $${obj}); \
done ; )
@touch .built
.context:
$(call REGISTER,$(APPNAME1),$(PRIORITY1),$(STACKSIZE1),$(APPNAME1)_main)
$(call REGISTER,$(APPNAME2),$(PRIORITY2),$(STACKSIZE2),$(APPNAME2)_main)
@touch $@
context: .context
.depend: Makefile $(SRCS)
@$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
@rm -f *.o *~ .*.swp .built
$(call CLEAN)
distclean: clean
@rm -f Make.dep .depend
-include Make.dep
+125
View File
@@ -0,0 +1,125 @@
/****************************************************************************
* examples/cdcacm/cdcacm.h
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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.
*
****************************************************************************/
#ifndef __EXAMPLES_CDCACM_CDCACM_H
#define __EXAMPLES_CDCACM_CDCACM_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdlib.h>
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
/* Prerequisites */
#ifndef CONFIG_USBDEV
# error "CONFIG_USBDEV is not defined"
#endif
#ifndef CONFIG_CDCACM
# error "CONFIG_CDCACM is not defined"
#endif
#ifndef CONFIG_NSH_BUILTIN_APPS
# error "This example can only be built as an NSH built-in application
#endif
/* Default configuration values */
#ifndef CONFIG_EXAMPLES_CDCACM_DEVMINOR
# define CONFIG_EXAMPLES_CDCACM_DEVMINOR 0
#endif
/* Debug ********************************************************************/
#ifdef CONFIG_CPP_HAVE_VARARGS
# ifdef CONFIG_DEBUG
# define message(...) lib_lowprintf(__VA_ARGS__)
# define msgflush()
# else
# define message(...) printf(__VA_ARGS__)
# define msgflush() fflush(stdout)
# endif
#else
# ifdef CONFIG_DEBUG
# define message lib_lowprintf
# define msgflush()
# else
# define message printf
# define msgflush() fflush(stdout)
# endif
#endif
/****************************************************************************
* Public Types
****************************************************************************/
/* All global variables used by this example are packed into a structure in
* order to avoid name collisions.
*/
struct cdcacm_state_s
{
/* This is the handle that references to this particular USB storage driver
* instance. It is only needed if the USB mass storage device example is
* built using CONFIG_NSH_BUILTIN_APPS. In this case, the value
* of the driver handle must be remembered between the 'sercon' and 'msdis'
* commands.
*/
FAR void *handle;
};
/****************************************************************************
* Public Data
****************************************************************************/
/* All global variables used by this example are packed into a structure in
* order to avoid name collisions.
*/
extern struct cdcacm_state_s g_cdcacm;
/****************************************************************************
* Public Functions
****************************************************************************/
#endif /* __EXAMPLES_CDCACM_CDCACM_H */
+136
View File
@@ -0,0 +1,136 @@
/****************************************************************************
* examples/cdcacm/cdcacm_main.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <sys/types.h>
#include <stdio.h>
#include <debug.h>
#include <nuttx/usb/usbdev.h>
#include <nuttx/usb/cdcacm.h>
#include "cdcacm.h"
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/* All global variables used by this example are packed into a structure in
* order to avoid name collisions.
*/
struct cdcacm_state_s g_cdcacm;
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* sercon_main
*
* Description:
* This is the main program that configures the CDC/ACM serial device.
*
****************************************************************************/
int sercon_main(int argc, char *argv[])
{
FAR void *handle;
int ret;
/* Check if there is a non-NULL USB mass storage device handle (meaning that the
* USB mass storage device is already configured).
*/
if (g_cdcacm.handle)
{
message("sercon:: ERROR: Already connected\n");
return EXIT_FAILURE;
}
/* Initialize the USB serial driver */
message("sercon: Registering CDC/ACM serial driver\n");
ret = cdcacm_initialize(CONFIG_EXAMPLES_CDCACM_DEVMINOR, &g_cdcacm.handle);
if (ret < 0)
{
message("sercon: ERROR: Failed to create the CDC/ACM serial device: %d\n", -ret);
return EXIT_FAILURE;
}
message("sercon: Successfully registered the CDC/ACM serial driver\n");
return EXIT_SUCCESS;
}
/****************************************************************************
* serdis_main
*
* Description:
* This is a program entry point that will disconnect the CDC/ACM serial
* device.
*
****************************************************************************/
int serdis_main(int argc, char *argv[])
{
/* First check if the USB mass storage device is already connected */
if (!g_cdcacm.handle)
{
message("serdis: ERROR: Not connected\n");
return EXIT_FAILURE;
}
/* Then disconnect the device and uninitialize the USB mass storage driver */
cdcacm_uninitialize(g_cdcacm.handle);
g_cdcacm.handle = NULL;
message("serdis: Disconnected\n");
return EXIT_SUCCESS;
}
+3 -3
View File
@@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* examples/usbserial/main.c * examples/usbserial/main.c
* *
* Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 2010-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@@ -216,7 +216,7 @@ int user_start(int argc, char *argv[])
message("user_start: Registering USB serial driver\n"); message("user_start: Registering USB serial driver\n");
#ifdef CONFIG_CDCACM #ifdef CONFIG_CDCACM
ret = cdcacm_initialize(0); ret = cdcacm_initialize(0, NULL);
#else #else
ret = usbdev_serialinitialize(0); ret = usbdev_serialinitialize(0);
#endif #endif
+2 -2
View File
@@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* examples/usbterm/usbterm.h * examples/usbterm/usbterm.h
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
+2 -2
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* examples/usbterm/usbterm_main.c * examples/usbterm/usbterm_main.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -199,7 +199,7 @@ int MAIN_NAME(int argc, char *argv[])
message(MAIN_STRING "Registering USB serial driver\n"); message(MAIN_STRING "Registering USB serial driver\n");
#ifdef CONFIG_CDCACM #ifdef CONFIG_CDCACM
ret = cdcacm_initialize(0); ret = cdcacm_initialize(0, NULL);
#else #else
ret = usbdev_serialinitialize(0); ret = usbdev_serialinitialize(0);
#endif #endif
+3
View File
@@ -2516,3 +2516,6 @@
related scripts and programs and could cause some short-term problems. related scripts and programs and could cause some short-term problems.
* configs/stm3240g-eval/, arch/arm/src/stm32/up_allocateheap.c: Add support * configs/stm3240g-eval/, arch/arm/src/stm32/up_allocateheap.c: Add support
for the 16-mbit SRAM on-board the STM3240G-EVAL board. for the 16-mbit SRAM on-board the STM3240G-EVAL board.
* drivers/usbdev/cdcacm.c and include/nuttx/usbdev/cdcacm.h: The CDC/ACM
driver can now be dynamically connected and disconnected from the host
under software control.
@@ -103,12 +103,12 @@
# warning "FSMC SRAM not included in the heap" # warning "FSMC SRAM not included in the heap"
# undef CONFIG_STM32_FSMC_SRAM # undef CONFIG_STM32_FSMC_SRAM
# elif CONFIG_MM_REGIONS > 2 # elif CONFIG_MM_REGIONS > 2
# error "CONFIG_MM_REGIONS > 2 but I don't know what any of the region(s) are" # error "CONFIG_MM_REGIONS > 2 but I don't know what some of the region(s) are"
# undef CONFIG_MM_REGIONS # undef CONFIG_MM_REGIONS
# define CONFIG_MM_REGIONS 2 # define CONFIG_MM_REGIONS 2
# endif # endif
# elif CONFIG_MM_REGIONS > 1 # elif CONFIG_MM_REGIONS > 1
# error "CONFIG_MM_REGIONS > 1 but I don't know what any of the region(s) are" # error "CONFIG_MM_REGIONS > 1 but I don't know what the other region(s) are"
# endif # endif
/* The STM32 F1 has not TCM SRAM */ /* The STM32 F1 has not TCM SRAM */
@@ -192,7 +192,7 @@
/* Configuration 3: CONFIG_MM_REGIONS should have been 2 */ /* Configuration 3: CONFIG_MM_REGIONS should have been 2 */
# error "CONFIG_MM_REGIONS > 2 but I don't know what any of the region(s) are" # error "CONFIG_MM_REGIONS > 2 but I don't know what some of the region(s) are"
# undef CONFIG_MM_REGIONS # undef CONFIG_MM_REGIONS
# define CONFIG_MM_REGIONS 2 # define CONFIG_MM_REGIONS 2
# else # else
@@ -205,7 +205,7 @@
# warning "TCM SRAM is included in the heap AND DMA is enabled" # warning "TCM SRAM is included in the heap AND DMA is enabled"
# endif # endif
# if CONFIG_MM_REGIONS != 3 # if CONFIG_MM_REGIONS != 3
# error "CONFIG_MM_REGIONS > 3 but I don't know what any of the region(s) are" # error "CONFIG_MM_REGIONS > 3 but I don't know what some of the region(s) are"
# undef CONFIG_MM_REGIONS # undef CONFIG_MM_REGIONS
# define CONFIG_MM_REGIONS 3 # define CONFIG_MM_REGIONS 3
# endif # endif
@@ -227,7 +227,7 @@
* should be disabled and CONFIG_MM_REGIONS should be 2. * should be disabled and CONFIG_MM_REGIONS should be 2.
*/ */
# ifdef (CONFIG_STM32_DMA) # ifdef CONFIG_STM32_DMA
# warning "TCM SRAM is included in the heap AND DMA is enabled" # warning "TCM SRAM is included in the heap AND DMA is enabled"
# endif # endif
# if CONFIG_MM_REGIONS < 2 # if CONFIG_MM_REGIONS < 2
@@ -235,7 +235,7 @@
# undef CONFIG_STM32_TCMEXCLUDE # undef CONFIG_STM32_TCMEXCLUDE
# define CONFIG_STM32_TCMEXCLUDE 1 # define CONFIG_STM32_TCMEXCLUDE 1
# elif CONFIG_MM_REGIONS > 2 # elif CONFIG_MM_REGIONS > 2
# error "CONFIG_MM_REGIONS > 2 but I don't know what any of the region(s) are" # error "CONFIG_MM_REGIONS > 2 but I don't know what some of the region(s) are"
# undef CONFIG_MM_REGIONS # undef CONFIG_MM_REGIONS
# define CONFIG_MM_REGIONS 2 # define CONFIG_MM_REGIONS 2
# endif # endif
@@ -246,7 +246,7 @@
/* If FSMC SRAM is going to be used as heap, then verify that the starting /* If FSMC SRAM is going to be used as heap, then verify that the starting
* address and size of the external SRAM region has been provided in the * address and size of the external SRAM region has been provided in the
* configuration. * configuration (as CONFIG_HEAP2_BASE and CONFIG_HEAP2_END).
*/ */
#ifdef CONFIG_STM32_FSMC_SRAM #ifdef CONFIG_STM32_FSMC_SRAM
@@ -304,10 +304,10 @@ void up_addregion(void)
mm_addregion((FAR void*)SRAM2_START, SRAM2_END-SRAM2_START); mm_addregion((FAR void*)SRAM2_START, SRAM2_END-SRAM2_START);
#endif #endif
/* Add the user specified heap region. */ /* Add the external FSMC SRAM heap region. */
#ifdef CONFIG_STM32_FSMC_SRAM #ifdef CONFIG_STM32_FSMC_SRAM
mm_addregion((FAR void*)CONFIG_HEAP2_BASE, CONFIG_HEAP2_END - CONFIG_HEAP2_BASE); mm_addregion((FAR void*)CONFIG_HEAP2_BASE, CONFIG_HEAP2_END - CONFIG_HEAP2_BASE);
# endif #endif
} }
#endif #endif
+5 -5
View File
@@ -417,8 +417,8 @@ in order to successfully build NuttX using the Atollic toolchain WITH FPU suppor
-CONFIG_STM32_ATOLLIC_LITE=n : Enable *one* the Atollic toolchains -CONFIG_STM32_ATOLLIC_LITE=n : Enable *one* the Atollic toolchains
CONFIG_STM32_ATOLLIC_PRO=n CONFIG_STM32_ATOLLIC_PRO=n
-CONFIG_STM32_ATOLLIC_LITE=y : The "Lite" version -CONFIG_STM32_ATOLLIC_LITE=y : The "Lite" version, OR
CONFIG_STM32_ATOLLIC_PRO=n : The "Pro" version CONFIG_STM32_ATOLLIC_PRO=y : The "Pro" version (not both)
-CONFIG_INTELHEX_BINARY=y : Suppress generation FLASH download formats -CONFIG_INTELHEX_BINARY=y : Suppress generation FLASH download formats
+CONFIG_INTELHEX_BINARY=n : (Only necessary with the "Lite" version) +CONFIG_INTELHEX_BINARY=n : (Only necessary with the "Lite" version)
@@ -998,8 +998,8 @@ Where <subdir> is one of the following:
-CONFIG_STM32_ATOLLIC_LITE=n : Enable *one* the Atollic toolchains -CONFIG_STM32_ATOLLIC_LITE=n : Enable *one* the Atollic toolchains
CONFIG_STM32_ATOLLIC_PRO=n CONFIG_STM32_ATOLLIC_PRO=n
-CONFIG_STM32_ATOLLIC_LITE=y : The "Lite" version -CONFIG_STM32_ATOLLIC_LITE=y : The "Lite" version, OR
CONFIG_STM32_ATOLLIC_PRO=n : The "Pro" version CONFIG_STM32_ATOLLIC_PRO=n : The "Pro" version (only one)
-CONFIG_INTELHEX_BINARY=y : Suppress generation FLASH download formats -CONFIG_INTELHEX_BINARY=y : Suppress generation FLASH download formats
+CONFIG_INTELHEX_BINARY=n : (Only necessary with the "Lite" version) +CONFIG_INTELHEX_BINARY=n : (Only necessary with the "Lite" version)
@@ -1013,7 +1013,7 @@ Where <subdir> is one of the following:
The FPU test also needs to know the size of the FPU registers save area in The FPU test also needs to know the size of the FPU registers save area in
bytes (see arch/arm/include/armv7-m/irq_lazyfpu.h): bytes (see arch/arm/include/armv7-m/irq_lazyfpu.h):
-CONFIG_EXAMPLES_OSTEST_FPUSIZE=(4*33) +CONFIG_EXAMPLES_OSTEST_FPUSIZE=(4*33)
telnetd: telnetd:
-------- --------
+57 -14
View File
@@ -94,6 +94,7 @@ struct cdcacm_dev_s
uint8_t config; /* Configuration number */ uint8_t config; /* Configuration number */
uint8_t nwrq; /* Number of queue write requests (in reqlist)*/ uint8_t nwrq; /* Number of queue write requests (in reqlist)*/
uint8_t nrdq; /* Number of queue read requests (in epbulkout) */ uint8_t nrdq; /* Number of queue read requests (in epbulkout) */
uint8_t minor; /* The device minor number */
bool rxenabled; /* true: UART RX "interrupts" enabled */ bool rxenabled; /* true: UART RX "interrupts" enabled */
int16_t rxhead; /* Working head; used when rx int disabled */ int16_t rxhead; /* Working head; used when rx int disabled */
@@ -1972,7 +1973,7 @@ static bool cdcuart_txempty(FAR struct uart_dev_s *dev)
* *
* Input Parameter: * Input Parameter:
* minor - Device minor number. E.g., minor 0 would correspond to * minor - Device minor number. E.g., minor 0 would correspond to
* /dev/ttyUSB0. * /dev/ttyACM0.
* classdev - The location to return the CDC serial class' device * classdev - The location to return the CDC serial class' device
* instance. * instance.
* *
@@ -1989,7 +1990,7 @@ int cdcacm_classobject(int minor, FAR struct usbdevclass_driver_s **classdev)
FAR struct cdcacm_alloc_s *alloc; FAR struct cdcacm_alloc_s *alloc;
FAR struct cdcacm_dev_s *priv; FAR struct cdcacm_dev_s *priv;
FAR struct cdcacm_driver_s *drvr; FAR struct cdcacm_driver_s *drvr;
char devname[16]; char devname[CDCACM_DEVNAME_SIZE];
int ret; int ret;
/* Allocate the structures needed */ /* Allocate the structures needed */
@@ -2011,6 +2012,8 @@ int cdcacm_classobject(int minor, FAR struct usbdevclass_driver_s **classdev)
memset(priv, 0, sizeof(struct cdcacm_dev_s)); memset(priv, 0, sizeof(struct cdcacm_dev_s));
sq_init(&priv->reqlist); sq_init(&priv->reqlist);
priv->minor = minor;
/* Fake line status */ /* Fake line status */
priv->linecoding.baud[0] = (115200) & 0xff; /* Baud=115200 */ priv->linecoding.baud[0] = (115200) & 0xff; /* Baud=115200 */
@@ -2052,11 +2055,11 @@ int cdcacm_classobject(int minor, FAR struct usbdevclass_driver_s **classdev)
} }
#endif #endif
/* Register the single port supported by this implementation */ /* Register the CDC/ACM TTY device */
sprintf(devname, "/dev/ttyUSB%d", minor); sprintf(devname, CDCACM_DEVNAME_FORMAT, minor);
ret = uart_register(devname, &priv->serdev); ret = uart_register(devname, &priv->serdev);
if (ret) if (ret < 0)
{ {
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_UARTREGISTER), (uint16_t)-ret); usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_UARTREGISTER), (uint16_t)-ret);
goto errout_with_class; goto errout_with_class;
@@ -2077,7 +2080,10 @@ errout_with_class:
* Register USB serial port (and USB serial console if so configured). * Register USB serial port (and USB serial console if so configured).
* *
* Input Parameter: * Input Parameter:
* Device minor number. E.g., minor 0 would correspond to /dev/ttyUSB0. * minor - Device minor number. E.g., minor 0 would correspond to
* /dev/ttyACM0.
* handle - An optional opaque reference to the CDC/ACM class object that
* may subsequently be used with cdcacm_uninitialize().
* *
* Returned Value: * Returned Value:
* Zero (OK) means that the driver was successfully registered. On any * Zero (OK) means that the driver was successfully registered. On any
@@ -2086,9 +2092,9 @@ errout_with_class:
****************************************************************************/ ****************************************************************************/
#ifndef CONFIG_CDCACM_COMPOSITE #ifndef CONFIG_CDCACM_COMPOSITE
int cdcacm_initialize(int minor) int cdcacm_initialize(int minor, FAR void **handle)
{ {
FAR struct usbdevclass_driver_s *drvr; FAR struct usbdevclass_driver_s *drvr = NULL;
int ret; int ret;
/* Get an instance of the serial driver class object */ /* Get an instance of the serial driver class object */
@@ -2104,6 +2110,16 @@ int cdcacm_initialize(int minor)
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_DEVREGISTER), (uint16_t)-ret); usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_DEVREGISTER), (uint16_t)-ret);
} }
} }
/* Return the driver instance (if any) if the caller has requested it
* by provided a pointer to the location to return it.
*/
if (handle)
{
*handle = (FAR void*)drvr;
}
return ret; return ret;
} }
#endif #endif
@@ -2112,10 +2128,20 @@ int cdcacm_initialize(int minor)
* Name: cdcacm_uninitialize * Name: cdcacm_uninitialize
* *
* Description: * Description:
* Un-initialize the USB storage class driver * Un-initialize the USB storage class driver. This function is used
* internally by the USB composite driver to unitialized the CDC/ACM
* driver. This same interface is available (with an untyped input
* parameter) when the CDC/ACM driver is used standalone.
* *
* Input Parameters: * Input Parameters:
* handle - The handle returned by a previous call to cdcacm_configure(). * There is one parameter, it differs in typing depending upon whether the
* CDC/ACM driver is an internal part of a composite device, or a standalone
* USB driver:
*
* classdev - The class object returned by board_cdcclassobject() or
* cdcacm_classobject()
* handle - The opaque handle represetning the class object returned by
* a previous call to cdcacm_initialize().
* *
* Returned Value: * Returned Value:
* None * None
@@ -2124,25 +2150,42 @@ int cdcacm_initialize(int minor)
#ifdef CONFIG_CDCACM_COMPOSITE #ifdef CONFIG_CDCACM_COMPOSITE
void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev) void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev)
#else
void cdcacm_uninitialize(FAR void *handle)
#endif
{ {
#ifdef CONFIG_CDCACM_COMPOSITE
FAR struct cdcacm_driver_s *drvr = (FAR struct cdcacm_driver_s *)classdev; FAR struct cdcacm_driver_s *drvr = (FAR struct cdcacm_driver_s *)classdev;
#else
FAR struct cdcacm_driver_s *drvr = (FAR struct cdcacm_driver_s *)handle;
#endif
FAR struct cdcacm_dev_s *priv = drvr->dev; FAR struct cdcacm_dev_s *priv = drvr->dev;
char devname[CDCACM_DEVNAME_SIZE];
int ret;
/* Un-register the CDC/ACM TTY device */
sprintf(devname, CDCACM_DEVNAME_FORMAT, priv->minor);
ret = unregister_driver(devname);
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_UARTUNREGISTER), (uint16_t)-ret);
}
/* Unbind the class (if still bound) */ /* Unbind the class (if still bound) */
if (priv->usbdev) if (priv->usbdev)
{ {
cdcacm_unbind(classdev, priv->usbdev); cdcacm_unbind(&drvr->drvr, priv->usbdev);
} }
/* Unregister the driver (unless we are a part of a composite device */ /* Unregister the driver (unless we are a part of a composite device) */
#ifndef CONFIG_CDCACM_COMPOSITE #ifndef CONFIG_CDCACM_COMPOSITE
usbdev_unregister(&alloc->drvr.drvr); usbdev_unregister(&drvr->drvr);
#endif #endif
/* And free the driver structure */ /* And free the driver structure */
kfree(priv); kfree(priv);
} }
#endif
+8
View File
@@ -222,6 +222,14 @@
#define CDCACM_EPINBULK_ADDR (USB_DIR_IN|CONFIG_CDCACM_EPBULKIN) #define CDCACM_EPINBULK_ADDR (USB_DIR_IN|CONFIG_CDCACM_EPBULKIN)
#define CDCACM_EPINBULK_ATTR (USB_EP_ATTR_XFER_BULK) #define CDCACM_EPINBULK_ATTR (USB_EP_ATTR_XFER_BULK)
/* Device driver definitions ************************************************/
/* A CDC/ACM device is specific by a minor number in the range of 0-255.
* This maps to a character device at /dev/ttyACMx, x=0..255.
*/
#define CDCACM_DEVNAME_FORMAT "/dev/ttyACM%d"
#define CDCACM_DEVNAME_SIZE 16
/* Misc Macros **************************************************************/ /* Misc Macros **************************************************************/
/* MIN/MAX macros */ /* MIN/MAX macros */
+20 -5
View File
@@ -344,7 +344,7 @@ EXTERN void board_cdcuninitialize(FAR struct usbdevclass_driver_s *classdev);
* *
* Input Parameter: * Input Parameter:
* minor - Device minor number. E.g., minor 0 would correspond to * minor - Device minor number. E.g., minor 0 would correspond to
* /dev/ttyUSB0. * /dev/ttyACM0.
* classdev - The location to return the CDC serial class' device * classdev - The location to return the CDC serial class' device
* instance. * instance.
* *
@@ -364,7 +364,10 @@ int cdcacm_classobject(int minor, FAR struct usbdevclass_driver_s **classdev);
* Register USB serial port (and USB serial console if so configured). * Register USB serial port (and USB serial console if so configured).
* *
* Input Parameter: * Input Parameter:
* Device minor number. E.g., minor 0 would correspond to /dev/ttyUSB0. * minor - Device minor number. E.g., minor 0 would correspond to
* /dev/ttyACM0.
* handle - An optional opaque reference to the CDC/ACM class object that
* may subsequently be used with cdcacm_uninitialize().
* *
* Returned Value: * Returned Value:
* Zero (OK) means that the driver was successfully registered. On any * Zero (OK) means that the driver was successfully registered. On any
@@ -373,17 +376,27 @@ int cdcacm_classobject(int minor, FAR struct usbdevclass_driver_s **classdev);
****************************************************************************/ ****************************************************************************/
#if !defined(CONFIG_USBDEV_COMPOSITE) || !defined(CONFIG_CDCACM_COMPOSITE) #if !defined(CONFIG_USBDEV_COMPOSITE) || !defined(CONFIG_CDCACM_COMPOSITE)
EXTERN int cdcacm_initialize(int minor); EXTERN int cdcacm_initialize(int minor, FAR void **handle);
#endif #endif
/**************************************************************************** /****************************************************************************
* Name: cdcacm_uninitialize * Name: cdcacm_uninitialize
* *
* Description: * Description:
* Un-initialize the USB storage class driver * Un-initialize the USB storage class driver. This function is used
* internally by the USB composite driver to unitialized the CDC/ACM
* driver. This same interface is available (with an untyped input
* parameter) when the CDC/ACM driver is used standalone.
* *
* Input Parameters: * Input Parameters:
* handle - The handle returned by a previous call to cdcacm_configure(). * There is one parameter, it differs in typing depending upon whether the
* CDC/ACM driver is an internal part of a composite device, or a standalone
* USB driver:
*
* classdev - The class object returned by board_cdcclassobject() or
* cdcacm_classobject()
* handle - The opaque handle represetning the class object returned by
* a previous call to cdcacm_initialize().
* *
* Returned Value: * Returned Value:
* None * None
@@ -392,6 +405,8 @@ EXTERN int cdcacm_initialize(int minor);
#if defined(CONFIG_USBDEV_COMPOSITE) && defined(CONFIG_CDCACM_COMPOSITE) #if defined(CONFIG_USBDEV_COMPOSITE) && defined(CONFIG_CDCACM_COMPOSITE)
EXTERN void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev); EXTERN void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev);
#else
EXTERN void cdcacm_uninitialize(FAR void *handle);
#endif #endif
#undef EXTERN #undef EXTERN
+8 -7
View File
@@ -215,13 +215,14 @@
#define USBSER_TRACEERR_SETUPNOTCONNECTED 0x0019 #define USBSER_TRACEERR_SETUPNOTCONNECTED 0x0019
#define USBSER_TRACEERR_SUBMITFAIL 0x001a #define USBSER_TRACEERR_SUBMITFAIL 0x001a
#define USBSER_TRACEERR_UARTREGISTER 0x001b #define USBSER_TRACEERR_UARTREGISTER 0x001b
#define USBSER_TRACEERR_UNSUPPORTEDCTRLREQ 0x001c #define USBSER_TRACEERR_UARTUNREGISTER 0x001c
#define USBSER_TRACEERR_UNSUPPORTEDCLASSREQ 0x001d #define USBSER_TRACEERR_UNSUPPORTEDCTRLREQ 0x001d
#define USBSER_TRACEERR_UNSUPPORTEDSTDREQ 0x001e #define USBSER_TRACEERR_UNSUPPORTEDCLASSREQ 0x001e
#define USBSER_TRACEERR_UNSUPPORTEDTYPE 0x001f #define USBSER_TRACEERR_UNSUPPORTEDSTDREQ 0x001f
#define USBSER_TRACEERR_WRALLOCREQ 0x0020 #define USBSER_TRACEERR_UNSUPPORTEDTYPE 0x0020
#define USBSER_TRACEERR_WRSHUTDOWN 0x0021 #define USBSER_TRACEERR_WRALLOCREQ 0x0021
#define USBSER_TRACEERR_WRUNEXPECTED 0x0022 #define USBSER_TRACEERR_WRSHUTDOWN 0x0022
#define USBSER_TRACEERR_WRUNEXPECTED 0x0023
/* USB Storage driver class events ******************************************/ /* USB Storage driver class events ******************************************/