Skip to content

Commit

Permalink
I2C: Restore on F1, refactoring prep for F2.
Browse files Browse the repository at this point in the history
Bring back <libmaple/i2c.h> support on STM32F1 with a view towards how
it'll be implemented on STM32F2. There are still many F1-isms in
libmaple/i2c.c and <libmaple/i2c.h>, to be dealt with subsequently.

Move device declarations and base pointer definitions to a new F1
<series/i2c.h>. The register maps and bit definitions themselves are
identical on both series, so leave them in the libmaple header.

Add i2c_private.h, which contains:

- I2C_DEV(), a convenience macro for defining an i2c_dev, and
- declarations for the event and error IRQ handlers.

The IRQ handlers are large, and I2C is slow anyway, so I see no reason
to make them inline in the private header (as we do for some other
peripherals). We just expose the existing ones that were formerly
static in libmaple/i2c.c, but prefix the names with underscore.

Move the device declarations and IRQ handlers into new
stm32f1/i2c.c. These use the i2c_private.h API.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
  • Loading branch information
Marti Bolivar committed Jun 22, 2012
1 parent 413853a commit 7c81947
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 63 deletions.
47 changes: 3 additions & 44 deletions libmaple/i2c.c
Expand Up @@ -2,6 +2,7 @@
* The MIT License
*
* Copyright (c) 2010 Perry Hung.
* Copyright (c) 2012 LeafLabs, LLC.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
Expand Down Expand Up @@ -40,32 +41,6 @@

#include <string.h>

static i2c_dev i2c_dev1 = {
.regs = I2C1_BASE,
.gpio_port = &gpiob,
.sda_pin = 7,
.scl_pin = 6,
.clk_id = RCC_I2C1,
.ev_nvic_line = NVIC_I2C1_EV,
.er_nvic_line = NVIC_I2C1_ER,
.state = I2C_STATE_DISABLED
};
/** I2C1 device */
i2c_dev* const I2C1 = &i2c_dev1;

static i2c_dev i2c_dev2 = {
.regs = I2C2_BASE,
.gpio_port = &gpiob,
.sda_pin = 11,
.scl_pin = 10,
.clk_id = RCC_I2C2,
.ev_nvic_line = NVIC_I2C2_EV,
.er_nvic_line = NVIC_I2C2_ER,
.state = I2C_STATE_DISABLED
};
/** I2C2 device */
i2c_dev* const I2C2 = &i2c_dev2;

static inline int32 wait_for_state_change(i2c_dev *dev,
i2c_state state,
uint32 timeout);
Expand Down Expand Up @@ -129,7 +104,7 @@ enum {
* @brief IRQ handler for I2C master. Handles transmission/reception.
* @param dev I2C device
*/
static void i2c_irq_handler(i2c_dev *dev) {
void _i2c_irq_handler(i2c_dev *dev) {
i2c_msg *msg = dev->msg;

uint8 read = msg->flags & I2C_MSG_READ;
Expand Down Expand Up @@ -289,20 +264,12 @@ static void i2c_irq_handler(i2c_dev *dev) {
}
}

void __irq_i2c1_ev(void) {
i2c_irq_handler(&i2c_dev1);
}

void __irq_i2c2_ev(void) {
i2c_irq_handler(&i2c_dev2);
}

/**
* @brief Interrupt handler for I2C error conditions
* @param dev I2C device
* @sideeffect Aborts any pending I2C transactions
*/
static void i2c_irq_error_handler(i2c_dev *dev) {
void _i2c_irq_error_handler(i2c_dev *dev) {
I2C_CRUMB(ERROR_ENTRY, dev->regs->SR1, dev->regs->SR2);

dev->error_flags = dev->regs->SR2 & (I2C_SR1_BERR |
Expand All @@ -318,14 +285,6 @@ static void i2c_irq_error_handler(i2c_dev *dev) {
dev->state = I2C_STATE_ERROR;
}

void __irq_i2c1_er(void) {
i2c_irq_error_handler(&i2c_dev1);
}

void __irq_i2c2_er(void) {
i2c_irq_error_handler(&i2c_dev2);
}

/**
* @brief Reset an I2C bus.
*
Expand Down
46 changes: 46 additions & 0 deletions libmaple/i2c_private.h
@@ -0,0 +1,46 @@
/******************************************************************************
* The MIT License
*
* Copyright (c) 2012 LeafLabs, LLC.
*
* 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_I2C_PRIVATE_H_
#define _LIBMAPLE_I2C_PRIVATE_H_

#define I2C_DEV(num, port, sda, scl) \
{ \
.regs = I2C##num##_BASE, \
.gpio_port = port, \
.sda_pin = sda, \
.scl_pin = scl, \
.clk_id = RCC_I2C##num, \
.ev_nvic_line = NVIC_I2C##num##_EV, \
.er_nvic_line = NVIC_I2C##num##_ER, \
.state = I2C_STATE_DISABLED, \
}

struct i2c_dev;
void _i2c_irq_handler(struct i2c_dev *dev);
void _i2c_irq_error_handler(struct i2c_dev *dev);

#endif /* _LIBMAPLE_I2C_PRIVATE_H_ */
17 changes: 1 addition & 16 deletions libmaple/include/libmaple/i2c.h
Expand Up @@ -37,6 +37,7 @@
extern "C" {
#endif

#include <series/i2c.h>
#include <libmaple/libmaple_types.h>
#include <libmaple/rcc.h>
#include <libmaple/nvic.h>
Expand Down Expand Up @@ -96,22 +97,6 @@ typedef struct i2c_dev {
volatile i2c_state state; /**< Device state */
} i2c_dev;

/*
* Devices
*/

extern i2c_dev* const I2C1;
extern i2c_dev* const I2C2;

/*
* Register map base pointers
*/

/** 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)

/*
* Register bit definitions
*/
Expand Down
7 changes: 4 additions & 3 deletions libmaple/rules.mk
Expand Up @@ -27,10 +27,11 @@ cSRCS_$(d) += timer.c
cSRCS_$(d) += usart.c
cSRCS_$(d) += usart_private.c
cSRCS_$(d) += util.c
# These still need to be brought back for F1:
# cSRCS_$(d) += i2c.c

sSRCS_$(d) := exc.S
# I2C support must be ported to F2:
ifeq ($(MCU_SERIES),stm32f1)
cSRCS_$(d) += i2c.c
endif

cFILES_$(d) := $(cSRCS_$(d):%=$(d)/%)
sFILES_$(d) := $(sSRCS_$(d):%=$(d)/%)
Expand Down
60 changes: 60 additions & 0 deletions libmaple/stm32f1/i2c.c
@@ -0,0 +1,60 @@
/******************************************************************************
* The MIT License
*
* Copyright (c) 2012 LeafLabs, LLC.
*
* 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 <libmaple/i2c.h>

/*
* Devices
*/

static i2c_dev i2c1 = I2C_DEV(1, &gpiob, 7, 6);
static i2c_dev i2c2 = I2C_DEV(2, &gpiob, 11, 10);

/** STM32F1 I2C device 1 */
i2c_dev* const I2C1 = &i2c1;
/** STM32F1 I2C device 2 */
i2c_dev* const I2C2 = &i2c2;

/*
* IRQ handlers
*/

void __irq_i2c1_ev(void) {
_i2c_irq_handler(I2C1);
}

void __irq_i2c2_ev(void) {
_i2c_irq_handler(I2C2);
}

void __irq_i2c1_er(void) {
_i2c_irq_error_handler(I2C1);
}

void __irq_i2c2_er(void) {
_i2c_irq_error_handler(I2C2);
}
56 changes: 56 additions & 0 deletions libmaple/stm32f1/include/series/i2c.h
@@ -0,0 +1,56 @@
/******************************************************************************
* The MIT License
*
* Copyright (c) 2010 Perry Hung (from <libmaple/i2c.h>).
* Copyright (c) 2012 LeafLabs, LLC.
*
* 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.
*****************************************************************************/

/**
* @file libmaple/include/stm32f1/include/series/i2c.h
* @brief STM32F1 I2C
*/

#ifndef _LIBMAPLE_STM32F1_I2C_H_
#define _LIBMAPLE_STM32F1_I2C_H_

/*
* Register maps
*/

struct i2c_reg_map;

/** STM32F1 I2C1 register map base pointer */
#define I2C1_BASE ((struct i2c_reg_map*)0x40005400)
/** STM32F1 I2C2 register map base pointer */
#define I2C2_BASE ((struct i2c_reg_map*)0x40005800)

/*
* Devices
*/

struct i2c_dev;

extern struct i2c_dev* const I2C1;
extern struct i2c_dev* const I2C2;

#endif /* _LIBMAPLE_STM32F1_I2C_H_ */
1 change: 1 addition & 0 deletions libmaple/stm32f1/rules.mk
Expand Up @@ -20,6 +20,7 @@ cSRCS_$(d) += dma.c
cSRCS_$(d) += exti.c
cSRCS_$(d) += fsmc.c
cSRCS_$(d) += gpio.c
cSRCS_$(d) += i2c.c
cSRCS_$(d) += rcc.c
cSRCS_$(d) += spi.c
cSRCS_$(d) += timer.c
Expand Down

0 comments on commit 7c81947

Please sign in to comment.