This is an automated email from the ASF dual-hosted git repository. jerpelea pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 35471e33dc0faebdb96b0e2d92896c1627dc73e0 Author: Matias Nitsche <[email protected]> AuthorDate: Fri May 8 15:10:02 2020 -0300 stm32: move ssd1306 and tone driver handling to common board logic --- boards/arm/stm32/common/include/stm32_ssd1306.h | 96 +++++++++++++ boards/arm/stm32/common/include/stm32_tone.h | 84 ++++++++++++ boards/arm/stm32/common/src/Make.defs | 8 ++ boards/arm/stm32/common/src/stm32_ssd1306.c | 128 +++++++++++++++++ boards/arm/stm32/common/src/stm32_tone.c | 133 ++++++++++++++++++ .../nucleo-f303ze/src/{Makefile => Make.defs} | 6 +- .../src/{stm32_ssd1306.c => stm32_lcd.c} | 40 ++---- boards/arm/stm32/stm32f103-minimum/src/Make.defs | 8 +- .../stm32/stm32f103-minimum/src/stm32_bringup.c | 20 ++- .../src/{stm32_ssd1306.c => stm32_lcd_ssd1306.c} | 45 ++---- .../src/{stm32_lcd.c => stm32_lcd_st7567.c} | 0 .../arm/stm32/stm32f103-minimum/src/stm32_tone.c | 151 --------------------- 12 files changed, 491 insertions(+), 228 deletions(-) diff --git a/boards/arm/stm32/common/include/stm32_ssd1306.h b/boards/arm/stm32/common/include/stm32_ssd1306.h new file mode 100644 index 0000000..cac37a3 --- /dev/null +++ b/boards/arm/stm32/common/include/stm32_ssd1306.h @@ -0,0 +1,96 @@ +/**************************************************************************** + * boards/arm/stm32/common/include/stm32_ssd1306.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __STM32_SSD1306_H +#define __STM32_SSD1306_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Type Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_ssd1306_initialize + * + * Description: + * Initialize and register the device + * + * Input Parameters: + * busno - The I2C bus number + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_ssd1306_initialize(int busno); + +/**************************************************************************** + * Name: board_ssd1306_getdev + * + * Description: + * Get the SSD1306 device driver instance + * + * Returned Value: + * Pointer to the instance + * + ****************************************************************************/ + +FAR struct lcd_dev_s *board_ssd1306_getdev(void); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif // __STM32_SSD1306_H diff --git a/boards/arm/stm32/common/include/stm32_tone.h b/boards/arm/stm32/common/include/stm32_tone.h new file mode 100644 index 0000000..517db85 --- /dev/null +++ b/boards/arm/stm32/common/include/stm32_tone.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * boards/arm/stm32/common/include/stm32_tone.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __STM32_TONE_H +#define __STM32_TONE_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +struct board_tone_config_s +{ + int pwm_timer; /* PWM timer number for tone generation */ + int oneshot_timer; /* Oneshot timer for note intervals */ + int oneshot_timer_resolution; /* Oneshot timer resolution in us */ +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_tone_initialize + * + * Input Parameters: + * cfg - Configuration for the driver + * devno - The device number, used to build the device path as /dev/toneN + * + * Description: + * Configure and initialize the tone generator. + * + ****************************************************************************/ + +int board_tone_initialize(FAR struct board_tone_config_s *cfg, int devno); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif // __STM32_TONE_H diff --git a/boards/arm/stm32/common/src/Make.defs b/boards/arm/stm32/common/src/Make.defs index 58951f5..c308f1a 100644 --- a/boards/arm/stm32/common/src/Make.defs +++ b/boards/arm/stm32/common/src/Make.defs @@ -38,6 +38,14 @@ ifeq ($(CONFIG_INPUT_NUNCHUCK),y) CSRCS += stm32_nunchuck.c endif +ifeq ($(CONFIG_AUDIO_TONE),y) + CSRCS += stm32_tone.c +endif + +ifeq ($(CONFIG_LCD_SSD1306),y) + CSRCS += stm32_ssd1306.c +endif + DEPPATH += --dep-path src VPATH += :src CFLAGS += $(shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src) diff --git a/boards/arm/stm32/common/src/stm32_ssd1306.c b/boards/arm/stm32/common/src/stm32_ssd1306.c new file mode 100644 index 0000000..a9ee58e --- /dev/null +++ b/boards/arm/stm32/common/src/stm32_ssd1306.c @@ -0,0 +1,128 @@ +/**************************************************************************** + * boards/arm/stm32/common/src/stm32_ssd1306.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <debug.h> + +#include <nuttx/board.h> +#include <nuttx/lcd/lcd.h> +#include <nuttx/lcd/ssd1306.h> +#include <nuttx/i2c/i2c_master.h> + +#include "stm32.h" +#include "stm32_i2c.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +FAR struct lcd_dev_s *g_lcddev; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_ssd1306_initialize + * + * Description: + * Initialize and register the device + * + * Input Parameters: + * busno - The I2C bus number + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_ssd1306_initialize(int busno) +{ + FAR struct i2c_master_s* i2c; + + /* Initialize I2C */ + + i2c = stm32_i2cbus_initialize(busno); + if (!i2c) + { + lcderr("ERROR: Failed to initialize I2C port %d\n", OLED_I2C_PORT); + return -ENODEV; + } + + /* Bind the I2C port to the OLED */ + + g_lcddev = ssd1306_initialize(i2c, NULL, 0); + if (!g_lcddev) + { + lcderr("ERROR: Failed to bind I2C port 1 to OLED %d: %d\n", devno); + return -ENODEV; + } + else + { + lcdinfo("Bound I2C port %d to OLED %d\n", OLED_I2C_PORT, devno); + + /* And turn the OLED on */ + + g_lcddev->setpower(g_lcddev, CONFIG_LCD_MAXPOWER); + return OK; + } +} + +/**************************************************************************** + * Name: board_ssd1306_getdev + * + * Description: + * Get the SSD1306 device driver instance + * + * Returned Value: + * Pointer to the instance + * + ****************************************************************************/ + +FAR struct lcd_dev_s *board_ssd1306_getdev(void) +{ + return g_lcddev; +} + diff --git a/boards/arm/stm32/common/src/stm32_tone.c b/boards/arm/stm32/common/src/stm32_tone.c new file mode 100644 index 0000000..67ba874 --- /dev/null +++ b/boards/arm/stm32/common/src/stm32_tone.c @@ -0,0 +1,133 @@ +/**************************************************************************** + * boards/arm/stm32/common/src/stm32_tone.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <nuttx/config.h> + +#include <errno.h> +#include <debug.h> +#include <stdio.h> + +#include <nuttx/timers/pwm.h> +#include <nuttx/timers/oneshot.h> +#include <nuttx/audio/tone.h> +#include <arch/board/board.h> + +#include "chip.h" +#include "arm_arch.h" +#include "stm32_pwm.h" +#include "stm32_tone.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_tone_initialize + * + * Input Parameters: + * cfg - Configuration for the driver + * devno - The device number, used to build the device path as /dev/toneN + * + * Description: + * Configure and initialize the tone generator. + * + ****************************************************************************/ + +int board_tone_initialize(FAR struct board_tone_config_s *cfg, int devno) +{ + static bool initialized = false; + struct pwm_lowerhalf_s *tone; + struct oneshot_lowerhalf_s *oneshot = NULL; + int ret; + char devpath[12]; + + /* Have we already initialized? */ + + if (!initialized) + { + /* Call stm32_pwminitialize() to get an instance of the PWM interface */ + + tone = stm32_pwminitialize(cfg->pwm_timer); + if (!tone) + { + auderr("Failed to get the STM32 PWM lower half to AUDIO TONE\n"); + return -ENODEV; + } + + /* Initialize TONE PWM */ + + tone->ops->setup(tone); + + /* Initialize ONESHOT Timer */ + + oneshot = oneshot_initialize(cfg->oneshot_timer, + cfg->oneshot_timer_resolution); + if (!oneshot) + { + auderr("Failed to initialize ONESHOT Timer!\n"); + return -ENODEV; + } + + /* Register the Audio Tone driver at "/dev/tone0" */ + + snprintf(devpath, 12, "/dev/tone%d", devno); + ret = tone_register(devpath, tone, oneshot); + if (ret < 0) + { + auderr("ERROR: tone_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +} diff --git a/boards/arm/stm32/nucleo-f303ze/src/Makefile b/boards/arm/stm32/nucleo-f303ze/src/Make.defs similarity index 91% rename from boards/arm/stm32/nucleo-f303ze/src/Makefile rename to boards/arm/stm32/nucleo-f303ze/src/Make.defs index 1fecf9b..53fcd29 100644 --- a/boards/arm/stm32/nucleo-f303ze/src/Makefile +++ b/boards/arm/stm32/nucleo-f303ze/src/Make.defs @@ -57,7 +57,9 @@ CSRCS += stm32_adc.c endif ifeq ($(CONFIG_LCD_SSD1306),y) -CSRCS += stm32_ssd1306.c +CSRCS += stm32_lcd.c endif -include $(TOPDIR)/boards/Board.mk +DEPPATH += --dep-path board +VPATH += :board +CFLAGS += $(shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board) diff --git a/boards/arm/stm32/nucleo-f303ze/src/stm32_ssd1306.c b/boards/arm/stm32/nucleo-f303ze/src/stm32_lcd.c similarity index 81% rename from boards/arm/stm32/nucleo-f303ze/src/stm32_ssd1306.c rename to boards/arm/stm32/nucleo-f303ze/src/stm32_lcd.c index b0dc361..710273c 100644 --- a/boards/arm/stm32/nucleo-f303ze/src/stm32_ssd1306.c +++ b/boards/arm/stm32/nucleo-f303ze/src/stm32_lcd.c @@ -49,23 +49,18 @@ #include "stm32.h" #include "nucleo-f303ze.h" +#include "stm32_ssd1306.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -/* Configuration ************************************************************/ - -#ifndef CONFIG_LCD_MAXPOWER -# define CONFIG_LCD_MAXPOWER 1 -#endif +#define OLED_I2C_PORT 1 /* OLED display connected to I2C1 */ /**************************************************************************** * Private Data ****************************************************************************/ -FAR struct i2c_master_s *g_i2c; -FAR struct lcd_dev_s *g_lcddev; - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -76,13 +71,13 @@ FAR struct lcd_dev_s *g_lcddev; int board_lcd_initialize(void) { - /* Initialize I2C */ + int ret; - g_i2c = stm32_i2cbus_initialize(OLED_I2C_PORT); - if (!g_i2c) + ret = board_ssd1306_initialize(OLED_I2C_PORT); + if (ret < 0) { - lcderr("ERROR: Failed to initialize I2C port %d\n", OLED_I2C_PORT); - return -ENODEV; + lcderr("ERROR: Failed to initialize SSD1306\n"); + return ret; } return OK; @@ -94,24 +89,7 @@ int board_lcd_initialize(void) FAR struct lcd_dev_s *board_lcd_getdev(int devno) { - /* Bind the I2C port to the OLED */ - - g_lcddev = ssd1306_initialize(g_i2c, NULL, devno); - if (!g_lcddev) - { - lcderr("ERROR: Failed to bind I2C port 1 to OLED %d: %d\n", devno); - } - else - { - lcdinfo("Bound I2C port %d to OLED %d\n", OLED_I2C_PORT, devno); - - /* And turn the OLED on */ - - g_lcddev->setpower(g_lcddev, CONFIG_LCD_MAXPOWER); - return g_lcddev; - } - - return NULL; + return board_ssd1306_getdev(); } /**************************************************************************** diff --git a/boards/arm/stm32/stm32f103-minimum/src/Make.defs b/boards/arm/stm32/stm32f103-minimum/src/Make.defs index b4bf184..ee01d76 100644 --- a/boards/arm/stm32/stm32f103-minimum/src/Make.defs +++ b/boards/arm/stm32/stm32f103-minimum/src/Make.defs @@ -95,10 +95,6 @@ CSRCS += stm32_at24.c endif endif -ifeq ($(CONFIG_AUDIO_TONE),y) - CSRCS += stm32_tone.c -endif - ifeq ($(CONFIG_CAN_MCP2515),y) CSRCS += stm32_mcp2515.c endif @@ -120,11 +116,11 @@ ifeq ($(CONFIG_INPUT_NUNCHUCK),y) endif ifeq ($(CONFIG_LCD_SSD1306_I2C),y) -CSRCS += stm32_ssd1306.c +CSRCS += stm32_lcd_ssd1306.c endif ifeq ($(CONFIG_LCD_ST7567),y) - CSRCS += stm32_lcd.c + CSRCS += stm32_lcd_st7567.c endif ifeq ($(CONFIG_LCD_PCD8544),y) diff --git a/boards/arm/stm32/stm32f103-minimum/src/stm32_bringup.c b/boards/arm/stm32/stm32f103-minimum/src/stm32_bringup.c index 7ed51ff..f9cacd3 100644 --- a/boards/arm/stm32/stm32f103-minimum/src/stm32_bringup.c +++ b/boards/arm/stm32/stm32f103-minimum/src/stm32_bringup.c @@ -105,6 +105,11 @@ #include "stm32_nunchuck.h" #endif +#ifdef CONFIG_AUDIO_TONE +#include "stm32_tone.h" +#endif + + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -140,6 +145,19 @@ #endif /**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef CONFIG_AUDIO_TONE +struct board_tone_config_s g_tone_cfg = +{ + .pwm_timer = 2, + .oneshot_timer = 3, + .oneshot_timer_resolution = 10 +}; +#endif + +/**************************************************************************** * Public Functions ****************************************************************************/ @@ -270,7 +288,7 @@ int stm32_bringup(void) #ifdef CONFIG_AUDIO_TONE /* Configure and initialize the tone generator. */ - ret = stm32_tone_setup(); + ret = board_tone_initialize(&g_tone_cfg, 0); if (ret < 0) { syslog(LOG_ERR, "ERROR: stm32_tone_setup() failed: %d\n", ret); diff --git a/boards/arm/stm32/stm32f103-minimum/src/stm32_ssd1306.c b/boards/arm/stm32/stm32f103-minimum/src/stm32_lcd_ssd1306.c similarity index 78% rename from boards/arm/stm32/stm32f103-minimum/src/stm32_ssd1306.c rename to boards/arm/stm32/stm32f103-minimum/src/stm32_lcd_ssd1306.c index 585207b..acde9ec 100644 --- a/boards/arm/stm32/stm32f103-minimum/src/stm32_ssd1306.c +++ b/boards/arm/stm32/stm32f103-minimum/src/stm32_lcd_ssd1306.c @@ -44,24 +44,15 @@ #include <nuttx/board.h> #include <nuttx/lcd/lcd.h> #include <nuttx/lcd/ssd1306.h> -#include <nuttx/i2c/i2c_master.h> #include "stm32.h" -#include "stm32_i2c.h" #include "stm32f103_minimum.h" +#include "stm32_ssd1306.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -/* Configuration ************************************************************/ - -#ifndef CONFIG_LCD_SSD1306 -# error "The OLED driver requires CONFIG_LCD_SSD1306 in the configuration" -#endif - -#ifndef CONFIG_LCD_MAXPOWER -# define CONFIG_LCD_MAXPOWER 1 -#endif #define OLED_I2C_PORT 1 /* OLED display connected to I2C1 */ @@ -69,9 +60,6 @@ * Private Data ****************************************************************************/ -FAR struct i2c_master_s *g_i2c; -FAR struct lcd_dev_s *g_lcddev; - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -82,13 +70,13 @@ FAR struct lcd_dev_s *g_lcddev; int board_lcd_initialize(void) { - /* Initialize I2C */ + int ret; - g_i2c = stm32_i2cbus_initialize(OLED_I2C_PORT); - if (!g_i2c) + ret = board_ssd1306_initialize(OLED_I2C_PORT); + if (ret < 0) { - lcderr("ERROR: Failed to initialize I2C port %d\n", OLED_I2C_PORT); - return -ENODEV; + lcderr("ERROR: Failed to initialize SSD1306\n"); + return ret; } return OK; @@ -100,24 +88,7 @@ int board_lcd_initialize(void) FAR struct lcd_dev_s *board_lcd_getdev(int devno) { - /* Bind the I2C port to the OLED */ - - g_lcddev = ssd1306_initialize(g_i2c, NULL, devno); - if (!g_lcddev) - { - lcderr("ERROR: Failed to bind I2C port 1 to OLED %d: %d\n", devno); - } - else - { - lcdinfo("Bound I2C port %d to OLED %d\n", OLED_I2C_PORT, devno); - - /* And turn the OLED on */ - - g_lcddev->setpower(g_lcddev, CONFIG_LCD_MAXPOWER); - return g_lcddev; - } - - return NULL; + return board_ssd1306_getdev(); } /**************************************************************************** diff --git a/boards/arm/stm32/stm32f103-minimum/src/stm32_lcd.c b/boards/arm/stm32/stm32f103-minimum/src/stm32_lcd_st7567.c similarity index 100% rename from boards/arm/stm32/stm32f103-minimum/src/stm32_lcd.c rename to boards/arm/stm32/stm32f103-minimum/src/stm32_lcd_st7567.c diff --git a/boards/arm/stm32/stm32f103-minimum/src/stm32_tone.c b/boards/arm/stm32/stm32f103-minimum/src/stm32_tone.c deleted file mode 100644 index a06886d..0000000 --- a/boards/arm/stm32/stm32f103-minimum/src/stm32_tone.c +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************** - * boards/arm/stm32/stm32f103minimum/src/stm32_tone.c - * - * Copyright (C) 2016 Gregory Nutt. All rights reserved. - * Author: Alan Carvalho de Assis <[email protected]> - * - * 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 <errno.h> -#include <debug.h> - -#include <nuttx/timers/pwm.h> -#include <nuttx/timers/oneshot.h> -#include <nuttx/audio/tone.h> -#include <arch/board/board.h> - -#include "chip.h" -#include "arm_arch.h" -#include "stm32_pwm.h" -#include "stm32f103_minimum.h" - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* Configuration ************************************************************/ - -#define HAVE_TONE 1 - -/* TIMx used to generate PWM signal to Buzzer/Speaker */ - -#define TONE_PWM_TIMER 2 - -/* TIMx used to generate oneshot */ - -#define ONESHOT_TIMER 3 - -/* Oneshot timer resolution in microseconds */ - -#define OST_RES 10 - -#ifndef CONFIG_PWM -# undef HAVE_TONE -#endif - -#ifndef CONFIG_STM32_TIM2 -# undef HAVE_TONE -#endif - -#ifndef CONFIG_STM32_TIM2_PWM -# undef HAVE_TONE -#endif - -#ifdef HAVE_TONE - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: stm32_tone_setup - * - * Description: - * Configure and initialize the tone generator. - * - ****************************************************************************/ - -int stm32_tone_setup(void) -{ - static bool initialized = false; - struct pwm_lowerhalf_s *tone; - struct oneshot_lowerhalf_s *oneshot = NULL; - int ret; - - /* Have we already initialized? */ - - if (!initialized) - { - /* Call stm32_pwminitialize() to get an instance of the PWM interface */ - - tone = stm32_pwminitialize(TONE_PWM_TIMER); - if (!tone) - { - auderr("Failed to get the STM32 PWM lower half to AUDIO TONE\n"); - return -ENODEV; - } - - /* Initialize TONE PWM */ - - tone->ops->setup(tone); - - /* Initialize ONESHOT Timer */ - - oneshot = oneshot_initialize(ONESHOT_TIMER, OST_RES); - if (!oneshot) - { - auderr("Failed to initialize ONESHOT Timer!\n"); - return -ENODEV; - } - - /* Register the Audio Tone driver at "/dev/tone0" */ - - ret = tone_register("/dev/tone0", tone, oneshot); - if (ret < 0) - { - auderr("ERROR: tone_register failed: %d\n", ret); - return ret; - } - - /* Now we are initialized */ - - initialized = true; - } - - return OK; -} - -#endif /* HAVE_TONE */
