aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/i2c.c
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-06-20 13:47:47 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-06-22 14:06:09 -0400
commitbcd28f11c2e7adfd488a10e59ed9dfad7877746d (patch)
treed48367ef93fc78c7238479c6c2ed6991c5159a95 /libmaple/i2c.c
parent041a1c28d3ec5e99793a7afab340ae53e68ea1cf (diff)
downloadlibrambutan-bcd28f11c2e7adfd488a10e59ed9dfad7877746d.tar.gz
librambutan-bcd28f11c2e7adfd488a10e59ed9dfad7877746d.zip
I2C: Restore on F1, refactoring prep for F2.
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>
Diffstat (limited to 'libmaple/i2c.c')
-rw-r--r--libmaple/i2c.c47
1 files changed, 3 insertions, 44 deletions
diff --git a/libmaple/i2c.c b/libmaple/i2c.c
index 3db8516..5c0d5e4 100644
--- a/libmaple/i2c.c
+++ b/libmaple/i2c.c
@@ -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
@@ -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);
@@ -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;
@@ -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 |
@@ -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.
*