From 6b47dac54b478081231b88e6e143a150f341c0cb Mon Sep 17 00:00:00 2001 From: Marti Bolivar Date: Wed, 15 Oct 2014 14:37:20 +0800 Subject: Add STM32F2 I2C support. Untested, but fixes the build and at least provides the correct register map and base pointers. Signed-off-by: Marti Bolivar --- libmaple/include/libmaple/i2c.h | 15 +----- libmaple/stm32f1/include/series/i2c.h | 13 ++++- libmaple/stm32f2/i2c.c | 99 +++++++++++++++++++++++++++++++++++ libmaple/stm32f2/include/series/i2c.h | 80 ++++++++++++++++++++++++++++ 4 files changed, 193 insertions(+), 14 deletions(-) create mode 100644 libmaple/stm32f2/i2c.c create mode 100644 libmaple/stm32f2/include/series/i2c.h (limited to 'libmaple') diff --git a/libmaple/include/libmaple/i2c.h b/libmaple/include/libmaple/i2c.h index ff1c313..b198bfa 100644 --- a/libmaple/include/libmaple/i2c.h +++ b/libmaple/include/libmaple/i2c.h @@ -47,6 +47,8 @@ extern "C" { /* * Series header must provide: * + * - struct i2c_reg_map + * * - uint32 _i2c_bus_clk(i2c_dev*): Clock frequency of dev's bus, in * MHz. (This is for internal use only). * @@ -72,19 +74,6 @@ extern "C" { #include #include -/** I2C register map type */ -typedef struct i2c_reg_map { - __io uint32 CR1; /**< Control register 1 */ - __io uint32 CR2; /**< Control register 2 */ - __io uint32 OAR1; /**< Own address register 1 */ - __io uint32 OAR2; /**< Own address register 2 */ - __io uint32 DR; /**< Data register */ - __io uint32 SR1; /**< Status register 1 */ - __io uint32 SR2; /**< Status register 2 */ - __io uint32 CCR; /**< Clock control register */ - __io uint32 TRISE; /**< TRISE (rise time) register */ -} i2c_reg_map; - /** * @brief I2C message type */ diff --git a/libmaple/stm32f1/include/series/i2c.h b/libmaple/stm32f1/include/series/i2c.h index f407955..ae05377 100644 --- a/libmaple/stm32f1/include/series/i2c.h +++ b/libmaple/stm32f1/include/series/i2c.h @@ -41,7 +41,18 @@ * Register maps */ -struct i2c_reg_map; +/** I2C register map type */ +typedef struct i2c_reg_map { + __io uint32 CR1; /**< Control register 1 */ + __io uint32 CR2; /**< Control register 2 */ + __io uint32 OAR1; /**< Own address register 1 */ + __io uint32 OAR2; /**< Own address register 2 */ + __io uint32 DR; /**< Data register */ + __io uint32 SR1; /**< Status register 1 */ + __io uint32 SR2; /**< Status register 2 */ + __io uint32 CCR; /**< Clock control register */ + __io uint32 TRISE; /**< TRISE (rise time) register */ +} i2c_reg_map; /** STM32F1 I2C1 register map base pointer */ #define I2C1_BASE ((struct i2c_reg_map*)0x40005400) diff --git a/libmaple/stm32f2/i2c.c b/libmaple/stm32f2/i2c.c new file mode 100644 index 0000000..42fd427 --- /dev/null +++ b/libmaple/stm32f2/i2c.c @@ -0,0 +1,99 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2012 LeafLabs, LLC. + * Copyright (c) 2014 Google, Inc. + * + * 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 "i2c_private.h" +#include + +/* + * Devices + */ + +static i2c_dev i2c1 = I2C_DEV_NEW(1, &gpiob, 7, &gpiob, 6); +static i2c_dev i2c2 = I2C_DEV_NEW(1, &gpioh, 5, &gpioh, 4); +static i2c_dev i2c3 = I2C_DEV_NEW(1, &gpioh, 8, &gpioh, 7); + +/** I2C1 device */ +i2c_dev* const I2C1 = &i2c1; +/** I2C2 device */ +i2c_dev* const I2C2 = &i2c2; +/** I2C3 device */ +i2c_dev* const I2C3 = &i2c3; + +/* + * libmaple routines + */ + +#define I2C_MODEF_FLAGS (GPIO_MODEF_TYPE_OD | GPIO_MODEF_SPEED_HIGH | \ + GPIO_MODEF_PUPD_PU) + +void i2c_config_gpios(const i2c_dev *dev) { + /* Untested... */ + gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS); + gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS); + gpio_set_af(sda_port(dev), dev->sda_pin, GPIO_AF_I2C); + gpio_set_af(scl_port(dev), dev->scl_pin, GPIO_AF_I2C); +} + +void i2c_master_release_bus(const i2c_dev *dev) { + /* Untested... */ + unsigned flags = (GPIO_MODEF_TYPE_OD | GPIO_MODEF_SPEED_HIGH | + GPIO_MODEF_PUPD_PU); + gpio_write_bit(scl_port(dev), dev->scl_pin, 1); + gpio_write_bit(sda_port(dev), dev->sda_pin, 1); + gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_OUTPUT, + I2C_MODEF_FLAGS); + gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_OUTPUT, + I2C_MODEF_FLAGS); +} + +/* + * IRQ Handlers + */ + +void __irq_i2c1_ev(void) { + _i2c_irq_handler(I2C1); +} + +void __irq_i2c2_ev(void) { + _i2c_irq_handler(I2C2); +} + +void __irq_i2c3_ev(void) { + _i2c_irq_handler(I2C3); +} + +void __irq_i2c1_er(void) { + _i2c_irq_error_handler(I2C1); +} + +void __irq_i2c2_er(void) { + _i2c_irq_error_handler(I2C2); +} + +void __irq_i2c3_er(void) { + _i2c_irq_error_handler(I2C3); +} diff --git a/libmaple/stm32f2/include/series/i2c.h b/libmaple/stm32f2/include/series/i2c.h new file mode 100644 index 0000000..b231256 --- /dev/null +++ b/libmaple/stm32f2/include/series/i2c.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung (from ). + * Copyright (c) 2012 LeafLabs, LLC. + * Copyright (c) 2014 Google, Inc. + * + * 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. + *****************************************************************************/ + +#ifndef _LIBMAPLE_STM32F2_I2C_H_ +#define _LIBMAPLE_STM32F2_I2C_H_ + +#include +#include + +/* + * Register maps + */ + +/** I2C register map type */ +typedef struct i2c_reg_map { + __io uint32 CR1; /**< Control register 1 */ + __io uint32 CR2; /**< Control register 2 */ + __io uint32 OAR1; /**< Own address register 1 */ + __io uint32 OAR2; /**< Own address register 2 */ + __io uint32 DR; /**< Data register */ + __io uint32 SR1; /**< Status register 1 */ + __io uint32 SR2; /**< Status register 2 */ + __io uint32 CCR; /**< Clock control register */ + __io uint32 TRISE; /**< TRISE (rise time) register */ + __io uint32 FLTR; /**< Noise filter register */ +} i2c_reg_map; + +/** I2C1 register map base pointer */ +#define I2C1_BASE ((struct i2c_reg_map*)0x40005400) +/** I2C2 register map base pointer */ +#define I2C2_BASE ((struct i2c_reg_map*)0x40005800) +/** I2C3 register map base pointer */ +#define I2C3_BASE ((struct i2c_reg_map*)0x40005C00) + +/* + * Devices + */ + +extern i2c_dev* const I2C1; +extern i2c_dev* const I2C2; +extern i2c_dev* const I2C3; + +/* + * For internal use + */ + +static inline uint32 _i2c_bus_clk(i2c_dev *dev) { + /* All the I2C peripherals are on APB1 */ + return STM32_PCLK1 / (1000 * 1000); +} + +#undef _I2C_HAVE_IRQ_FIXUP +#undef _I2C_HAVE_DEPRECATED_I2C_REMAP + +#endif /* _LIBMAPLE_STM32F1_I2C_H_ */ -- cgit v1.2.3