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: svn://svn.code.sf.net/p/nuttx/code/trunk@4436 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-02-28 18:14:55 +00:00
parent 1ca0d8c144
commit f68d3a9b19
9 changed files with 406 additions and 12 deletions

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

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

@ -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
examples/cdcacm/Makefile Normal 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
examples/cdcacm/cdcacm.h Normal 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 */

@ -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;
}

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

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

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