summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-04-18 16:12:57 +0100
committerDamien George <damien.p.george@gmail.com>2015-04-18 21:40:59 +0100
commitd15fe5a6b32c669eb7eade36a0558917ff034d37 (patch)
treea403ef92518ae62478f45d15ee94972b2895a354
parent8892f71dd0f39aedd7342a0f1e8517614f8b21dc (diff)
downloadmicropython-d15fe5a6b32c669eb7eade36a0558917ff034d37.tar.gz
micropython-d15fe5a6b32c669eb7eade36a0558917ff034d37.zip
stmhal: Make I2C busses and their pins configurable in mpconfigboard.h.
-rw-r--r--stmhal/boards/CERB40/mpconfigboard.h7
-rw-r--r--stmhal/boards/HYDRABUS/mpconfigboard.h7
-rw-r--r--stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h5
-rw-r--r--stmhal/boards/PYBV10/mpconfigboard.h9
-rw-r--r--stmhal/boards/PYBV3/mpconfigboard.h9
-rw-r--r--stmhal/boards/PYBV4/mpconfigboard.h9
-rw-r--r--stmhal/boards/STM32F4DISC/mpconfigboard.h7
-rw-r--r--stmhal/i2c.c81
8 files changed, 104 insertions, 30 deletions
diff --git a/stmhal/boards/CERB40/mpconfigboard.h b/stmhal/boards/CERB40/mpconfigboard.h
index 93fc5b6c0e..e6b68ebf39 100644
--- a/stmhal/boards/CERB40/mpconfigboard.h
+++ b/stmhal/boards/CERB40/mpconfigboard.h
@@ -14,7 +14,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (0)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (0)
#define MICROPY_HW_ENABLE_SPI3 (1)
@@ -26,6 +25,12 @@
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)
+// I2C busses
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// The Cerb40 has No LEDs
// The Cerb40 has No SDCard
diff --git a/stmhal/boards/HYDRABUS/mpconfigboard.h b/stmhal/boards/HYDRABUS/mpconfigboard.h
index 3132084b52..ac89edb309 100644
--- a/stmhal/boards/HYDRABUS/mpconfigboard.h
+++ b/stmhal/boards/HYDRABUS/mpconfigboard.h
@@ -13,7 +13,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (0)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (1)
@@ -25,6 +24,12 @@
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)
+// I2C busses
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW/UBTN (Needs Jumper UBTN) is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_A0)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
diff --git a/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h b/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h
index b9735b9382..a985f52fdc 100644
--- a/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h
+++ b/stmhal/boards/NETDUINO_PLUS_2/mpconfigboard.h
@@ -17,7 +17,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_DAC (0)
-#define MICROPY_HW_ENABLE_I2C1 (0)
#define MICROPY_HW_ENABLE_SPI1 (0)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (0)
@@ -29,6 +28,10 @@
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)
+// I2C busses
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_B11)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
diff --git a/stmhal/boards/PYBV10/mpconfigboard.h b/stmhal/boards/PYBV10/mpconfigboard.h
index 3f56906a01..ef4ad10e5e 100644
--- a/stmhal/boards/PYBV10/mpconfigboard.h
+++ b/stmhal/boards/PYBV10/mpconfigboard.h
@@ -14,7 +14,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (0)
@@ -29,6 +28,14 @@
// The pyboard has a 32kHz crystal for the RTC
#define MICROPY_HW_RTC_USE_LSE (1)
+// X-skin: X9=PB6=SCL, X10=PB7=SDA
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+
+// Y-skin: Y9=PB10=SCL, Y10=PB11=SDA
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW has no pullup or pulldown, and pressing the switch makes the input go low
#define MICROPY_HW_USRSW_PIN (pin_B3)
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
diff --git a/stmhal/boards/PYBV3/mpconfigboard.h b/stmhal/boards/PYBV3/mpconfigboard.h
index 6bfb14e815..d829b704a1 100644
--- a/stmhal/boards/PYBV3/mpconfigboard.h
+++ b/stmhal/boards/PYBV3/mpconfigboard.h
@@ -13,7 +13,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (0)
@@ -28,6 +27,14 @@
// The pyboard has a 32kHz crystal for the RTC
#define MICROPY_HW_RTC_USE_LSE (1)
+// X-skin: X9=PB6=SCL, X10=PB7=SDA
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+
+// Y-skin: Y9=PB10=SCL, Y10=PB11=SDA
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW has no pullup or pulldown, and pressing the switch makes the input go low
#define MICROPY_HW_USRSW_PIN (pin_A13)
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
diff --git a/stmhal/boards/PYBV4/mpconfigboard.h b/stmhal/boards/PYBV4/mpconfigboard.h
index a583dcaa56..35bfca07b9 100644
--- a/stmhal/boards/PYBV4/mpconfigboard.h
+++ b/stmhal/boards/PYBV4/mpconfigboard.h
@@ -13,7 +13,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (0)
@@ -28,6 +27,14 @@
// The pyboard has a 32kHz crystal for the RTC
#define MICROPY_HW_RTC_USE_LSE (1)
+// X-skin: X9=PB6=SCL, X10=PB7=SDA
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+
+// Y-skin: Y9=PB10=SCL, Y10=PB11=SDA
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW has no pullup or pulldown, and pressing the switch makes the input go low
#define MICROPY_HW_USRSW_PIN (pin_B3)
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
diff --git a/stmhal/boards/STM32F4DISC/mpconfigboard.h b/stmhal/boards/STM32F4DISC/mpconfigboard.h
index 2dc016d0fc..f22c1a2e8e 100644
--- a/stmhal/boards/STM32F4DISC/mpconfigboard.h
+++ b/stmhal/boards/STM32F4DISC/mpconfigboard.h
@@ -13,7 +13,6 @@
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SERVO (0)
#define MICROPY_HW_ENABLE_DAC (1)
-#define MICROPY_HW_ENABLE_I2C1 (1)
#define MICROPY_HW_ENABLE_SPI1 (1)
#define MICROPY_HW_ENABLE_SPI2 (1)
#define MICROPY_HW_ENABLE_SPI3 (0)
@@ -25,6 +24,12 @@
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)
+// I2C busses
+#define MICROPY_HW_I2C1_SCL (pin_B6)
+#define MICROPY_HW_I2C1_SDA (pin_B7)
+#define MICROPY_HW_I2C2_SCL (pin_B10)
+#define MICROPY_HW_I2C2_SDA (pin_B11)
+
// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_A0)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
diff --git a/stmhal/i2c.c b/stmhal/i2c.c
index e742b21008..a9ac11a3d2 100644
--- a/stmhal/i2c.c
+++ b/stmhal/i2c.c
@@ -87,19 +87,30 @@
#define PYB_I2C_MASTER (0)
#define PYB_I2C_SLAVE (1)
-#if MICROPY_HW_ENABLE_I2C1
+#if defined(MICROPY_HW_I2C1_SCL)
I2C_HandleTypeDef I2CHandle1 = {.Instance = NULL};
#endif
+#if defined(MICROPY_HW_I2C2_SCL)
I2C_HandleTypeDef I2CHandle2 = {.Instance = NULL};
+#endif
+#if defined(MICROPY_HW_I2C3_SCL)
+I2C_HandleTypeDef I2CHandle3 = {.Instance = NULL};
+#endif
void i2c_init0(void) {
// reset the I2C1 handles
-#if MICROPY_HW_ENABLE_I2C1
+ #if defined(MICROPY_HW_I2C1_SCL)
memset(&I2CHandle1, 0, sizeof(I2C_HandleTypeDef));
I2CHandle1.Instance = I2C1;
-#endif
+ #endif
+ #if defined(MICROPY_HW_I2C2_SCL)
memset(&I2CHandle2, 0, sizeof(I2C_HandleTypeDef));
I2CHandle2.Instance = I2C2;
+ #endif
+ #if defined(MICROPY_HW_I2C3_SCL)
+ memset(&I2CHandle3, 0, sizeof(I2C_HandleTypeDef));
+ I2CHandle3.Instance = I2C3;
+ #endif
}
void i2c_init(I2C_HandleTypeDef *i2c) {
@@ -111,22 +122,27 @@ void i2c_init(I2C_HandleTypeDef *i2c) {
const pin_obj_t *pins[2];
if (0) {
-#if MICROPY_HW_ENABLE_I2C1
+ #if defined(MICROPY_HW_I2C1_SCL)
} else if (i2c == &I2CHandle1) {
- // X-skin: X9=PB6=SCL, X10=PB7=SDA
- pins[0] = &pin_B6;
- pins[1] = &pin_B7;
+ pins[0] = &MICROPY_HW_I2C1_SCL;
+ pins[1] = &MICROPY_HW_I2C1_SDA;
GPIO_InitStructure.Alternate = GPIO_AF4_I2C1;
- // enable the I2C clock
__I2C1_CLK_ENABLE();
-#endif
+ #endif
+ #if defined(MICROPY_HW_I2C2_SCL)
} else if (i2c == &I2CHandle2) {
- // Y-skin: Y9=PB10=SCL, Y10=PB11=SDA
- pins[0] = &pin_B10;
- pins[1] = &pin_B11;
+ pins[0] = &MICROPY_HW_I2C2_SCL;
+ pins[1] = &MICROPY_HW_I2C2_SDA;
GPIO_InitStructure.Alternate = GPIO_AF4_I2C2;
- // enable the I2C clock
__I2C2_CLK_ENABLE();
+ #endif
+ #if defined(MICROPY_HW_I2C3_SCL)
+ } else if (i2c == &I2CHandle3) {
+ pins[0] = &MICROPY_HW_I2C3_SCL;
+ pins[1] = &MICROPY_HW_I2C3_SDA;
+ GPIO_InitStructure.Alternate = GPIO_AF4_I2C3;
+ __I2C3_CLK_ENABLE();
+ #endif
} else {
// I2C does not exist for this board (shouldn't get here, should be checked by caller)
return;
@@ -151,16 +167,24 @@ void i2c_init(I2C_HandleTypeDef *i2c) {
void i2c_deinit(I2C_HandleTypeDef *i2c) {
HAL_I2C_DeInit(i2c);
if (0) {
-#if MICROPY_HW_ENABLE_I2C1
+ #if defined(MICROPY_HW_I2C1_SCL)
} else if (i2c->Instance == I2C1) {
__I2C1_FORCE_RESET();
__I2C1_RELEASE_RESET();
__I2C1_CLK_DISABLE();
-#endif
+ #endif
+ #if defined(MICROPY_HW_I2C2_SCL)
} else if (i2c->Instance == I2C2) {
__I2C2_FORCE_RESET();
__I2C2_RELEASE_RESET();
__I2C2_CLK_DISABLE();
+ #endif
+ #if defined(MICROPY_HW_I2C3_SCL)
+ } else if (i2c->Instance == I2C3) {
+ __I2C3_FORCE_RESET();
+ __I2C3_RELEASE_RESET();
+ __I2C3_CLK_DISABLE();
+ #endif
}
}
@@ -175,20 +199,31 @@ typedef struct _pyb_i2c_obj_t {
STATIC inline bool in_master_mode(pyb_i2c_obj_t *self) { return self->i2c->Init.OwnAddress1 == PYB_I2C_MASTER_ADDRESS; }
STATIC const pyb_i2c_obj_t pyb_i2c_obj[] = {
-#if MICROPY_HW_ENABLE_I2C1
+ #if defined(MICROPY_HW_I2C1_SCL)
{{&pyb_i2c_type}, &I2CHandle1},
-#else
- {{&pyb_i2c_type}, NULL},
-#endif
- {{&pyb_i2c_type}, &I2CHandle2}
+ #endif
+ #if defined(MICROPY_HW_I2C2_SCL)
+ {{&pyb_i2c_type}, &I2CHandle2},
+ #endif
+ #if defined(MICROPY_HW_I2C3_SCL)
+ {{&pyb_i2c_type}, &I2CHandle3},
+ #endif
};
STATIC void pyb_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
pyb_i2c_obj_t *self = self_in;
- uint i2c_num;
- if (self->i2c->Instance == I2C1) { i2c_num = 1; }
- else { i2c_num = 2; }
+ uint i2c_num = 0;
+ if (0) { }
+ #if defined(MICROPY_HW_I2C1_SCL)
+ else if (self->i2c->Instance == I2C1) { i2c_num = 1; }
+ #endif
+ #if defined(MICROPY_HW_I2C2_SCL)
+ else if (self->i2c->Instance == I2C2) { i2c_num = 2; }
+ #endif
+ #if defined(MICROPY_HW_I2C3_SCL)
+ else if (self->i2c->Instance == I2C3) { i2c_num = 3; }
+ #endif
if (self->i2c->State == HAL_I2C_STATE_RESET) {
mp_printf(print, "I2C(%u)", i2c_num);