A little more work (but not much progress) on the PIC32 USB device driver

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4440 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-02-29 21:53:28 +00:00
parent fafd67fe82
commit f6004b3260
8 changed files with 113 additions and 18 deletions

View File

@ -132,6 +132,28 @@ examples/cdcacm
CONFIG_EXAMPLES_CDCACM_DEVMINOR : The minor number of the CDC/ACM device. CONFIG_EXAMPLES_CDCACM_DEVMINOR : The minor number of the CDC/ACM device.
: i.e., the 'x' in /dev/ttyACMx : i.e., the 'x' in /dev/ttyACMx
If CONFIG_USBDEV_TRACE is enabled (or CONFIG_DEBUG and CONFIG_DEBUG_USB, or
CONFIG_USBDEV_TRACE), then the example code will also initialize the USB trace
output. The amount of trace output can be controlled using:
CONFIG_EXAMPLES_CDCACM_TRACEINIT
Show initialization events
CONFIG_EXAMPLES_CDCACM_TRACECLASS
Show class driver events
CONFIG_EXAMPLES_CDCACM_TRACETRANSFERS
Show data transfer events
CONFIG_EXAMPLES_CDCACM_TRACECONTROLLER
Show controller events
CONFIG_EXAMPLES_CDCACM_TRACEINTERRUPTS
Show interrupt-related events.
Note: This example is only enables or disable USB CDC/ACM via the NSH
'sercon' and 'serdis' command. It will enable and disable tracing per
the settings before enabling and after disabling the CDC/ACM device. It
will not, however, monitor buffered trace data in the interim. If
CONFIG_USBDEV_TRACE is defined (and the debug options are not), other
application logic will need to monitor the buffered trace data.
examples/composite examples/composite
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
@ -188,9 +210,10 @@ examples/composite
CONFIG_EXAMPLES_COMPOSITE_BUFLEN. Default 256. CONFIG_EXAMPLES_COMPOSITE_BUFLEN. Default 256.
CONFIG_EXAMPLES_COMPOSITE_TTYUSB - The minor number of the USB serial device. CONFIG_EXAMPLES_COMPOSITE_TTYUSB - The minor number of the USB serial device.
Default is zero (corresponding to /dev/ttyUSB0. Default is zero. Default is zero (corresponding to /dev/ttyUSB0 or /dev/ttyACM0). Default is zero.
CCONFIG_EXAMPLES_COMPOSITE_SERDEV - The string corresponding to CCONFIG_EXAMPLES_COMPOSITE_SERDEV - The string corresponding to
CONFIG_EXAMPLES_COMPOSITE_TTYUSB. The default is "/dev/ttyUSB0". CONFIG_EXAMPLES_COMPOSITE_TTYUSB. The default is "/dev/ttyUSB0" (for the PL2303
emulation) or "/dev/ttyACM0" (for the CDC/ACM serial device).
CONFIG_EXAMPLES_COMPOSITE_BUFSIZE - The size of the serial I/O buffer in CONFIG_EXAMPLES_COMPOSITE_BUFSIZE - The size of the serial I/O buffer in
bytes. Default 256 bytes. bytes. Default 256 bytes.
@ -1274,7 +1297,8 @@ examples/usbserial
At the end of the dmesg output, you should see the serial At the end of the dmesg output, you should see the serial
device was successfully idenfied and assigned to a tty device, device was successfully idenfied and assigned to a tty device,
probably /dev/ttyUSB0. probably /dev/ttyUSB0 or /dev/ttyACM0 (depending on the configured
USB serial driver).
3. Then start the host application: 3. Then start the host application:
@ -1282,7 +1306,9 @@ examples/usbserial
Where: Where:
<tty-dev> is the USB TTY device to use. The default is /dev/ttyUSB0. <tty-dev> is the USB TTY device to use. The default is
"/dev/ttyUSB0" (for the PL2303 emulation) or "/dev/ttyACM0" (for
the CDC/ACM serial device).
The host and target will exchange are variety of very small and very large The host and target will exchange are variety of very small and very large
serial messages. serial messages.

View File

@ -41,12 +41,14 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#include <stdlib.h> #include <stdlib.h>
#include <nuttx/usb/usbdev_trace.h>
/**************************************************************************** /****************************************************************************
* Pre-Processor Definitions * Pre-Processor Definitions
****************************************************************************/ ****************************************************************************/
/* Configuration ************************************************************/ /* Configuration ************************************************************/
/* Prerequisites */ /* Prerequisites */
@ -68,6 +70,44 @@
# define CONFIG_EXAMPLES_CDCACM_DEVMINOR 0 # define CONFIG_EXAMPLES_CDCACM_DEVMINOR 0
#endif #endif
/* Trace Configuration ******************************************************/
#ifdef CONFIG_EXAMPLES_CDCACM_TRACEINIT
# define TRACE_INIT_BITS (TRACE_INIT_BIT)
#else
# define TRACE_INIT_BITS (0)
#endif
#define TRACE_ERROR_BITS (TRACE_DEVERROR_BIT|TRACE_CLSERROR_BIT)
#ifdef CONFIG_EXAMPLES_CDCACM_TRACECLASS
# define TRACE_CLASS_BITS (TRACE_CLASS_BIT|TRACE_CLASSAPI_BIT|TRACE_CLASSSTATE_BIT)
#else
# define TRACE_CLASS_BITS (0)
#endif
#ifdef CONFIG_EXAMPLES_CDCACM_TRACETRANSFERS
# define TRACE_TRANSFER_BITS (TRACE_OUTREQQUEUED_BIT|TRACE_INREQQUEUED_BIT|TRACE_READ_BIT|\
TRACE_WRITE_BIT|TRACE_COMPLETE_BIT)
#else
# define TRACE_TRANSFER_BITS (0)
#endif
#ifdef CONFIG_EXAMPLES_CDCACM_TRACECONTROLLER
# define TRACE_CONTROLLER_BITS (TRACE_EP_BIT|TRACE_DEV_BIT)
#else
# define TRACE_CONTROLLER_BITS (0)
#endif
#ifdef CONFIG_EXAMPLES_CDCACM_TRACEINTERRUPTS
# define TRACE_INTERRUPT_BITS (TRACE_INTENTRY_BIT|TRACE_INTDECODE_BIT|TRACE_INTEXIT_BIT)
#else
# define TRACE_INTERRUPT_BITS (0)
#endif
#define TRACE_BITSET (TRACE_INIT_BITS|TRACE_ERROR_BITS|TRACE_CLASS_BITS|\
TRACE_TRANSFER_BITS|TRACE_CONTROLLER_BITS|TRACE_INTERRUPT_BITS)
/* Debug ********************************************************************/ /* Debug ********************************************************************/
#ifdef CONFIG_CPP_HAVE_VARARGS #ifdef CONFIG_CPP_HAVE_VARARGS

View File

@ -81,7 +81,6 @@ struct cdcacm_state_s g_cdcacm;
int sercon_main(int argc, char *argv[]) int sercon_main(int argc, char *argv[])
{ {
FAR void *handle;
int ret; int ret;
/* Check if there is a non-NULL USB mass storage device handle (meaning that the /* Check if there is a non-NULL USB mass storage device handle (meaning that the
@ -94,7 +93,13 @@ int sercon_main(int argc, char *argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/* Initialize the USB serial driver */ /* Then, in any event, enable trace data collection as configured BEFORE
* enabling the CDC/ACM device.
*/
usbtrace_enable(TRACE_BITSET);
/* Initialize the USB CDC/ACM serial driver */
message("sercon: Registering CDC/ACM serial driver\n"); message("sercon: Registering CDC/ACM serial driver\n");
ret = cdcacm_initialize(CONFIG_EXAMPLES_CDCACM_DEVMINOR, &g_cdcacm.handle); ret = cdcacm_initialize(CONFIG_EXAMPLES_CDCACM_DEVMINOR, &g_cdcacm.handle);
@ -127,6 +132,12 @@ int serdis_main(int argc, char *argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/* Then, in any event, disable trace data collection as configured BEFORE
* enabling the CDC/ACM device.
*/
usbtrace_enable(0);
/* Then disconnect the device and uninitialize the USB mass storage driver */ /* Then disconnect the device and uninitialize the USB mass storage driver */
cdcacm_uninitialize(g_cdcacm.handle); cdcacm_uninitialize(g_cdcacm.handle);

View File

@ -120,6 +120,8 @@
#ifndef CONFIG_EXAMPLES_COMPOSITE_SERDEV #ifndef CONFIG_EXAMPLES_COMPOSITE_SERDEV
# if CONFIG_EXAMPLES_COMPOSITE_TTYUSB != 0 # if CONFIG_EXAMPLES_COMPOSITE_TTYUSB != 0
# error "Serial device unknown (CONFIG_EXAMPLES_COMPOSITE_SERDEV)" # error "Serial device unknown (CONFIG_EXAMPLES_COMPOSITE_SERDEV)"
# elif defined(CONFIG_CDCACM)
# define CONFIG_EXAMPLES_COMPOSITE_SERDEV "/dev/ttyACM0"
# else # else
# define CONFIG_EXAMPLES_COMPOSITE_SERDEV "/dev/ttyUSB0" # define CONFIG_EXAMPLES_COMPOSITE_SERDEV "/dev/ttyUSB0"
# endif # endif

View File

@ -66,7 +66,11 @@
# endif # endif
#endif #endif
#define DEFAULT_TTYDEV "/dev/ttyUSB0" #ifdef CONFIG_CDCACM
# define DEFAULT_TTYDEV "/dev/ttyACM0"
#else
# define DEFAULT_TTYDEV "/dev/ttyUSB0"
#endif
#define BUFFER_SIZE 1024 #define BUFFER_SIZE 1024
/**************************************************************************** /****************************************************************************

View File

@ -125,6 +125,12 @@
# endif # endif
#endif #endif
#ifdef CONFIG_CDCACM
# define USBSER_DEVNAME "/dev/ttyACM0"
#else
# define USBSER_DEVNAME "/dev/ttyUSB0"
#endif
#define IOBUFFER_SIZE 256 #define IOBUFFER_SIZE 256
/**************************************************************************** /****************************************************************************
@ -246,11 +252,11 @@ int user_start(int argc, char *argv[])
do do
{ {
message("user_start: Opening USB serial driver\n"); message("user_start: Opening USB serial driver\n");
outfd = open("/dev/ttyUSB0", O_WRONLY); outfd = open(USBSER_DEVNAME, O_WRONLY);
if (outfd < 0) if (outfd < 0)
{ {
int errcode = errno; int errcode = errno;
message("user_start: ERROR: Failed to open /dev/ttyUSB0 for writing: %d\n", errcode); message("user_start: ERROR: Failed to open " USBSER_DEVNAME " for writing: %d\n", errcode);
/* ENOTCONN means that the USB device is not yet connected */ /* ENOTCONN means that the USB device is not yet connected */
@ -279,21 +285,21 @@ int user_start(int argc, char *argv[])
#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY #ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY #ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
infd = open("/dev/ttyUSB0", O_RDONLY|O_NONBLOCK); infd = open(USBSER_DEVNAME, O_RDONLY|O_NONBLOCK);
if (infd < 0) if (infd < 0)
{ {
message("user_start: ERROR: Failed to open /dev/ttyUSB0 for reading: %d\n", errno); message("user_start: ERROR: Failed to open " USBSER_DEVNAME " for reading: %d\n", errno);
close(outfd); close(outfd);
return 3; return 3;
} }
#else #else
do do
{ {
infd = open("/dev/ttyUSB0", O_RDONLY|O_NONBLOCK); infd = open(USBSER_DEVNAME, O_RDONLY|O_NONBLOCK);
if (infd < 0) if (infd < 0)
{ {
int errcode = errno; int errcode = errno;
message("user_start: ERROR: Failed to open /dev/ttyUSB0 for reading: %d\n", errno); message("user_start: ERROR: Failed to open " USBSER_DEVNAME " for reading: %d\n", errno);
/* ENOTCONN means that the USB device is not yet connected */ /* ENOTCONN means that the USB device is not yet connected */

View File

@ -91,6 +91,12 @@
#define TRACE_BITSET (TRACE_INIT_BITS|TRACE_ERROR_BITS|TRACE_CLASS_BITS|\ #define TRACE_BITSET (TRACE_INIT_BITS|TRACE_ERROR_BITS|TRACE_CLASS_BITS|\
TRACE_TRANSFER_BITS|TRACE_CONTROLLER_BITS|TRACE_INTERRUPT_BITS) TRACE_TRANSFER_BITS|TRACE_CONTROLLER_BITS|TRACE_INTERRUPT_BITS)
#ifdef CONFIG_CDCACM
# define USBTERM_DEVNAME "/dev/ttyACM0"
#else
# define USBTERM_DEVNAME "/dev/ttyUSB0"
#endif
/* Debug ********************************************************************/ /* Debug ********************************************************************/
#ifdef CONFIG_CPP_HAVE_VARARGS #ifdef CONFIG_CPP_HAVE_VARARGS

View File

@ -229,11 +229,11 @@ int MAIN_NAME(int argc, char *argv[])
{ {
message(MAIN_STRING "Opening USB serial driver\n"); message(MAIN_STRING "Opening USB serial driver\n");
g_usbterm.outstream = fopen("/dev/ttyUSB0", "w"); g_usbterm.outstream = fopen(USBTERM_DEVNAME, "w");
if (g_usbterm.outstream == NULL) if (g_usbterm.outstream == NULL)
{ {
int errcode = errno; int errcode = errno;
message(MAIN_STRING "ERROR: Failed to open /dev/ttyUSB0 for writing: %d\n", message(MAIN_STRING "ERROR: Failed to open " USBTERM_DEVNAME " for writing: %d\n",
errcode); errcode);
/* ENOTCONN means that the USB device is not yet connected */ /* ENOTCONN means that the USB device is not yet connected */
@ -261,10 +261,10 @@ int MAIN_NAME(int argc, char *argv[])
* should not fail. * should not fail.
*/ */
g_usbterm.instream = fopen("/dev/ttyUSB0", "r"); g_usbterm.instream = fopen(USBTERM_DEVNAME, "r");
if (g_usbterm.instream == NULL) if (g_usbterm.instream == NULL)
{ {
message(MAIN_STRING "ERROR: Failed to open /dev/ttyUSB0 for reading: %d\n", errno); message(MAIN_STRING "ERROR: Failed to open " USBTERM_DEVNAME " for reading: %d\n", errno);
goto errout_with_outstream; goto errout_with_outstream;
} }