From c5171a64652771c5c835754ef65f9cef7d78aa76 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 4 May 2015 11:57:31 +0200 Subject: Add STM32F1 support --- ucoo/hal/gpio/Module | 2 +- ucoo/hal/gpio/gpio.hh | 2 + ucoo/hal/gpio/gpio.stm32f1.cc | 128 ++++++++++++++++++++++++++++++++ ucoo/hal/gpio/gpio.stm32f1.hh | 106 ++++++++++++++++++++++++++ ucoo/hal/gpio/test/Makefile | 6 +- ucoo/hal/gpio/test/test_gpio.cc | 71 ------------------ ucoo/hal/gpio/test/test_gpio.stm32f1.cc | 65 ++++++++++++++++ ucoo/hal/gpio/test/test_gpio.stm32f4.cc | 71 ++++++++++++++++++ ucoo/hal/i2c/i2c_hard.stm32.cc | 10 +-- ucoo/hal/uart/uart.stm32.cc | 15 ++-- ucoo/hal/usb/test/Makefile | 2 +- ucoo/hal/usb/usb.stm32.cc | 26 +++++-- 12 files changed, 406 insertions(+), 98 deletions(-) create mode 100644 ucoo/hal/gpio/gpio.stm32f1.cc create mode 100644 ucoo/hal/gpio/gpio.stm32f1.hh delete mode 100644 ucoo/hal/gpio/test/test_gpio.cc create mode 100644 ucoo/hal/gpio/test/test_gpio.stm32f1.cc create mode 100644 ucoo/hal/gpio/test/test_gpio.stm32f4.cc (limited to 'ucoo/hal') diff --git a/ucoo/hal/gpio/Module b/ucoo/hal/gpio/Module index 8f2ba40..e5ccdec 100644 --- a/ucoo/hal/gpio/Module +++ b/ucoo/hal/gpio/Module @@ -1 +1 @@ -hal_gpio_SOURCES = gpio.host.cc gpio.stm32f4.cc +hal_gpio_SOURCES = gpio.host.cc gpio.stm32f4.cc gpio.stm32f1.cc diff --git a/ucoo/hal/gpio/gpio.hh b/ucoo/hal/gpio/gpio.hh index 86a6c91..51dca7e 100644 --- a/ucoo/hal/gpio/gpio.hh +++ b/ucoo/hal/gpio/gpio.hh @@ -28,6 +28,8 @@ # include "gpio.host.hh" #elif defined TARGET_stm32f4 # include "gpio.stm32f4.hh" +#elif defined TARGET_stm32f1 +# include "gpio.stm32f1.hh" #else # error "not implemented for this target" #endif diff --git a/ucoo/hal/gpio/gpio.stm32f1.cc b/ucoo/hal/gpio/gpio.stm32f1.cc new file mode 100644 index 0000000..0e6c7ee --- /dev/null +++ b/ucoo/hal/gpio/gpio.stm32f1.cc @@ -0,0 +1,128 @@ +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2015 Nicolas Schodet +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// }}} +#include "gpio.stm32f1.hh" + +namespace ucoo { + +void +Gpio::set () +{ + GPIO_BSRR (port_) = mask_; +} + +void +Gpio::reset () +{ + GPIO_BRR (port_) = mask_; +} + +/// Helper to avoid virtual dance. +static inline void +Gpio_set (uint32_t port, uint16_t mask, bool state) +{ + if (state) + GPIO_BSRR (port) = mask; + else + GPIO_BRR (port) = mask; +} + +void +Gpio::set (bool state) +{ + Gpio_set (port_, mask_, state); +} + +void +Gpio::toggle () +{ + // Avoid read/modify/write ODR, to achieve atomic operation. + Gpio_set (port_, mask_, !(GPIO_ODR (port_) & mask_)); +} + +bool +Gpio::get () const +{ + return GPIO_IDR (port_) & mask_; +} + +/// Set four bits in a register for the corresponding one-bit mask. +static uint32_t +qmask_set (uint32_t mask, uint32_t reg, uint32_t bits) +{ + uint32_t dmask = mask * mask; + uint32_t qmask = dmask * dmask; + uint32_t qmask2 = qmask | qmask << 1; + reg &= ~(qmask2 | qmask2 << 2); + reg |= bits * qmask; + return reg; +} + +void +Gpio::input () +{ + uint32_t cnf_mode = static_cast (input_cnf_) | GPIO_MODE_INPUT; + if (mask_ & 0xff) + GPIO_CRL (port_) = qmask_set (mask_, GPIO_CRL (port_), cnf_mode); + else + GPIO_CRH (port_) = qmask_set (mask_ >> 8, GPIO_CRH (port_), cnf_mode); + output_ = false; +} + +void +Gpio::output () +{ + uint32_t cnf_mode = static_cast (output_cnf_) + | static_cast (speed_); + if (mask_ & 0xff) + GPIO_CRL (port_) = qmask_set (mask_, GPIO_CRL (port_), cnf_mode); + else + GPIO_CRH (port_) = qmask_set (mask_ >> 8, GPIO_CRH (port_), cnf_mode); + output_ = true; +} + +void +Gpio::input_cnf (InputCnf cnf) +{ + input_cnf_ = cnf; + if (!output_) + input (); +} + +void +Gpio::output_cnf (OutputCnf cnf) +{ + output_cnf_ = cnf; + if (output_) + output (); +} + +void +Gpio::speed (Speed s) +{ + speed_ = s; + if (output_) + output (); +} + +} // namespace ucoo diff --git a/ucoo/hal/gpio/gpio.stm32f1.hh b/ucoo/hal/gpio/gpio.stm32f1.hh new file mode 100644 index 0000000..7673998 --- /dev/null +++ b/ucoo/hal/gpio/gpio.stm32f1.hh @@ -0,0 +1,106 @@ +#ifndef ucoo_hal_gpio_gpio_stm32f1_hh +#define ucoo_hal_gpio_gpio_stm32f1_hh +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2015 Nicolas Schodet +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// }}} +#include "ucoo/intf/io.hh" + +#include + +namespace ucoo { + +/// General purpose input/output on STM32F1. +class Gpio : public Io +{ + public: + enum class InputCnf : uint8_t + { + ANALOG = GPIO_CNF_INPUT_ANALOG << 2, + FLOAT = GPIO_CNF_INPUT_FLOAT << 2, + // Up/Down is selected using output register. + PULL_UPDOWN = GPIO_CNF_INPUT_PULL_UPDOWN << 2, + }; + enum class OutputCnf : uint8_t + { + PUSHPULL = GPIO_CNF_OUTPUT_PUSHPULL << 2, + OPENDRAIN = GPIO_CNF_OUTPUT_OPENDRAIN << 2, + ALTFN_PUSH_PULL = GPIO_CNF_OUTPUT_ALTFN_PUSHPULL << 2, + ALTFN_OPENDRAIN = GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN << 2, + }; + enum class Speed : uint8_t + { + SPEED_2MHZ = GPIO_MODE_OUTPUT_2_MHZ, + SPEED_10MHZ = GPIO_MODE_OUTPUT_10_MHZ, + SPEED_50MHZ = GPIO_MODE_OUTPUT_50_MHZ, + }; + public: + /// Constructor, take the PORT base address, and pin BIT number. + Gpio (uint32_t port, int bit); + /// See Io::set. + void set (); + /// See Io::reset. + void reset (); + /// See Io::set. + void set (bool state); + /// See Io::toggle. + void toggle (); + /// See Io::get. + bool get () const; + /// See Io::input. + void input (); + /// See Io::output. + void output (); + /// Set input configuration, used when port is input. + void input_cnf (InputCnf cnf); + /// Set output configuration, used when port is output. + void output_cnf (OutputCnf cnf); + /// Set output speed. + void speed (Speed s); + private: + /// Port register base address. + const uint32_t port_; + /// IO bitmask. + const uint16_t mask_; + /// Configuration for input. + InputCnf input_cnf_; + /// Configuration for output. + OutputCnf output_cnf_; + /// Speed for output. + Speed speed_; + /// Current intput/output state. + bool output_; +}; + +inline +Gpio::Gpio (uint32_t port, int bit) + : port_ (port), mask_ (1u << bit), + input_cnf_ (InputCnf::FLOAT), + output_cnf_ (OutputCnf::PUSHPULL), + speed_ (Speed::SPEED_10MHZ), + output_ (false) +{ +} + +} // namespace ucoo + +#endif // ucoo_hal_gpio_gpio_stm32f1_hh diff --git a/ucoo/hal/gpio/test/Makefile b/ucoo/hal/gpio/test/Makefile index e2f7692..68e4c1f 100644 --- a/ucoo/hal/gpio/test/Makefile +++ b/ucoo/hal/gpio/test/Makefile @@ -1,8 +1,8 @@ BASE = ../../../.. -TARGETS = stm32f4 -stm32f4_PROGS = test_gpio -test_gpio_SOURCES = test_gpio.cc +TARGETS = stm32f4 stm32f1 +PROGS = test_gpio +test_gpio_SOURCES = test_gpio.stm32f4.cc test_gpio.stm32f1.cc MODULES = hal/gpio utils diff --git a/ucoo/hal/gpio/test/test_gpio.cc b/ucoo/hal/gpio/test/test_gpio.cc deleted file mode 100644 index a51017c..0000000 --- a/ucoo/hal/gpio/test/test_gpio.cc +++ /dev/null @@ -1,71 +0,0 @@ -// ucoolib - Microcontroller object oriented library. {{{ -// -// Copyright (C) 2012 Nicolas Schodet -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// }}} -#include "ucoo/arch/arch.hh" -#include "ucoo/hal/gpio/gpio.hh" -#include "ucoo/utils/delay.hh" - -#include - -void -test (ucoo::Io &loop_out, ucoo::Io &loop_in, ucoo::Io &led3, ucoo::Io &led4, - ucoo::Io &led5, ucoo::Io &led6) -{ - loop_in.input (); - loop_out.output (); - led3.output (); - led4.output (); - led5.output (); - led6.output (); - led3.set (); - led6.reset (); - bool state = false; - while (1) - { - led3.toggle (); - led4.set (state); - led5.set (loop_in.get ()); - led6.toggle (); - state = !state; - loop_out.set (state); - ucoo::delay (1); - } -} - -int -main (int argc, const char **argv) -{ - ucoo::arch_init (argc, argv); - rcc_periph_clock_enable (RCC_GPIOB); - rcc_periph_clock_enable (RCC_GPIOD); - // For this test, shorten B6 & B7 to have loopback. - gpio_mode_setup (GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO7); - ucoo::Gpio loop_out (GPIOB, 6); - ucoo::Gpio loop_in (GPIOB, 7); - ucoo::Gpio led3 (GPIOD, 13); - ucoo::Gpio led4 (GPIOD, 12); - ucoo::Gpio led5 (GPIOD, 14); - ucoo::Gpio led6 (GPIOD, 15); - test (loop_out, loop_in, led3, led4, led5, led6); - return 0; -} diff --git a/ucoo/hal/gpio/test/test_gpio.stm32f1.cc b/ucoo/hal/gpio/test/test_gpio.stm32f1.cc new file mode 100644 index 0000000..0135a32 --- /dev/null +++ b/ucoo/hal/gpio/test/test_gpio.stm32f1.cc @@ -0,0 +1,65 @@ +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2015 Nicolas Schodet +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// }}} +#include "ucoo/arch/arch.hh" +#include "ucoo/hal/gpio/gpio.hh" +#include "ucoo/utils/delay.hh" + +#include + +void +test (ucoo::Io &loop_in, ucoo::Io &led1, ucoo::Io &led2, ucoo::Io &led3, + ucoo::Io &led4) +{ + loop_in.input (); + led1.output (); + led2.output (); + led3.output (); + led4.output (); + led1.set (); + led4.reset (); + bool state = false; + while (1) + { + led1.toggle (); + led2.set (state); + led3.set (loop_in.get ()); + led4.toggle (); + state = !state; + ucoo::delay (1); + } +} + +int +main (int argc, const char **argv) +{ + ucoo::arch_init (argc, argv); + rcc_periph_clock_enable (RCC_GPIOC); + ucoo::Gpio loop_in (GPIOC, 5); + ucoo::Gpio led1 (GPIOC, 6); + ucoo::Gpio led2 (GPIOC, 7); + ucoo::Gpio led3 (GPIOC, 8); + ucoo::Gpio led4 (GPIOC, 9); + test (loop_in, led1, led2, led3, led4); + return 0; +} diff --git a/ucoo/hal/gpio/test/test_gpio.stm32f4.cc b/ucoo/hal/gpio/test/test_gpio.stm32f4.cc new file mode 100644 index 0000000..a51017c --- /dev/null +++ b/ucoo/hal/gpio/test/test_gpio.stm32f4.cc @@ -0,0 +1,71 @@ +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2012 Nicolas Schodet +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// }}} +#include "ucoo/arch/arch.hh" +#include "ucoo/hal/gpio/gpio.hh" +#include "ucoo/utils/delay.hh" + +#include + +void +test (ucoo::Io &loop_out, ucoo::Io &loop_in, ucoo::Io &led3, ucoo::Io &led4, + ucoo::Io &led5, ucoo::Io &led6) +{ + loop_in.input (); + loop_out.output (); + led3.output (); + led4.output (); + led5.output (); + led6.output (); + led3.set (); + led6.reset (); + bool state = false; + while (1) + { + led3.toggle (); + led4.set (state); + led5.set (loop_in.get ()); + led6.toggle (); + state = !state; + loop_out.set (state); + ucoo::delay (1); + } +} + +int +main (int argc, const char **argv) +{ + ucoo::arch_init (argc, argv); + rcc_periph_clock_enable (RCC_GPIOB); + rcc_periph_clock_enable (RCC_GPIOD); + // For this test, shorten B6 & B7 to have loopback. + gpio_mode_setup (GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO7); + ucoo::Gpio loop_out (GPIOB, 6); + ucoo::Gpio loop_in (GPIOB, 7); + ucoo::Gpio led3 (GPIOD, 13); + ucoo::Gpio led4 (GPIOD, 12); + ucoo::Gpio led5 (GPIOD, 14); + ucoo::Gpio led6 (GPIOD, 15); + test (loop_out, loop_in, led3, led4, led5, led6); + return 0; +} diff --git a/ucoo/hal/i2c/i2c_hard.stm32.cc b/ucoo/hal/i2c/i2c_hard.stm32.cc index 6cadf8b..9afe241 100644 --- a/ucoo/hal/i2c/i2c_hard.stm32.cc +++ b/ucoo/hal/i2c/i2c_hard.stm32.cc @@ -34,8 +34,6 @@ namespace ucoo { /// Local trace. static Trace i2c_trace; -static const int i2c_nb = 3; - /// Information on I2C hardware structure. struct i2c_hardware_t { @@ -49,14 +47,16 @@ struct i2c_hardware_t /// Information on I2C hardware array, this is zero indexed, I2C1 is at index /// 0. -static const i2c_hardware_t i2c_hardware[i2c_nb] = +static const i2c_hardware_t i2c_hardware[] = { { I2C1_BASE, RCC_I2C1, NVIC_I2C1_EV_IRQ }, { I2C2_BASE, RCC_I2C2, NVIC_I2C2_EV_IRQ }, +#ifdef I2C3_BASE { I2C3_BASE, RCC_I2C3, NVIC_I2C3_EV_IRQ }, +#endif }; -static I2cHard *i2c_instances[i2c_nb]; +static I2cHard *i2c_instances[lengthof (i2c_hardware)]; } // namespace ucoo @@ -82,7 +82,7 @@ I2cHard::I2cHard (int n) : n_ (n), enabled_ (false), slave_addr_ (0), slave_data_handler_ (0), master_ (false), master_status_ (STATUS_ERROR), master_buf_ (0) { - assert (n < i2c_nb); + assert (n < lengthof (i2c_instances)); assert (!i2c_instances[n]); i2c_instances[n] = this; } diff --git a/ucoo/hal/uart/uart.stm32.cc b/ucoo/hal/uart/uart.stm32.cc index 4b02bf6..96e726d 100644 --- a/ucoo/hal/uart/uart.stm32.cc +++ b/ucoo/hal/uart/uart.stm32.cc @@ -27,15 +27,8 @@ #include #include -#ifndef TARGET_stm32f4 -// Need RCC adaptations and USART6 different handling for F1. -# error "it's a trap, only implemented for F4 for the moment" -#endif - namespace ucoo { -static const int uart_nb = 6; - /// Information on UART hardware structure. struct uart_hardware_t { @@ -51,17 +44,19 @@ struct uart_hardware_t /// Information on UART hardware array, this is zero indexed, USART1 is at /// index 0. -static const uart_hardware_t uart_hardware[uart_nb] = +static const uart_hardware_t uart_hardware[] = { { USART1, 2, RCC_USART1, NVIC_USART1_IRQ }, { USART2, 1, RCC_USART2, NVIC_USART2_IRQ }, { USART3, 1, RCC_USART3, NVIC_USART3_IRQ }, { UART4, 1, RCC_UART4, NVIC_UART4_IRQ }, { UART5, 1, RCC_UART5, NVIC_UART5_IRQ }, +#ifdef USART6 { USART6, 2, RCC_USART6, NVIC_USART6_IRQ }, +#endif }; -static Uart *uart_instances[uart_nb]; +static Uart *uart_instances[lengthof (uart_hardware)]; } // namespace ucoo @@ -86,7 +81,7 @@ namespace ucoo { Uart::Uart (int n) : n_ (n), error_char_ (default_error_char), enabled_ (false) { - assert (n < uart_nb); + assert (n < lengthof (uart_instances)); assert (!uart_instances[n]); uart_instances[n] = this; } diff --git a/ucoo/hal/usb/test/Makefile b/ucoo/hal/usb/test/Makefile index cec9ded..9ef0eab 100644 --- a/ucoo/hal/usb/test/Makefile +++ b/ucoo/hal/usb/test/Makefile @@ -1,7 +1,7 @@ BASE = ../../../.. TARGETS = stm32f4 -stm32f4_PROGS = test_usb +PROGS = test_usb test_usb_SOURCES = test_usb.cc MODULES = hal/usb diff --git a/ucoo/hal/usb/usb.stm32.cc b/ucoo/hal/usb/usb.stm32.cc index 79f73d2..37595e8 100644 --- a/ucoo/hal/usb/usb.stm32.cc +++ b/ucoo/hal/usb/usb.stm32.cc @@ -30,12 +30,19 @@ #include "usb_desc.stm32.h" -#if UCOO_CONFIG_HAL_USB_DRIVER_HS -# define usb_isr otg_hs_isr -# define usb_driver otghs_usb_driver +#if defined (TARGET_stm32f4) +# if UCOO_CONFIG_HAL_USB_DRIVER_HS +# define usb_isr otg_hs_isr +# define usb_driver otghs_usb_driver +# else +# define usb_isr otg_fs_isr +# define usb_driver otgfs_usb_driver +# endif +#elif defined (TARGET_stm32f1) +# define usb_isr otg_fs_isr +# define usb_driver otgfs_usb_driver #else -# define usb_isr otg_fs_isr -# define usb_driver otgfs_usb_driver +# error "not implemented for this target" #endif static usbd_device *usbdev; @@ -74,18 +81,23 @@ UsbStreamControl::UsbStreamControl (const char *vendor, const char *product) instance_ = this; strings[0] = vendor; strings[1] = product; -#if UCOO_CONFIG_HAL_USB_DRIVER_HS +#if defined (TARGET_stm32f4) +# if UCOO_CONFIG_HAL_USB_DRIVER_HS rcc_periph_clock_enable (RCC_OTGHS); rcc_periph_clock_enable (RCC_GPIOB); gpio_mode_setup (GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO13 | GPIO14 | GPIO15); gpio_set_af (GPIOB, GPIO_AF12, GPIO13 | GPIO14 | GPIO15); -#else +# else rcc_periph_clock_enable (RCC_OTGFS); rcc_periph_clock_enable (RCC_GPIOA); gpio_mode_setup (GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9 | GPIO11 | GPIO12); gpio_set_af (GPIOA, GPIO_AF10, GPIO9 | GPIO11 | GPIO12); +# endif +#elif defined (TARGET_stm32f1) + rcc_periph_clock_enable (RCC_OTGFS); + rcc_periph_clock_enable (RCC_GPIOA); #endif usbdev = usbd_init (&usb_driver, &usb_desc_dev, &usb_desc_config, strings, lengthof (strings), -- cgit v1.2.3