summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-05-25 22:10:40 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-05-25 22:10:40 +0000
commit7678a8287c4a198ba6811f45b9bba934b2a5716b (patch)
treefa1aaf27248cfc57d4bc9c9f1f066b98e93d0191
parent385b0fd6504ea1cb35b52cb425b5c37a62afa91d (diff)
downloadnuttx-7678a8287c4a198ba6811f45b9bba934b2a5716b.tar.gz
nuttx-7678a8287c4a198ba6811f45b9bba934b2a5716b.tar.bz2
nuttx-7678a8287c4a198ba6811f45b9bba934b2a5716b.zip
Fix packet size calculation in CDC/ACM and PL2303 USB serial drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4771 42af7a65-404d-4744-a932-0658087f49c3
-rwxr-xr-xapps/ChangeLog.txt4
-rw-r--r--apps/nshlib/README.txt27
-rw-r--r--apps/nshlib/nsh.h36
-rw-r--r--apps/nshlib/nsh_usbdev.c16
-rw-r--r--nuttx/ChangeLog10
-rw-r--r--nuttx/Documentation/NuttShell.html32
-rw-r--r--nuttx/configs/stm3210e-eval/src/stm3210e-internal.h26
-rw-r--r--nuttx/configs/stm3210e-eval/src/up_boot.c8
-rw-r--r--nuttx/configs/stm3220g-eval/src/stm3220g-internal.h12
-rw-r--r--nuttx/configs/stm3220g-eval/src/up_boot.c12
-rw-r--r--nuttx/configs/stm3240g-eval/src/stm3240g-internal.h14
-rw-r--r--nuttx/configs/stm3240g-eval/src/up_boot.c12
-rwxr-xr-xnuttx/configs/stm32f4discovery/README.txt36
-rw-r--r--nuttx/configs/stm32f4discovery/nsh/defconfig23
-rw-r--r--nuttx/configs/stm32f4discovery/src/stm32f4discovery-internal.h10
-rw-r--r--nuttx/configs/stm32f4discovery/src/up_boot.c192
-rw-r--r--nuttx/drivers/usbdev/cdcacm.c13
-rw-r--r--nuttx/drivers/usbdev/pl2303.c13
18 files changed, 370 insertions, 126 deletions
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt
index 75d5c2b09..825b1e50f 100755
--- a/apps/ChangeLog.txt
+++ b/apps/ChangeLog.txt
@@ -230,3 +230,7 @@
initialization interfaces.
6.19 2012-xx-xx Gregory Nutt <gnutt@nuttx.org>
+
+ * apps/nshlib/nsh_usbdev.c: Add the capability to use an arbitrary USB
+ device as the console (not necessarily /dev/console). This is a useful
+ option because then you can still use the serial console to debug with.
diff --git a/apps/nshlib/README.txt b/apps/nshlib/README.txt
index ee47767a9..42e831ddc 100644
--- a/apps/nshlib/README.txt
+++ b/apps/nshlib/README.txt
@@ -916,6 +916,33 @@ NSH-Specific Configuration Settings
CDC/ACM serial device as a console device at
dev/console.
+ CONFIG_NSH_USBCONSOLE
+ If defined, then the an arbitrary USB device may be used
+ to as the NSH console. In this case, CONFIG_NSH_USBCONDEV
+ must be defined to indicate which USB device to use as
+ the console.
+
+ CONFIG_NSH_USBCONDEV
+ If CONFIG_NSH_USBCONSOLE is set to 'y', then CONFIG_NSH_USBCONDEV
+ must also be set to select the USB device used to support
+ the NSH console. This should be set to the quoted name of a
+ readable/write-able USB driver such as:
+ CONFIG_NSH_USBCONDEV="/dev/ttyACM0".
+
+ If there are more than one USB devices, then a USB device
+ minor number may also need to be provided:
+
+ CONFIG_NSH_UBSDEV_MINOR
+ The minor device number of the USB device. Default: 0
+
+ If USB tracing is enabled, then NSH will initialize USB
+ tracing as requested by the following:
+
+ CONFIG_NSH_UBSDEV_TRACEINIT
+ Bit set with each bit enabling a trace option (see
+ include/nuttx/usb/usbdev_trace.h). Default: Only USB errors
+ are traced.
+
* CONFIG_NSH_CONDEV
If CONFIG_NSH_CONSOLE is set to 'y', then CONFIG_NSH_CONDEV
may also be set to select the serial device used to support
diff --git a/apps/nshlib/nsh.h b/apps/nshlib/nsh.h
index bdd12658e..babdedd91 100644
--- a/apps/nshlib/nsh.h
+++ b/apps/nshlib/nsh.h
@@ -49,6 +49,8 @@
#include <stdbool.h>
#include <errno.h>
+#include <nuttx/usb/usbdev_trace.h>
+
/****************************************************************************
* Definitions
****************************************************************************/
@@ -79,10 +81,44 @@
#undef HAVE_USB_CONSOLE
#if defined(CONFIG_USBDEV)
+
+/* Check for a PL2303 serial console. Use console device "/dev/console". */
+
# if defined(CONFIG_PL2303) && defined(CONFIG_PL2303_CONSOLE)
# define HAVE_USB_CONSOLE 1
+
+/* Check for a CDC/ACM serial console. Use console device "/dev/console". */
+
# elif defined(CONFIG_CDCACM) && defined(CONFIG_CDCACM_CONSOLE)
# define HAVE_USB_CONSOLE 1
+
+/* Check for other USB console. USB console device must be provided in CONFIG_NSH_CONDEV */
+
+# elif defined(CONFIG_NSH_USBCONSOLE)
+# define HAVE_USB_CONSOLE 1
+# endif
+#endif
+
+/* Defaults for the USB console */
+
+#ifdef HAVE_USB_CONSOLE
+
+/* The default USB console device minor number is 0*/
+
+# ifndef CONFIG_NSH_UBSDEV_MINOR
+# define CONFIG_NSH_UBSDEV_MINOR 0
+# endif
+
+/* USB trace settings */
+
+# ifndef CONFIG_NSH_UBSDEV_TRACEINIT
+# define CONFIG_NSH_UBSDEV_TRACEINIT (TRACE_DEVERROR_BIT|TRACE_CLSERROR_BIT)
+# endif
+
+/* The default console device is always /dev/console */
+
+# ifndef CONFIG_NSH_USBCONDEV
+# define CONFIG_NSH_USBCONDEV "/dev/console"
# endif
#endif
diff --git a/apps/nshlib/nsh_usbdev.c b/apps/nshlib/nsh_usbdev.c
index a784c6b77..2b31a1a14 100644
--- a/apps/nshlib/nsh_usbdev.c
+++ b/apps/nshlib/nsh_usbdev.c
@@ -95,6 +95,10 @@ int nsh_usbconsole(void)
int fd;
int ret;
+ /* Initialize any USB tracing options that were requested */
+
+ usbtrace_enable(CONFIG_NSH_UBSDEV_TRACEINIT);
+
/* Don't start the NSH console until the console device is ready. Chances
* are, we get here with no functional console. The USB console will not
* be available until the device is connected to the host and until the
@@ -103,12 +107,14 @@ int nsh_usbconsole(void)
/* Initialize the USB serial driver */
+#if defined(CONFIG_PL2303) || defined(CONFIG_CDCACM)
#ifdef CONFIG_CDCACM
- ret = cdcacm_initialize(0, NULL);
+ ret = cdcacm_initialize(CONFIG_NSH_UBSDEV_MINOR, NULL);
#else
- ret = usbdev_serialinitialize(0);
+ ret = usbdev_serialinitialize(CONFIG_NSH_UBSDEV_MINOR);
#endif
DEBUGASSERT(ret == OK);
+#endif
/* Make sure the stdin, stdout, and stderr are closed */
@@ -122,14 +128,16 @@ int nsh_usbconsole(void)
{
/* Try to open the console */
- fd = open("/dev/console", O_RDWR);
+ fd = open(CONFIG_NSH_USBCONDEV, O_RDWR);
if (fd < 0)
{
+ int errval = errno;
+
/* ENOTCONN means that the USB device is not yet connected. Anything
* else is bad.
*/
- DEBUGASSERT(errno == ENOTCONN);
+ DEBUGASSERT(errval == ENOTCONN);
/* Sleep a bit and try again */
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 8a2877ba4..129f60488 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -2809,5 +2809,11 @@
STM32F4Discovery for than an external, SSD1289-based LCD.
* configs/stm32f4discovery/nxlines: Add an STM32F4Discovery configuration
to thest the SSD1289-based LCD.
-
-
+ * configs/stm3240g-eval/src: Add USB GPIO initialization logic needed
+ in board-specific boot logic.
+ * configs/stm32f4discovery/src: Add USB GPIO initialization logic needed
+ in board-specific boot logic.
+ * drivers/usbdev/pl2303.c and cdcacm.c: Fix the request size used for sending
+ packets. It was not using the maximum request size, but instead the previous
+ request size. As a result, packets get smaller, and smaller, and ... This
+ is an important USB serial fix.
diff --git a/nuttx/Documentation/NuttShell.html b/nuttx/Documentation/NuttShell.html
index 409d191a7..c601271c4 100644
--- a/nuttx/Documentation/NuttShell.html
+++ b/nuttx/Documentation/NuttShell.html
@@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttShell (NSH)</i></font></big></h1>
- <p>Last Updated: March 6, 2012</p>
+ <p>Last Updated: May 25, 2012</p>
</td>
</tr>
</table>
@@ -2196,6 +2196,36 @@ nsh>
<code>CONFIG_CDCACM</code> and <code>CONFIG_CDCACM_CONSOLE</code>.
Sets up the CDC/ACM serial device as a console device at <code>/dev/console</code>.
</li>
+ <li>
+ <code>CONFIG_NSH_USBCONSOLE</code>.
+ If defined, then the an arbitrary USB device may be used to as the NSH console.
+ In this case, <code>CONFIG_NSH_CONDEV</code> must be defined to indicate which USB device to use as the console.
+ The advantage of using a device other that /dev/console is that normal debug output can not use /dev/console while NSH uses <code>CONFIG_NSH_USBCONDEV</code>.
+ <p>
+ <code>CONFIG_NSH_USBCONDEV</code>.
+ If <code>CONFIG_NSH_USBCONSOLE</code> is set to 'y', then <code>CONFIG_NSH_USBCONDEV</code> must also be set to select the USB device used to support the NSH console.
+ This should be set to the quoted name of a readable/write-able USB driver such as: <code>CONFIG_NSH_USBCONDEV="/dev/ttyACM0"</code>.
+ </p>
+ </li>
+ </ul>
+ <p>
+ If there are more than one USB slots, then a USB device minor number may also need to be provided:
+ </p>
+ <ul>
+ <li>
+ <code>CONFIG_NSH_UBSDEV_MINOR</code>.
+ The minor device number of the USB device. Default: 0
+ </li>
+ </ul>
+ <p>
+ If USB tracing is enabled, then NSH will initialize USB tracing as requested by the following:
+ </p>
+ <ul>
+ <li>
+ <code>CONFIG_NSH_UBSDEV_TRACEINIT</code>.
+ Bit set with each bit enabling a trace option (see <code>include/nuttx/usb/usbdev_trace.h</code>).
+ Default: Only USB errors are traced.
+ </li>
</ul>
</td>
</tr>
diff --git a/nuttx/configs/stm3210e-eval/src/stm3210e-internal.h b/nuttx/configs/stm3210e-eval/src/stm3210e-internal.h
index 5cb5e91af..8b9deb8ee 100644
--- a/nuttx/configs/stm3210e-eval/src/stm3210e-internal.h
+++ b/nuttx/configs/stm3210e-eval/src/stm3210e-internal.h
@@ -167,7 +167,7 @@ extern const uint16_t g_commonconfig[NCOMMON_CONFIG];
*
************************************************************************************/
-extern void weak_function stm32_spiinitialize(void);
+void weak_function stm32_spiinitialize(void);
/************************************************************************************
* Name: stm32_usbinitialize
@@ -177,7 +177,7 @@ extern void weak_function stm32_spiinitialize(void);
*
************************************************************************************/
-extern void weak_function stm32_usbinitialize(void);
+void weak_function stm32_usbinitialize(void);
/************************************************************************************
* Name: stm32_extcontextsave
@@ -188,7 +188,7 @@ extern void weak_function stm32_usbinitialize(void);
************************************************************************************/
#ifdef CONFIG_STM32_FSMC
-extern void stm32_extcontextsave(struct extmem_save_s *save);
+void stm32_extcontextsave(struct extmem_save_s *save);
/************************************************************************************
* Name: stm32_extcontextrestore
@@ -198,7 +198,7 @@ extern void stm32_extcontextsave(struct extmem_save_s *save);
*
************************************************************************************/
-extern void stm32_extcontextrestore(struct extmem_save_s *restore);
+void stm32_extcontextrestore(struct extmem_save_s *restore);
/************************************************************************************
* Name: stm32_extmemgpios
@@ -208,7 +208,7 @@ extern void stm32_extcontextrestore(struct extmem_save_s *restore);
*
************************************************************************************/
-extern void stm32_extmemgpios(const uint16_t *gpios, int ngpios);
+void stm32_extmemgpios(const uint16_t *gpios, int ngpios);
/************************************************************************************
* Name: stm32_enablefsmc
@@ -218,7 +218,7 @@ extern void stm32_extmemgpios(const uint16_t *gpios, int ngpios);
*
************************************************************************************/
-extern void stm32_enablefsmc(void);
+void stm32_enablefsmc(void);
/************************************************************************************
* Name: stm32_disablefsmc
@@ -228,7 +228,7 @@ extern void stm32_enablefsmc(void);
*
************************************************************************************/
-extern void stm32_disablefsmc(void);
+void stm32_disablefsmc(void);
/************************************************************************************
* Name: stm32_selectnor
@@ -238,7 +238,7 @@ extern void stm32_disablefsmc(void);
*
************************************************************************************/
-extern void stm32_selectnor(void);
+void stm32_selectnor(void);
/************************************************************************************
* Name: stm32_deselectnor
@@ -248,7 +248,7 @@ extern void stm32_selectnor(void);
*
************************************************************************************/
-extern void stm32_deselectnor(void);
+void stm32_deselectnor(void);
/************************************************************************************
* Name: stm32_selectsram
@@ -258,7 +258,7 @@ extern void stm32_deselectnor(void);
*
************************************************************************************/
-extern void stm32_selectsram(void);
+void stm32_selectsram(void);
/************************************************************************************
* Name: stm32_deselectsram
@@ -268,7 +268,7 @@ extern void stm32_selectsram(void);
*
************************************************************************************/
-extern void stm32_deselectsram(void);
+void stm32_deselectsram(void);
/************************************************************************************
* Name: stm32_selectlcd
@@ -278,7 +278,7 @@ extern void stm32_deselectsram(void);
*
************************************************************************************/
-extern void stm32_selectlcd(void);
+void stm32_selectlcd(void);
/************************************************************************************
* Name: stm32_deselectlcd
@@ -288,7 +288,7 @@ extern void stm32_selectlcd(void);
*
************************************************************************************/
-extern void stm32_deselectlcd(void);
+void stm32_deselectlcd(void);
#endif /* CONFIG_STM32_FSMC */
diff --git a/nuttx/configs/stm3210e-eval/src/up_boot.c b/nuttx/configs/stm3210e-eval/src/up_boot.c
index 5f111f9bb..576094c5e 100644
--- a/nuttx/configs/stm3210e-eval/src/up_boot.c
+++ b/nuttx/configs/stm3210e-eval/src/up_boot.c
@@ -88,10 +88,10 @@ void stm32_boardinitialize(void)
}
#endif
- /* Initialize USB is 1) USBDEV is selected, 2) the USB controller is not
- * disabled, and 3) the weak function stm32_usbinitialize() has been brought
- * into the build.
- */
+ /* Initialize USB is 1) USBDEV is selected, 2) the USB controller is not
+ * disabled, and 3) the weak function stm32_usbinitialize() has been brought
+ * into the build.
+ */
#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32_USB)
if (stm32_usbinitialize)
diff --git a/nuttx/configs/stm3220g-eval/src/stm3220g-internal.h b/nuttx/configs/stm3220g-eval/src/stm3220g-internal.h
index a317d92aa..187040ed5 100644
--- a/nuttx/configs/stm3220g-eval/src/stm3220g-internal.h
+++ b/nuttx/configs/stm3220g-eval/src/stm3220g-internal.h
@@ -164,7 +164,17 @@
*
****************************************************************************************************/
-extern void weak_function stm32_spiinitialize(void);
+void weak_function stm32_spiinitialize(void);
+
+/************************************************************************************
+ * Name: stm32_usbinitialize
+ *
+ * Description:
+ * Called to setup USB-related GPIO pins for the STM3210E-EVAL board.
+ *
+ ************************************************************************************/
+
+void weak_function stm32_usbinitialize(void);
#endif /* __ASSEMBLY__ */
#endif /* __CONFIGS_STM3220G_EVAL_SRC_STM3220G_INTERNAL_H */
diff --git a/nuttx/configs/stm3220g-eval/src/up_boot.c b/nuttx/configs/stm3220g-eval/src/up_boot.c
index 20303ceaf..290f41233 100644
--- a/nuttx/configs/stm3220g-eval/src/up_boot.c
+++ b/nuttx/configs/stm3220g-eval/src/up_boot.c
@@ -88,6 +88,18 @@ void stm32_boardinitialize(void)
stm32_selectsram();
#endif
+ /* Initialize USB is 1) USBDEV is selected, 2) the OTG FS controller is not
+ * disabled, and 3) the weak function stm32_usbinitialize() has been brought
+ * into the build.
+ */
+
+#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32_OTGFS)
+ if (stm32_usbinitialize)
+ {
+ stm32_usbinitialize();
+ }
+#endif
+
/* Configure on-board LEDs if LED support has been selected. */
#ifdef CONFIG_ARCH_LEDS
diff --git a/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h b/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
index 70f3f6079..3dfd79912 100644
--- a/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
+++ b/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
@@ -213,6 +213,16 @@
void weak_function stm32_spiinitialize(void);
/************************************************************************************
+ * Name: stm32_usbinitialize
+ *
+ * Description:
+ * Called to setup USB-related GPIO pins for the STM3210E-EVAL board.
+ *
+ ************************************************************************************/
+
+void weak_function stm32_usbinitialize(void);
+
+/************************************************************************************
* Name: stm32_extmemgpios
*
* Description:
@@ -323,7 +333,7 @@ void stm32_deselectsram(void);
************************************************************************************/
#ifdef CONFIG_STM32_FSMC
-extern void stm32_selectlcd(void);
+void stm32_selectlcd(void);
#endif
/************************************************************************************
@@ -335,7 +345,7 @@ extern void stm32_selectlcd(void);
************************************************************************************/
#ifdef CONFIG_STM32_FSMC
-extern void stm32_deselectlcd(void);
+void stm32_deselectlcd(void);
#endif
#endif /* __ASSEMBLY__ */
diff --git a/nuttx/configs/stm3240g-eval/src/up_boot.c b/nuttx/configs/stm3240g-eval/src/up_boot.c
index 063f6a32b..7322878e8 100644
--- a/nuttx/configs/stm3240g-eval/src/up_boot.c
+++ b/nuttx/configs/stm3240g-eval/src/up_boot.c
@@ -88,6 +88,18 @@ void stm32_boardinitialize(void)
stm32_selectsram();
#endif
+ /* Initialize USB is 1) USBDEV is selected, 2) the OTG FS controller is not
+ * disabled, and 3) the weak function stm32_usbinitialize() has been brought
+ * into the build.
+ */
+
+#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32_OTGFS)
+ if (stm32_usbinitialize)
+ {
+ stm32_usbinitialize();
+ }
+#endif
+
/* Configure on-board LEDs if LED support has been selected. */
#ifdef CONFIG_ARCH_LEDS
diff --git a/nuttx/configs/stm32f4discovery/README.txt b/nuttx/configs/stm32f4discovery/README.txt
index 0d1f6a2ff..f5343e405 100755
--- a/nuttx/configs/stm32f4discovery/README.txt
+++ b/nuttx/configs/stm32f4discovery/README.txt
@@ -578,8 +578,13 @@ MAPPING TO STM32 F4:
for the parallel interface if PC0 is held high (or floating). PC0 enables
the STMPS2141STR IC power switch that drives the OTG FS host VBUS.
4 Also the reset pin for the CS43L22 audio Codec.
-
-MAPPING of similar LCD in Arduino (write-only):
+
+NOTE: The configuration to test this LCD configuration is available at
+configs/stm32f4discover/nxlines. As of this writing, I have not seen the
+LCD working so I probaby have some things wrong.
+
+I might need to use a bit-baning interface. Below is the pin configurationf
+of a similar LCD to support a (write-only), bit banging interface:
LCD PIN BOARD CONNECTION
LEDA 5V
@@ -593,8 +598,9 @@ MAPPING of similar LCD in Arduino (write-only):
CS Pin configured as output
RSET Pin configured as output
-Arduino bit banging interface:
+The following summarize the bit banging oprations:
+ /* Rese the LCD */
void Reset(void)
{
Set RSET output
@@ -604,6 +610,7 @@ Arduino bit banging interface:
Set RSET output
}
+ /* Write 16-bits of whatever */
void Write16(uint8_t ms, uint8_t ls)
{
Set port A to ms
@@ -613,19 +620,22 @@ Arduino bit banging interface:
Set WR pin
}
+ /* Set the index register to an LCD register address */
void Index(uint8_t address)
{
Clear RS
Write16(0, address);
}
+ /* Write data to the LCD register or GRAM memory */
void WriteData(uin16_t data)
{
Set RS
Write16(data >> 8, data & 0xff);
}
- void WriteRegiser(uint8_t address, uint16_t data)
+ /* Write to a register */
+ void WriteRegister(uint8_t address, uint16_t data)
{
Index(address);
WriteData(data);
@@ -901,8 +911,9 @@ Where <subdir> is one of the following:
examples/ostest. By default, this project assumes that you are
using the DFU bootloader.
- CONFIG_STM32_CODESOURCERYW=y : CodeSourcery under Windows
+ Default toolchain:
+ CONFIG_STM32_CODESOURCERYL=y : CodeSourcery under Linux / Mac OS X
If you use the Atollic toolchain, then the FPU test can be enabled in the
examples/ostest by adding the following your NuttX configuration file:
@@ -937,6 +948,8 @@ Where <subdir> is one of the following:
Configures the NuttShell (nsh) located at apps/examples/nsh. The
Configuration enables both the serial and telnet NSH interfaces.
+ Default toolchain:
+
CONFIG_STM32_CODESOURCERYL=y : CodeSourcery under Linux / Mac OS X
NOTES:
@@ -984,6 +997,13 @@ Where <subdir> is one of the following:
The IWDG timer has a range of about 35 seconds and should not be an issue.
+ 4. USB Support (CDC/ACM device)
+
+ CONFIG_STM32_OTGFS=y : STM32 OTG FS support
+ 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
+
nxlines:
------
An example using the NuttX graphics system (NX). This example focuses on
@@ -999,3 +1019,9 @@ Where <subdir> is one of the following:
some issues with how some of the dedicated FSMC pins are used on the
boards. This configuration may not be useful and may only serve as
an illustration of how to build for th SSD1289 LCD.
+
+ Default toolchain:
+
+ CONFIG_STM32_CODESOURCERYW=y : CodeSourcery under Windows
+
+ NOTE: As of this writing, I have not seen the LCD work!
diff --git a/nuttx/configs/stm32f4discovery/nsh/defconfig b/nuttx/configs/stm32f4discovery/nsh/defconfig
index 2cc4383b5..75b8ac871 100644
--- a/nuttx/configs/stm32f4discovery/nsh/defconfig
+++ b/nuttx/configs/stm32f4discovery/nsh/defconfig
@@ -1213,6 +1213,24 @@ CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS=3
# CONFIG_NSH_ROMFSETC - Use startup script in /etc
# CONFIG_NSH_CONSOLE - Use serial console front end
# CONFIG_NSH_TELNET - Use telnetd console front end
+# CONFIG_NSH_USBCONSOLE - If defined, then the an arbitrary USB device may be
+# used to as the NSH console. In this case, CONFIG_NSH_CONDEV must be
+# defined to indicate which USB device to use as the console.
+# CONFIG_NSH_USBCONDEV - If CONFIG_NSH_USBCONSOLE is set to 'y', then
+# CONFIG_NSH_USBCONDEV must also be set to select the USB device used to
+# support the NSH console. This should be set to the quoted name of a
+# readable/write-able USB driver such as: CONFIG_NSH_USBCONDEV="/dev/ttyACM0".
+# CONFIG_NSH_UBSDEV_MINOR - The minor device number of the USB device.
+# Default: 0
+# CONFIG_NSH_UBSDEV_TRACEINIT - Bit set with each bit enabling a trace option
+# (see include/nuttx/usb/usbdev_trace.h). Default: Only USB errors are traced.
+# CONFIG_NSH_CONDEV - If CONFIG_NSH_CONSOLE is set to 'y', then CONFIG_NSH_CONDEV
+# may also be set to select the serial device used to support the NSH console.
+# This should be set to the quoted name of a readable/write-able character
+# driver such as: CONFIG_NSH_CONDEV="/dev/ttyS1". This is useful, for example,
+# to separate the NSH command line from the system console when the system
+# console is used to provide debug output. Default: stdin and stdout (probably
+# "/dev/console")
# CONFIG_NSH_ARCHINIT - Platform provides architecture
# specific initialization (nsh_archinitialize()).
#
@@ -1244,6 +1262,11 @@ CONFIG_NSH_DISABLEBG=n
CONFIG_NSH_ROMFSETC=n
CONFIG_NSH_CONSOLE=y
CONFIG_NSH_TELNET=n
+CONFIG_NSH_USBCONSOLE=n
+CONFIG_NSH_USBCONDEV="/dev/ttyACM0"
+CONFIG_NSH_UBSDEV_MINOR=0
+#CONFIG_NSH_UBSDEV_TRACEINIT
+#CONFIG_NSH_CONDEV
CONFIG_NSH_ARCHINIT=n
CONFIG_NSH_IOBUFFER_SIZE=512
CONFIG_NSH_DHCPC=n
diff --git a/nuttx/configs/stm32f4discovery/src/stm32f4discovery-internal.h b/nuttx/configs/stm32f4discovery/src/stm32f4discovery-internal.h
index 7939ffd30..f2afd74d5 100644
--- a/nuttx/configs/stm32f4discovery/src/stm32f4discovery-internal.h
+++ b/nuttx/configs/stm32f4discovery/src/stm32f4discovery-internal.h
@@ -132,6 +132,16 @@
void weak_function stm32_spiinitialize(void);
/************************************************************************************
+ * Name: stm32_usbinitialize
+ *
+ * Description:
+ * Called to setup USB-related GPIO pins for the STM3210E-EVAL board.
+ *
+ ************************************************************************************/
+
+void weak_function stm32_usbinitialize(void);
+
+/************************************************************************************
* Name: stm32_extmemgpios
*
* Description:
diff --git a/nuttx/configs/stm32f4discovery/src/up_boot.c b/nuttx/configs/stm32f4discovery/src/up_boot.c
index 791f0e5e7..736e23f0f 100644
--- a/nuttx/configs/stm32f4discovery/src/up_boot.c
+++ b/nuttx/configs/stm32f4discovery/src/up_boot.c
@@ -1,90 +1,102 @@
-/************************************************************************************
- * configs/stm32f4discovery/src/up_boot.c
- * arch/arm/src/board/up_boot.c
- *
- * Copyright (C) 2011 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 <debug.h>
-
-#include <arch/board/board.h>
-
-#include "up_arch.h"
-#include "stm32f4discovery-internal.h"
-
-/************************************************************************************
- * Definitions
- ************************************************************************************/
-
-/************************************************************************************
- * Private Functions
- ************************************************************************************/
-
-/************************************************************************************
- * Public Functions
- ************************************************************************************/
-
-/************************************************************************************
- * Name: stm32_boardinitialize
- *
- * Description:
- * All STM32 architectures must provide the following entry point. This entry point
- * is called early in the intitialization -- after all memory has been configured
- * and mapped but before any devices have been initialized.
- *
- ************************************************************************************/
-
-void stm32_boardinitialize(void)
-{
- /* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak function
- * stm32_spiinitialize() has been brought into the link.
- */
-
-#if defined(CONFIG_STM32_SPI1) || defined(CONFIG_STM32_SPI2) || defined(CONFIG_STM32_SPI3)
- if (stm32_spiinitialize)
- {
- stm32_spiinitialize();
- }
-#endif
-
- /* Configure on-board LEDs if LED support has been selected. */
-
-#ifdef CONFIG_ARCH_LEDS
- up_ledinit();
-#endif
-}
+/************************************************************************************
+ * configs/stm32f4discovery/src/up_boot.c
+ * arch/arm/src/board/up_boot.c
+ *
+ * Copyright (C) 2011 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 <debug.h>
+
+#include <arch/board/board.h>
+
+#include "up_arch.h"
+#include "stm32f4discovery-internal.h"
+
+/************************************************************************************
+ * Definitions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Private Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Public Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Name: stm32_boardinitialize
+ *
+ * Description:
+ * All STM32 architectures must provide the following entry point. This entry point
+ * is called early in the intitialization -- after all memory has been configured
+ * and mapped but before any devices have been initialized.
+ *
+ ************************************************************************************/
+
+void stm32_boardinitialize(void)
+{
+ /* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak function
+ * stm32_spiinitialize() has been brought into the link.
+ */
+
+#if defined(CONFIG_STM32_SPI1) || defined(CONFIG_STM32_SPI2) || defined(CONFIG_STM32_SPI3)
+ if (stm32_spiinitialize)
+ {
+ stm32_spiinitialize();
+ }
+#endif
+
+ /* Initialize USB is 1) USBDEV is selected, 2) the OTG FS controller is not
+ * disabled, and 3) the weak function stm32_usbinitialize() has been brought
+ * into the build.
+ */
+
+#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32_OTGFS)
+ if (stm32_usbinitialize)
+ {
+ stm32_usbinitialize();
+ }
+#endif
+
+ /* Configure on-board LEDs if LED support has been selected. */
+
+#ifdef CONFIG_ARCH_LEDS
+ up_ledinit();
+#endif
+}
diff --git a/nuttx/drivers/usbdev/cdcacm.c b/nuttx/drivers/usbdev/cdcacm.c
index 24903b504..97c9d7c77 100644
--- a/nuttx/drivers/usbdev/cdcacm.c
+++ b/nuttx/drivers/usbdev/cdcacm.c
@@ -318,6 +318,7 @@ static int cdcacm_sndpacket(FAR struct cdcacm_dev_s *priv)
FAR struct usbdev_ep_s *ep;
FAR struct usbdev_req_s *req;
FAR struct cdcacm_req_s *reqcontainer;
+ uint16_t reqlen;
irqstate_t flags;
int len;
int ret = OK;
@@ -337,7 +338,7 @@ static int cdcacm_sndpacket(FAR struct cdcacm_dev_s *priv)
ep = priv->epbulkin;
/* Loop until either (1) we run out or write requests, or (2) cdcacm_fillrequest()
- * is unable to fill the request with data (i.e., untilthere is no more data
+ * is unable to fill the request with data (i.e., until there is no more data
* to be sent).
*/
@@ -345,6 +346,14 @@ static int cdcacm_sndpacket(FAR struct cdcacm_dev_s *priv)
priv->serdev.xmit.head, priv->serdev.xmit.tail,
priv->nwrq, sq_empty(&priv->reqlist));
+ /* Get the maximum number of bytes that will fit into one bulk IN request */
+
+#ifdef CONFIG_CDCACM_BULKREQLEN
+ reqlen = MAX(CONFIG_CDCACM_BULKREQLEN, ep->maxpacket);
+#else
+ reqlen = ep->maxpacket;
+#endif
+
while (!sq_empty(&priv->reqlist))
{
/* Peek at the request in the container at the head of the list */
@@ -354,7 +363,7 @@ static int cdcacm_sndpacket(FAR struct cdcacm_dev_s *priv)
/* Fill the request with serial TX data */
- len = cdcacm_fillrequest(priv, req->buf, req->len);
+ len = cdcacm_fillrequest(priv, req->buf, reqlen);
if (len > 0)
{
/* Remove the empty container from the request list */
diff --git a/nuttx/drivers/usbdev/pl2303.c b/nuttx/drivers/usbdev/pl2303.c
index a1ba667f5..8bd94ddd0 100644
--- a/nuttx/drivers/usbdev/pl2303.c
+++ b/nuttx/drivers/usbdev/pl2303.c
@@ -567,6 +567,7 @@ static int usbclass_sndpacket(FAR struct pl2303_dev_s *priv)
FAR struct usbdev_ep_s *ep;
FAR struct usbdev_req_s *req;
FAR struct pl2303_req_s *reqcontainer;
+ uint16_t reqlen;
irqstate_t flags;
int len;
int ret = OK;
@@ -586,7 +587,7 @@ static int usbclass_sndpacket(FAR struct pl2303_dev_s *priv)
ep = priv->epbulkin;
/* Loop until either (1) we run out or write requests, or (2) usbclass_fillrequest()
- * is unable to fill the request with data (i.e., untilthere is no more data
+ * is unable to fill the request with data (i.e., until there is no more data
* to be sent).
*/
@@ -594,6 +595,14 @@ static int usbclass_sndpacket(FAR struct pl2303_dev_s *priv)
priv->serdev.xmit.head, priv->serdev.xmit.tail,
priv->nwrq, sq_empty(&priv->reqlist));
+ /* Get the maximum number of bytes that will fit into one bulk IN request */
+
+#ifdef CONFIG_PL2303_BULKREQLEN
+ reqlen = MAX(CONFIG_CDCACM_BULKREQLEN, ep->maxpacket);
+#else
+ reqlen = ep->maxpacket;
+#endif
+
while (!sq_empty(&priv->reqlist))
{
/* Peek at the request in the container at the head of the list */
@@ -603,7 +612,7 @@ static int usbclass_sndpacket(FAR struct pl2303_dev_s *priv)
/* Fill the request with serial TX data */
- len = usbclass_fillrequest(priv, req->buf, req->len);
+ len = usbclass_fillrequest(priv, req->buf, reqlen);
if (len > 0)
{
/* Remove the empty container from the request list */