summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-19 23:06:41 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-19 23:06:41 +0000
commit5fb7939d769fb3f1f84721cb0056d0cc621f05e2 (patch)
treeeadad8142fada4d8cb57c09e438d6535bbd65d53
parentef92b45bc404a1aaf0ab43a1603712f9bfc72311 (diff)
downloadnuttx-5fb7939d769fb3f1f84721cb0056d0cc621f05e2.tar.gz
nuttx-5fb7939d769fb3f1f84721cb0056d0cc621f05e2.tar.bz2
nuttx-5fb7939d769fb3f1f84721cb0056d0cc621f05e2.zip
Add a test for PWM drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4202 42af7a65-404d-4744-a932-0658087f49c3
-rwxr-xr-xapps/ChangeLog.txt2
-rw-r--r--apps/examples/Makefile4
-rw-r--r--apps/examples/README.txt16
-rw-r--r--apps/examples/adc/Makefile4
-rwxr-xr-xapps/examples/adc/adc.h4
-rw-r--r--apps/examples/adc/adc_main.c2
-rw-r--r--apps/examples/pwm/Makefile103
-rwxr-xr-xapps/examples/pwm/pwm.h126
-rw-r--r--apps/examples/pwm/pwm_main.c308
-rw-r--r--nuttx/ChangeLog2
-rw-r--r--nuttx/Documentation/NuttX.html4
-rw-r--r--nuttx/Documentation/NuttxPortingGuide.html54
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_internal.h2
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_pwm.c26
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_pwm.h8
-rwxr-xr-xnuttx/configs/stm3240g-eval/include/board.h13
-rw-r--r--nuttx/configs/stm3240g-eval/nsh/appconfig4
-rwxr-xr-xnuttx/configs/stm3240g-eval/nsh/defconfig14
-rw-r--r--nuttx/configs/stm3240g-eval/src/Makefile4
-rw-r--r--nuttx/configs/stm3240g-eval/src/stm3240g-internal.h14
-rw-r--r--nuttx/configs/stm3240g-eval/src/up_adc.c219
-rw-r--r--nuttx/configs/stm3240g-eval/src/up_pwm.c128
-rw-r--r--nuttx/include/nuttx/pwm.h10
23 files changed, 937 insertions, 134 deletions
diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt
index fe8c057fe..81b041e35 100755
--- a/apps/ChangeLog.txt
+++ b/apps/ChangeLog.txt
@@ -146,3 +146,5 @@
built for performance evaluation.
* apps/examples/adc: Add a very simple test to drive and test an ADC
driver.
+ * apps/examples/pwm: Add an NSH PWM command to drive and test a PWM
+ driver.
diff --git a/apps/examples/Makefile b/apps/examples/Makefile
index d549fe28e..2c82c5145 100644
--- a/apps/examples/Makefile
+++ b/apps/examples/Makefile
@@ -39,12 +39,12 @@
SUBDIRS = adc buttons dhcpd ftpc hello helloxx hidkbd igmp lcdrw mm mount \
nettest nsh null nx nxffs nxflat nxhello nximage nxlines \
- nxtext ostest pashello pipe poll rgmp romfs sendmail serloop \
+ nxtext ostest pashello pipe poll pwm rgmp romfs sendmail serloop \
thttpd tiff touchscreen udp uip usbserial usbstorage usbterm wget wlan
# Sub-directories that might need context setup
-CNTXTDIRS =
+CNTXTDIRS = pwm
ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
CNTXTDIRS += adc
diff --git a/apps/examples/README.txt b/apps/examples/README.txt
index 4460e2c66..ff8dcead1 100644
--- a/apps/examples/README.txt
+++ b/apps/examples/README.txt
@@ -678,6 +678,22 @@ examples/poll
CONFIGURED_APPS += uiplib
+examples/pwm
+^^^^^^^^^^^^
+
+ A test of a PWM device driver. It simply enables a pulsed output for
+ a specified frequency and duty for a specified period of time. This
+ example can ONLY be built as an NSH built-in function.
+
+ CONFIG_NSH_BUILTIN_APPS - Build the PWM test as an NSH built-in function.
+ Default: Not built! The example can only be used as an NSH built-in
+ application
+ CONFIG_EXAMPLES_PWM_DEVPATH - The path to the PWM device. Default: /dev/pwm0
+ CONFIG_EXAMPLES_PWM_FREQUENCY - The initial PWM frequency. Default: 100 Hz
+ CONFIG_EXAMPLES_PWM_DUTYPCT - The initial PWM duty as a percentage. Default: 50%
+ CONFIG_EXAMPLES_PWM_DURATION - The initial PWM pulse train duration in sectonds.
+ as a percentage. Default: 5 seconds
+
examples/rgmp
^^^^^^^^^^^^^
diff --git a/apps/examples/adc/Makefile b/apps/examples/adc/Makefile
index d9b2162e9..6357dfc3d 100644
--- a/apps/examples/adc/Makefile
+++ b/apps/examples/adc/Makefile
@@ -1,8 +1,8 @@
############################################################################
-# apps/examples/touchscreen/Makefile
+# apps/examples/adc/Makefile
#
# Copyright (C) 2011 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
# modification, are permitted provided that the following conditions
diff --git a/apps/examples/adc/adc.h b/apps/examples/adc/adc.h
index 901f84940..214ecc6c8 100755
--- a/apps/examples/adc/adc.h
+++ b/apps/examples/adc/adc.h
@@ -1,8 +1,8 @@
/****************************************************************************
- * examples/examples/adc.h
+ * examples/examples/adc/adc.h
*
* Copyright (C) 2011 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
* modification, are permitted provided that the following conditions
diff --git a/apps/examples/adc/adc_main.c b/apps/examples/adc/adc_main.c
index e685f862d..f0876bb60 100644
--- a/apps/examples/adc/adc_main.c
+++ b/apps/examples/adc/adc_main.c
@@ -132,10 +132,10 @@ int MAIN_NAME(int argc, char *argv[])
errval = 1;
goto errout;
}
- message(MAIN_STRING "Hardware initialized. Opening the ADC device\n");
/* Open the ADC device for reading */
+ message(MAIN_STRING "Hardware initialized. Opening the ADC device\n");
fd = open(CONFIG_EXAMPLES_ADC_DEVPATH, O_RDONLY);
if (fd < 0)
{
diff --git a/apps/examples/pwm/Makefile b/apps/examples/pwm/Makefile
new file mode 100644
index 000000000..3c9c243cb
--- /dev/null
+++ b/apps/examples/pwm/Makefile
@@ -0,0 +1,103 @@
+############################################################################
+# apps/examples/pwm/Makefile
+#
+# 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.
+#
+############################################################################
+
+-include $(TOPDIR)/.config
+-include $(TOPDIR)/Make.defs
+include $(APPDIR)/Make.defs
+
+# NuttX NX Graphics Example.
+
+ASRCS =
+CSRCS = pwm_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 .
+
+# Touchscreen built-in application info
+
+APPNAME = pwm
+PRIORITY = SCHED_PRIORITY_DEFAULT
+STACKSIZE = 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,$(APPNAME),$(PRIORITY),$(STACKSIZE),$(APPNAME)_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
diff --git a/apps/examples/pwm/pwm.h b/apps/examples/pwm/pwm.h
new file mode 100755
index 000000000..83d87517c
--- /dev/null
+++ b/apps/examples/pwm/pwm.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+ * examples/examples/pwm.h
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __APPS_EXAMPLES_PWM_PWM_H
+#define __APPS_EXAMPLES_PWM_PWM_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+/* Configuration ************************************************************/
+/* CONFIG_NSH_BUILTIN_APPS - Build the PWM test as an NSH built-in function.
+ * Default: Not built! The example can only be used as an NSH built-in
+ * application
+ * CONFIG_EXAMPLES_PWM_DEVPATH - The path to the PWM device. Default: /dev/pwm0
+ * CONFIG_EXAMPLES_PWM_FREQUENCY - The initial PWM frequency. Default: 100 Hz
+ * CONFIG_EXAMPLES_PWM_DUTYPCT - The initial PWM duty as a percentage. Default: 50%
+ * CONFIG_EXAMPLES_PWM_DURATION - The initial PWM pulse train duration in sectonds.
+ * as a percentage. Default: 5 seconds
+ */
+
+#ifndef CONFIG_PWM
+# error "PWM device support is not enabled (CONFIG_PWM)"
+#endif
+
+#ifndef CONFIG_NSH_BUILTIN_APPS
+# warning "The PWM example only works as an NSH built-in application (CONFIG_NSH_BUILTIN_APPS)"
+#endif
+
+#ifndef CONFIG_EXAMPLES_PWM_DEVPATH
+# define CONFIG_EXAMPLES_PWM_DEVPATH "/dev/pwm0"
+#endif
+
+#ifndef CONFIG_EXAMPLES_PWM_FREQUENCY
+# define CONFIG_EXAMPLES_PWM_FREQUENCY 100
+#endif
+
+#ifndef CONFIG_EXAMPLES_PWM_DUTYPCT
+# define CONFIG_EXAMPLES_PWM_DUTYPCT 50
+#endif
+
+#ifndef CONFIG_EXAMPLES_PWM_DURATION
+# define CONFIG_EXAMPLES_PWM_DURATION 5
+#endif
+
+/* Debug ********************************************************************/
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_rawprintf(__VA_ARGS__)
+# define msgflush()
+# else
+# define message(...) printf(__VA_ARGS__)
+# define msgflush() fflush(stdout)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_rawprintf
+# define msgflush()
+# else
+# define message printf
+# define msgflush() fflush(stdout)
+# endif
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: pwm_devinit()
+ *
+ * Description:
+ * Perform architecuture-specific initialization of the PWM hardware. This
+ * interface must be provided by all configurations using apps/examples/pwm
+ *
+ ****************************************************************************/
+
+int pwm_devinit(void);
+
+#endif /* __APPS_EXAMPLES_PWM_PWM_H */
diff --git a/apps/examples/pwm/pwm_main.c b/apps/examples/pwm/pwm_main.c
new file mode 100644
index 000000000..18b93f8d1
--- /dev/null
+++ b/apps/examples/pwm/pwm_main.c
@@ -0,0 +1,308 @@
+/****************************************************************************
+ * examples/pwm/pwm_main.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 <sys/types.h>
+#include <sys/ioctl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/pwm.h>
+
+#include "pwm.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct pwm_state_s
+{
+ bool initialized;
+ uint8_t duty;
+ uint32_t freq;
+ int duration;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct pwm_state_s g_pwmstate;
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: pwm_help
+ ****************************************************************************/
+
+static void pwm_help(FAR struct pwm_state_s *pwm)
+{
+ message("Usage: pwm [OPTIONS]\n");
+ message("\nArguments are \"sticky\". For example, once the PWM frequency is\n");
+ message("specified, that frequency will be re-used until it is changed.\n");
+ message("\n\"sticky\" OPTIONS include:\n");
+ message(" [-f addr] selects the pulse frequency. "
+ "Default: %d Hz Current: %d Hz\n",
+ CONFIG_EXAMPLES_PWM_FREQUENCY, pwm->freq);
+ message(" [-d duty] selcts the pulse duty as a percentage. "
+ "Default: %d %% Current: %d %%\n",
+ CONFIG_EXAMPLES_PWM_DUTYPCT, pwm->duty);
+ message(" [-t duration] is the duration of the pulse train in seconds. "
+ "Default: %d Current: %d\n",
+ CONFIG_EXAMPLES_PWM_DURATION, pwm->duration);
+ message(" [-t] shows this message and extis\n");
+}
+
+/****************************************************************************
+ * Name: arg_string
+ ****************************************************************************/
+
+int arg_string(FAR char **arg, FAR char **value)
+{
+ FAR char *ptr = *arg;
+
+ if (ptr[2] == '\0')
+ {
+ *value = arg[1];
+ return 2;
+ }
+ else
+ {
+ *value = &ptr[2];
+ return 1;
+ }
+}
+
+/****************************************************************************
+ * Name: arg_decimal
+ ****************************************************************************/
+
+int arg_decimal(FAR char **arg, FAR long *value)
+{
+ FAR char *string;
+ int ret;
+
+ ret = arg_string(arg, &string);
+ *value = strtol(string, NULL, 10);
+ return ret;
+}
+
+/****************************************************************************
+ * Name: parse_args
+ ****************************************************************************/
+
+void parse_args(FAR struct pwm_state_s *pwm, int argc, FAR char **argv)
+{
+ FAR char *ptr;
+ long value;
+ int index;
+ int nargs;
+
+ for (index = 1; index < argc; )
+ {
+ ptr = argv[index];
+ if (ptr[0] != '-')
+ {
+ message("Invalid options format: %s\n", ptr);
+ exit(0);
+ }
+
+ switch (ptr[1])
+ {
+ case 'f':
+ nargs = arg_decimal(&argv[index], &value);
+ if (value < 1)
+ {
+ message("Frequency out of range: %ld\n", value);
+ exit(1);
+ }
+
+ pwm->freq = (uint32_t)value;
+ index += nargs;
+ break;
+
+ case 'd':
+ nargs = arg_decimal(&argv[index], &value);
+ if (value < 1 || value > 99)
+ {
+ message("Duty out of range: %ld\n", value);
+ exit(1);
+ }
+
+ pwm->duty = (uint8_t)value;
+ index += nargs;
+ break;
+
+ case 't':
+ nargs = arg_decimal(&argv[index], &value);
+ if (value < 1 || value > INT_MAX)
+ {
+ message("Duration out of range: %ld\n", value);
+ exit(1);
+ }
+
+ pwm->duration = (int)value;
+ index += nargs;
+ break;
+
+ case 'h':
+ pwm_help(pwm);
+ exit(0);
+
+ default:
+ message("Unsupported option: %s\n", ptr);
+ pwm_help(pwm);
+ exit(1);
+ }
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_start/pwm_main
+ ****************************************************************************/
+
+int pwm_main(int argc, char *argv[])
+{
+ struct pwm_info_s info;
+ int fd;
+ int ret;
+
+ /* Initialize the state data */
+
+ if (!g_pwmstate.initialized)
+ {
+ g_pwmstate.duty = CONFIG_EXAMPLES_PWM_DUTYPCT;
+ g_pwmstate.freq = CONFIG_EXAMPLES_PWM_FREQUENCY;
+ g_pwmstate.duration = CONFIG_EXAMPLES_PWM_DURATION;
+ g_pwmstate.initialized = true;
+ }
+
+ /* Parse the command line */
+
+ parse_args(&g_pwmstate, argc, argv);
+
+ /* Initialization of the PWM hardware is performed by logic external to
+ * this test.
+ */
+
+ ret = pwm_devinit();
+ if (ret != OK)
+ {
+ message("pwm_main: pwm_devinit failed: %d\n", ret);
+ goto errout;
+ }
+
+ /* Open the PWM device for reading */
+
+ fd = open(CONFIG_EXAMPLES_PWM_DEVPATH, O_RDONLY);
+ if (fd < 0)
+ {
+ message("pwm_main: open %s failed: %d\n",
+ CONFIG_EXAMPLES_PWM_DEVPATH, errno);
+ goto errout;
+ }
+
+ /* Configure the characteristics of the pulse train */
+
+ info.frequency = g_pwmstate.freq;
+ info.duty = (info.duty < 16) / 100;
+
+ ret = ioctl(fd, PWMIOC_SETCHARACTERISTICS, (unsigned long)((uintptr_t)&info));
+ if (ret < 0)
+ {
+ message("pwm_main: ioctl(PWMIOC_SETCHARACTERISTICS) failed: %d\n", errno);
+ goto errout_with_dev;
+ }
+
+ /* Then start the pulse train */
+
+ ret = ioctl(fd, PWMIOC_START, 0);
+ if (ret < 0)
+ {
+ message("pwm_main: ioctl(PWMIOC_START) failed: %d\n", errno);
+ goto errout_with_dev;
+ }
+
+ /* Wait for the specified duration */
+
+ sleep(g_pwmstate.duration);
+
+ /* Then stop the pulse train */
+
+ ret = ioctl(fd, PWMIOC_STOP, 0);
+ if (ret < 0)
+ {
+ message("pwm_main: ioctl(PWMIOC_STOP) failed: %d\n", errno);
+ goto errout_with_dev;
+ }
+
+ close(fd);
+ msgflush();
+ return OK;
+
+errout_with_dev:
+ close(fd);
+errout:
+ msgflush();
+ return ERROR;
+}
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 0962166f5..69f6febf0 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -2281,5 +2281,7 @@
that this latter bugfix also fixes some STM32 USB performance problems.
* configs/hymini-stm32v: A configuration for the HY-Mini STM32v board contributed
by Laurent Latil. Theses changes also include support for the STM32F103VCT6.
+ * arch/configs/stm3240g-eval/src/up_pwm.c: Add hooks needed to use the new
+ apps/examples/pwm test of the STM32 PWM driver.
diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html
index d55c727d2..d3d4af4f1 100644
--- a/nuttx/Documentation/NuttX.html
+++ b/nuttx/Documentation/NuttX.html
@@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
- <p>Last Updated: December 6, 2011</p>
+ <p>Last Updated: December 19, 2011</p>
</td>
</tr>
</table>
@@ -463,7 +463,7 @@
<td>
<p>
<li>
- Network, USB (host), USB (device), serial, CAN, ADC, DAC driver architectures.
+ Network, USB (host), USB (device), serial, CAN, ADC, DAC, and PWM driver architectures.
</li>
</p>
</tr>
diff --git a/nuttx/Documentation/NuttxPortingGuide.html b/nuttx/Documentation/NuttxPortingGuide.html
index dc3dbc672..293b7d683 100644
--- a/nuttx/Documentation/NuttxPortingGuide.html
+++ b/nuttx/Documentation/NuttxPortingGuide.html
@@ -12,7 +12,7 @@
<h1><big><font color="#3c34ec">
<i>NuttX RTOS Porting Guide</i>
</font></big></h1>
- <p>Last Updated: December 14, 2011</p>
+ <p>Last Updated: December 19, 2011</p>
</td>
</tr>
</table>
@@ -126,7 +126,8 @@
<a href="#sdiodrivers">6.3.8 SDIO Device Drivers</a><br>
<a href="#usbhostdrivers">6.3.9 USB Host-Side Drivers</a><br>
<a href="#usbdevdrivers">6.3.10 USB Device-Side Drivers</a><br>
- <a href="#analogdrivers">6.3.11 Analog (ADC/DAC) Drivers</a>
+ <a href="#analogdrivers">6.3.11 Analog (ADC/DAC) Drivers</a><br>
+ <a href="#pwmdrivers">6.3.12 PWM Drivers</a>
</ul>
<a href="#pwrmgmt">6.4 Power Management</a>
<ul>
@@ -3120,9 +3121,21 @@ extern void up_ledoff(int led);
</ul>
<h3><a name="analogdrivers">6.3.11 Analog (ADC/DAC) Drivers</a></h3>
+<p>
+ The NuttX PWM driver is split into two parts:
+</p>
+<ol>
+ <li>
+ An &quot;upper half&quot;, generic driver that provides the comman PWM interface to application level code, and
+ </li>
+ <li>
+ A &quot;lower half&quot;, platform-specific driver that implements the low-level timer controls to implement the PWM functionality.
+ </li>
+</ol>
<ul>
<li>
- General header files for the NuttX analog reside in <code>include/nuttx/analog/</code>.
+ General header files for the NuttX analog drivers reside in <code>include/nuttx/analog/</code>.
+ These header files includes both the application level interface to the analog driver as well as the interface between the &quot;upper half&quot; and &quot;lower half&quot; drivers.
</li>
<li>
Common analog logic and share-able analog drivers reside in the <code>drivers/analog/</code>.
@@ -3182,6 +3195,41 @@ extern void up_ledoff(int led);
</li>
</ul>
+<h3><a name="pwmdrivers">6.3.12 PWM Drivers</a></h3>
+<p>
+ For the purposes of this driver, a PWM device is any device that generates periodic output pulses of controlled frequency and pulse width.
+ Such a device might be used, for example, to perform pulse-width modulated output or frequency/pulse-count modulated output
+ (such as might be needed to control a stepper motor).
+</p>
+<p>
+ The NuttX PWM driver is split into two parts:
+</p>
+<ol>
+ <li>
+ An &quot;upper half&quot;, generic driver that provides the comman PWM interface to application level code, and
+ </li>
+ <li>
+ A &quot;lower half&quot;, platform-specific driver that implements the low-level timer controls to implement the PWM functionality.
+ </li>
+</ol>
+
+<ul>
+ <li>
+ The header file for the NuttX PWM driver reside at <code>include/nuttx/pwm.h</code>.
+ This header file includes both the application level interface to the PWM driver as well as the interface between the &quot;upper half&quot; and &quot;lower half&quot; drivers.
+ The PWM module uses a standard character driver framework.
+ However, since the PWM driver is a devices control interface and not a data transfer interface,
+ the majority of the functionality available to the application is implemented in driver ioctl calls.
+ </li>
+ <li>
+ The generic, &quot;upper half&quot; PWM driver resides at <code>drivers/pwm.c</code>.
+ </li>
+ <li>
+ Platform-specific PWM drivers reside in <code>arch/</code><i>&lt;architecture&gt;</i><code>/src/</code><i>&lt;chip&gt;</i> directory for the specific processor <i>&lt;architecture&gt;</i> and for the specific <i>&lt;chip&gt;</i> analog peripheral devices.
+ </li>
+</ul>
+
+
<h2><a name="pwrmgmt">6.4 Power Management</a></h2>
<h3><a name="pmoverview">6.4.1 Overview</a></h3>
diff --git a/nuttx/arch/arm/src/stm32/stm32_internal.h b/nuttx/arch/arm/src/stm32/stm32_internal.h
index 0c1792230..8db936786 100644
--- a/nuttx/arch/arm/src/stm32/stm32_internal.h
+++ b/nuttx/arch/arm/src/stm32/stm32_internal.h
@@ -2,7 +2,7 @@
* arch/arm/src/stm32/stm32_internal.h
*
* Copyright (C) 2009-2011 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
* modification, are permitted provided that the following conditions
diff --git a/nuttx/arch/arm/src/stm32/stm32_pwm.c b/nuttx/arch/arm/src/stm32/stm32_pwm.c
index 3162d31d1..1e3f4f07d 100644
--- a/nuttx/arch/arm/src/stm32/stm32_pwm.c
+++ b/nuttx/arch/arm/src/stm32/stm32_pwm.c
@@ -343,6 +343,8 @@ static int pwm_setup(FAR struct pwm_lowerhalf_s *dev)
{
FAR struct stm32_pwmtimer_s *priv = (FAR struct stm32_pwmtimer_s *)dev;
+ pwmvdbg("TIM%d pincfg: %08x\n", priv->timid, priv->pincfg);
+
/* Configure the PWM output pin, but do not start the timer yet */
stm32_configgpio(priv->pincfg);
@@ -370,6 +372,8 @@ static int pwm_shutdown(FAR struct pwm_lowerhalf_s *dev)
FAR struct stm32_pwmtimer_s *priv = (FAR struct stm32_pwmtimer_s *)dev;
uint32_t pincfg;
+ pwmvdbg("TIM%d pincfg: %08x\n", priv->timid, priv->pincfg);
+
/* Make sure that the output has been stopped */
pwm_stop(dev);
@@ -430,6 +434,9 @@ static int pwm_start(FAR struct pwm_lowerhalf_s *dev, FAR const struct pwm_info_
uint16_t ocmode1;
uint16_t ocmode2;
+ pwmvdbg("TIM%d channel: %d frequency: %d duty: %08x\n",
+ priv->timid, priv->channel, info->frequency, info->duty);
+
/* Caculate optimal values for the timer prescaler and for the timer reload
* register. If' frequency' is the desired frequency, then
*
@@ -599,6 +606,7 @@ static int pwm_start(FAR struct pwm_lowerhalf_s *dev, FAR const struct pwm_info_
break;
default:
+ pwmdbg("No such channel: %d\n", priv->channel);
return -EINVAL;
}
@@ -681,6 +689,10 @@ static int pwm_start(FAR struct pwm_lowerhalf_s *dev, FAR const struct pwm_info_
cr1 |= GTIM_CR1_CEN;
pwm_putreg(priv, STM32_GTIM_CR1_OFFSET, ccmr2);
+
+ pwmvdbg("CR1: %04x CR2:%04x CCER: %08x CCMR1: %08x CCMR2: %08x\n",
+ cr1, cr2, ccer, ccmr1, ccmr2);
+
return OK;
}
@@ -706,6 +718,8 @@ static int pwm_stop(FAR struct pwm_lowerhalf_s *dev)
uint32_t regaddr;
uint32_t regval;
+ pwmvdbg("TIM%d\n", priv->timid);
+
switch (priv->timid)
{
#ifdef CONFIG_STM32_TIM1_PWM
@@ -792,11 +806,13 @@ static int pwm_stop(FAR struct pwm_lowerhalf_s *dev)
regval &= ~resetbit;
putreg32(regval, regaddr);
+
+ pwmvdbg("regaddr: %08x resetbit: %08x\n", regaddr, resetbit);
return OK;
}
/****************************************************************************
- * Name:
+ * Name: pwm_ioctl
*
* Description:
* Lower-half logic may support platform-specific ioctl commands
@@ -813,8 +829,13 @@ static int pwm_stop(FAR struct pwm_lowerhalf_s *dev)
static int pwm_ioctl(FAR struct pwm_lowerhalf_s *dev, int cmd, unsigned long arg)
{
+#ifdef CONFIG_DEBUG_PWM
+ FAR struct stm32_pwmtimer_s *priv = (FAR struct stm32_pwmtimer_s *)dev;
+
/* There are no platform-specific ioctl commands */
+ pwmvdbg("TIM%d\n", priv->timid);
+#endif
return -ENOTTY;
}
@@ -843,6 +864,8 @@ FAR struct pwm_lowerhalf_s *stm32_pwminitialize(int timer)
{
FAR struct stm32_pwmtimer_s *lower;
+ pwmvdbg("TIM%d\n", timer);
+
switch (timer)
{
#ifdef CONFIG_STM32_TIM1_PWM
@@ -906,6 +929,7 @@ FAR struct pwm_lowerhalf_s *stm32_pwminitialize(int timer)
break;
#endif
default:
+ pwmdbg("No such timer configured\n");
return NULL;
}
diff --git a/nuttx/arch/arm/src/stm32/stm32_pwm.h b/nuttx/arch/arm/src/stm32/stm32_pwm.h
index bd881d3d4..b7179a7bc 100644
--- a/nuttx/arch/arm/src/stm32/stm32_pwm.h
+++ b/nuttx/arch/arm/src/stm32/stm32_pwm.h
@@ -33,8 +33,8 @@
*
************************************************************************************/
-#ifndef __ARCH_ARM_SRC_STM32_STM32_TIM_H
-#define __ARCH_ARM_SRC_STM32_STM32_TIM_H
+#ifndef __ARCH_ARM_SRC_STM32_STM32_PWM_H
+#define __ARCH_ARM_SRC_STM32_STM32_PWM_H
/* The STM32 does not have dedicated PWM hardware. Rather, pulsed output control
* is a capabilitiy of the STM32 timers. The logic in this file implements the
@@ -303,7 +303,7 @@
# endif
#endif
-#ifdef CONFIG_STM32_TIM14_PWM)
+#ifdef CONFIG_STM32_TIM14_PWM
# if !defined(CONFIG_STM32_TIM14_CHANNEL)
# error "CONFIG_STM32_TIM14_CHANNEL must be provided"
# elif CONFIG_STM32_TIM14_CHANNEL == 1
@@ -367,4 +367,4 @@ EXTERN FAR struct pwm_lowerhalf_s *stm32_pwminitialize(int timer);
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_STM32_TIMx_PWM */
-#endif /* __ARCH_ARM_SRC_STM32_STM32_TIM_H */
+#endif /* __ARCH_ARM_SRC_STM32_STM32_PWM_H */
diff --git a/nuttx/configs/stm3240g-eval/include/board.h b/nuttx/configs/stm3240g-eval/include/board.h
index 663ad7eda..ba1016910 100755
--- a/nuttx/configs/stm3240g-eval/include/board.h
+++ b/nuttx/configs/stm3240g-eval/include/board.h
@@ -263,6 +263,19 @@
#define GPIO_ETH_RMII_TXD0 GPIO_ETH_RMII_TXD0_2
#define GPIO_ETH_RMII_TXD1 GPIO_ETH_RMII_TXD1_2
+/* PWM
+ *
+ * The STM3240G-Eval has no real on-board PWM devices, but the board can be configured to output
+ * a pulse train using TIM4 CH2. This pin is used by FSMC is connect to CN5 just for this
+ * purpose:
+ *
+ * PD13 FSMC_A18 / MC_TIM4_CH2 pin 33 (EnB)
+ *
+ * FSMC must be disabled in this case!
+ */
+
+#define GPIO_TIM4_CH2 GPIO_TIM4_CH2_1
+
/************************************************************************************
* Public Data
************************************************************************************/
diff --git a/nuttx/configs/stm3240g-eval/nsh/appconfig b/nuttx/configs/stm3240g-eval/nsh/appconfig
index c2745c294..6951578da 100644
--- a/nuttx/configs/stm3240g-eval/nsh/appconfig
+++ b/nuttx/configs/stm3240g-eval/nsh/appconfig
@@ -50,4 +50,8 @@ CONFIGURED_APPS += netutils/webclient
CONFIGURED_APPS += netutils/tftpc
endif
+ifeq ($(CONFIG_PWM),y)
+CONFIGURED_APPS += examples/pwm
+endif
+
diff --git a/nuttx/configs/stm3240g-eval/nsh/defconfig b/nuttx/configs/stm3240g-eval/nsh/defconfig
index 52a7ccfa3..8acd5de7c 100755
--- a/nuttx/configs/stm3240g-eval/nsh/defconfig
+++ b/nuttx/configs/stm3240g-eval/nsh/defconfig
@@ -303,6 +303,18 @@ CONFIG_STM32_ETH_PTP=n
CONFIG_STM32_ETHMAC_REGDEBUG=n
#
+# PWM configuration
+#
+# The STM3240G-Eval has no real on-board PWM devices, but the board can be configured to output
+# a pulse train using TIM4 CH2. This pin is used by FSMC is connect to CN5 just for this
+# purpose.
+#
+CONFIG_PWM=n
+CONFIG_STM32_TIM4=y
+CONFIG_STM32_TIM4_PWM=y
+CONFIG_STM32_TIM4_CHANNEL=2
+
+#
# General build options
#
# CONFIG_RRLOAD_BINARY - make the rrload binary format used with
@@ -1113,7 +1125,7 @@ CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS=3
# CONFIG_NSH_FATNSECTORS - FAT FS number of sectors
# CONFIG_NSH_FATMOUNTPT - FAT FS mountpoint
#
-CONFIG_NSH_BUILTIN_APPS=n
+CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_STRERROR=n
CONFIG_NSH_LINELEN=64
diff --git a/nuttx/configs/stm3240g-eval/src/Makefile b/nuttx/configs/stm3240g-eval/src/Makefile
index 2ba46d682..7d09e145a 100644
--- a/nuttx/configs/stm3240g-eval/src/Makefile
+++ b/nuttx/configs/stm3240g-eval/src/Makefile
@@ -46,6 +46,10 @@ ifeq ($(CONFIG_ADC),y)
CSRCS += up_adc.c
endif
+ifeq ($(CONFIG_PWM),y)
+CSRCS += up_pwm.c
+endif
+
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
diff --git a/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h b/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
index 051d0be90..415831191 100644
--- a/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
+++ b/nuttx/configs/stm3240g-eval/src/stm3240g-internal.h
@@ -84,6 +84,20 @@
#define GPIO_BTN_TAMPER (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTC|GPIO_PIN13)
#define GPIO_BTN_USER (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTG|GPIO_PIN15)
+/* PWM
+ *
+ * The STM3240G-Eval has no real on-board PWM devices, but the board can be configured to output
+ * a pulse train using TIM4 CH2. This pin is used by FSMC is connect to CN5 just for this
+ * purpose:
+ *
+ * PD13 FSMC_A18 / MC_TIM4_CH2 pin 33 (EnB)
+ *
+ * FSMC must be disabled in this case!
+ */
+
+#define STM3240G_EVAL_PWMTIMER 4
+#define STM3240G_EVAL_PWMCHANNEL 2
+
/****************************************************************************************************
* Public Types
****************************************************************************************************/
diff --git a/nuttx/configs/stm3240g-eval/src/up_adc.c b/nuttx/configs/stm3240g-eval/src/up_adc.c
index 278d830ee..7abad0653 100644
--- a/nuttx/configs/stm3240g-eval/src/up_adc.c
+++ b/nuttx/configs/stm3240g-eval/src/up_adc.c
@@ -1,111 +1,110 @@
-/************************************************************************************
- * configs/stm3240g-eval/src/up_adc.c
- * arch/arm/src/board/up_adc.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 <nuttx/analog/adc.h>
-#include <arch/board/board.h>
-
-#include "chip.h"
-#include "up_arch.h"
-#include "stm3240g-internal.h"
-
-#ifdef CONFIG_ADC
-
-/************************************************************************************
- * Definitions
- ************************************************************************************/
-
-/* Configuration ************************************************************/
-/* Up to 3 ADC interfaces are supported */
-
-#if STM32_NADC < 3
-# undef CONFIG_STM32_ADC3
-#endif
-
-#if STM32_NADC < 2
-# undef CONFIG_STM32_ADC2
-#endif
-
-#if STM32_NADC < 1
-# undef CONFIG_STM32_ADC1
-#endif
-
-#if defined(CONFIG_STM32_ADC1) || defined(CONFIG_STM32_ADC2) || defined(CONFIG_STM32_ADC3)
-
-/************************************************************************************
- * 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 adc_devinit(void)
-{
- struct adc_dev_s *adc;
- int ret;
-
- /* Call stm32_adcinitialize() to get an instance of the ADC interface */
-#warning "Missing Logic"
-
- /* Register the ADC driver at "/dev/adc0" */
-
- ret = adc_register("/dev/adc0", adc);
- if (ret < 0)
- {
- adbg("adc_register failed: %d\n", ret);
- }
-}
-
-#endif /* CONFIG_STM32_ADC || CONFIG_STM32_ADC2 || CONFIG_STM32_ADC3 */
+/************************************************************************************
+ * configs/stm3240g-eval/src/up_adc.c
+ * arch/arm/src/board/up_adc.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 <nuttx/analog/adc.h>
+#include <arch/board/board.h>
+
+#include "chip.h"
+#include "up_arch.h"
+#include "stm3240g-internal.h"
+
+#ifdef CONFIG_ADC
+
+/************************************************************************************
+ * Definitions
+ ************************************************************************************/
+
+/* Configuration ************************************************************/
+/* Up to 3 ADC interfaces are supported */
+
+#if STM32_NADC < 3
+# undef CONFIG_STM32_ADC3
+#endif
+
+#if STM32_NADC < 2
+# undef CONFIG_STM32_ADC2
+#endif
+
+#if STM32_NADC < 1
+# undef CONFIG_STM32_ADC1
+#endif
+
+#if defined(CONFIG_STM32_ADC1) || defined(CONFIG_STM32_ADC2) || defined(CONFIG_STM32_ADC3)
+
+/************************************************************************************
+ * Private Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Public Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Name: adc_devinit
+ *
+ * Description:
+ * All STM32 architectures must provide the following interface to work with
+ * examples/adc.
+ *
+ ************************************************************************************/
+
+void adc_devinit(void)
+{
+ struct adc_dev_s *adc;
+ int ret;
+
+ /* Call stm32_adcinitialize() to get an instance of the ADC interface */
+#warning "Missing Logic"
+
+ /* Register the ADC driver at "/dev/adc0" */
+
+ ret = adc_register("/dev/adc0", adc);
+ if (ret < 0)
+ {
+ adbg("adc_register failed: %d\n", ret);
+ }
+}
+
+#endif /* CONFIG_STM32_ADC || CONFIG_STM32_ADC2 || CONFIG_STM32_ADC3 */
#endif /* CONFIG_ADC */ \ No newline at end of file
diff --git a/nuttx/configs/stm3240g-eval/src/up_pwm.c b/nuttx/configs/stm3240g-eval/src/up_pwm.c
new file mode 100644
index 000000000..503e26073
--- /dev/null
+++ b/nuttx/configs/stm3240g-eval/src/up_pwm.c
@@ -0,0 +1,128 @@
+/************************************************************************************
+ * configs/stm3240g-eval/src/up_pwm.c
+ * arch/arm/src/board/up_pwm.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 <nuttx/pwm.h>
+#include <arch/board/board.h>
+
+#include "chip.h"
+#include "up_arch.h"
+#include "stm32_pwm.h"
+#include "stm3240g-internal.h"
+
+/************************************************************************************
+ * Definitions
+ ************************************************************************************/
+/* Configuration *******************************************************************/
+/* PWM
+ *
+ * The STM3240G-Eval has no real on-board PWM devices, but the board can be configured to output
+ * a pulse train using TIM4 CH2. This pin is used by FSMC is connect to CN5 just for this
+ * purpose:
+ *
+ * PD13 FSMC_A18 / MC_TIM4_CH2 pin 33 (EnB)
+ *
+ * FSMC must be disabled in this case!
+ */
+
+#define HAVE_PWM 1
+
+#ifndef CONFIG_PWM
+# undef HAVE_PWM
+#endif
+
+#ifndef CONFIG_STM32_TIM4
+# undef HAVE_PWM
+#endif
+
+#ifndef CONFIG_STM32_TIM4_PWM
+# undef HAVE_PWM
+#endif
+
+#if CONFIG_STM32_TIM4_CHANNEL != STM3240G_EVAL_PWMCHANNEL
+# undef HAVE_PWM
+#endif
+
+#ifdef HAVE_PWM
+
+/************************************************************************************
+ * Private Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Public Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Name: pwm_devinit
+ *
+ * Description:
+ * All STM32 architectures must provide the following interface to work with
+ * examples/pwm.
+ *
+ ************************************************************************************/
+
+void pwm_devinit(void)
+{
+ struct pwm_lowerhalf_s *pwm;
+ int ret;
+
+ /* Call stm32_pwminitialize() to get an instance of the PWM interface */
+
+ pwm = stm32_pwminitialize(STM3240G_EVAL_PWMTIMER);
+ if (!pwm)
+ {
+ dbg("Failed to get the STM32 PWM lower half\n");
+ return;
+ }
+
+ /* Register the PWM driver at "/dev/pwm0" */
+
+ ret = pwm_register("/dev/pwm0", pwm);
+ if (ret < 0)
+ {
+ adbg("pwm_register failed: %d\n", ret);
+ }
+}
+
+#endif /* HAVE_PWM */
diff --git a/nuttx/include/nuttx/pwm.h b/nuttx/include/nuttx/pwm.h
index eca721d85..a54b7f610 100644
--- a/nuttx/include/nuttx/pwm.h
+++ b/nuttx/include/nuttx/pwm.h
@@ -36,17 +36,17 @@
#ifndef __INCLUDE_NUTTX_PWM_H
#define __INCLUDE_NUTTX_PWM_H
-/* For the purposes of this driver, a PWM device is any devices and generates
- * periodic outputs of controlled frequency and pulse width. Such is device
- * might be use, for example, to perform pulse-width modulated output or
+/* For the purposes of this driver, a PWM device is any device that generates
+ * periodic output pulses s of controlled frequency and pulse width. Such a
+ * device might be used, for example, to perform pulse-width modulated output or
* frequency/pulse-count modulated output (such as might be needed to control
- * a stepper motor.
+ * a stepper motor).
*
* The PWM driver is split into two parts:
*
* 1) An "upper half", generic driver that provides the comman PWM interface
* to application level code, and
- * 2) An "lower half" platform-specific driver that implements the low-level
+ * 2) A "lower half", platform-specific driver that implements the low-level
* timer controls to implement the PWM functionality.
*/