aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-06-01 01:10:47 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-06-01 01:28:51 -0400
commitd483f8fa0c7c1f65c926b24d6c66275953d03c4f (patch)
tree84cd29e2f201fbd6bbac753027c146061e0f05e4
parentb1e06d3acaa72976042314c1debec008c5ac54d7 (diff)
downloadlibrambutan-d483f8fa0c7c1f65c926b24d6c66275953d03c4f.tar.gz
librambutan-d483f8fa0c7c1f65c926b24d6c66275953d03c4f.zip
Bring back HardwareSerial.
To make this happen, we need to have <board/board.h> tell us whether or not it's got each of the USARTs. Do that with BOARD_HAVE_USARTn, for n = 1,...,6. This lets us define HardwareSerial instances only when appropriate, and gets rid of some board-specific hacks we'd accumulated. The new <libmaple/usart.h> now has a convenience function for determining the bus rate by using the appropriate STM32_PCLKx macro, so we can shave a uint32 per instance, which is nice given that they're all going to be in memory. This changes the constructor arguments, but the API only specifies the semantics of the predefined instances, so this is still backwards-compatible. (We should look into storing the instances in Flash -- they don't change, after all.) We don't actually need struct usart_dev's definition in HardwareSerial.h, so replace it with a forward declaration and include <libmaple/usart.h> it in HardwareSerial.cpp instead. Assert some copyrights. Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
-rw-r--r--libmaple/include/libmaple/usart.h1
-rw-r--r--wirish/HardwareSerial.cpp98
-rw-r--r--wirish/boards/VLDiscovery/include/board/board.h6
-rw-r--r--wirish/boards/maple/include/board/board.h9
-rw-r--r--wirish/boards/maple_RET6/include/board/board.h11
-rw-r--r--wirish/boards/maple_mini/include/board/board.h6
-rw-r--r--wirish/boards/maple_native/include/board/board.h6
-rw-r--r--wirish/boards/olimex_stm32_h103/include/board/board.h6
-rw-r--r--wirish/boards/st_stm3220g_eval/include/board/board.h12
-rw-r--r--wirish/include/wirish/HardwareSerial.h26
-rw-r--r--wirish/rules.mk2
11 files changed, 127 insertions, 56 deletions
diff --git a/libmaple/include/libmaple/usart.h b/libmaple/include/libmaple/usart.h
index ad7eb51..293d59e 100644
--- a/libmaple/include/libmaple/usart.h
+++ b/libmaple/include/libmaple/usart.h
@@ -395,6 +395,7 @@ typedef struct usart_dev {
void usart_init(usart_dev *dev);
+/* FIXME document this function */
struct gpio_dev; /* forward declaration */
void usart_async_gpio_cfg(usart_dev *udev,
struct gpio_dev *rx_dev, uint8 rx,
diff --git a/wirish/HardwareSerial.cpp b/wirish/HardwareSerial.cpp
index 0f12e72..3f418e2 100644
--- a/wirish/HardwareSerial.cpp
+++ b/wirish/HardwareSerial.cpp
@@ -2,6 +2,7 @@
* The MIT License
*
* Copyright (c) 2010 Perry Hung.
+ * Copyright (c) 2011, 2012 LeafLabs, LLC.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
@@ -34,36 +35,36 @@
#include <libmaple/libmaple.h>
#include <libmaple/gpio.h>
#include <libmaple/timer.h>
+#include <libmaple/usart.h>
-#include <wirish/boards.h>
-
-#define TX1 BOARD_USART1_TX_PIN
-#define RX1 BOARD_USART1_RX_PIN
-#define TX2 BOARD_USART2_TX_PIN
-#define RX2 BOARD_USART2_RX_PIN
-#define TX3 BOARD_USART3_TX_PIN
-#define RX3 BOARD_USART3_RX_PIN
-#if defined STM32_HIGH_DENSITY && !defined(BOARD_maple_RET6)
-#define TX4 BOARD_UART4_TX_PIN
-#define RX4 BOARD_UART4_RX_PIN
-#define TX5 BOARD_UART5_TX_PIN
-#define RX5 BOARD_UART5_RX_PIN
-#endif
+#define DEFINE_HWSERIAL(name, n) \
+ HardwareSerial name(USART##n, \
+ BOARD_USART##n##_TX_PIN, \
+ BOARD_USART##n##_RX_PIN)
-HardwareSerial Serial1(USART1, TX1, RX1, STM32_PCLK2);
-HardwareSerial Serial2(USART2, TX2, RX2, STM32_PCLK1);
-HardwareSerial Serial3(USART3, TX3, RX3, STM32_PCLK1);
-#if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6)
-HardwareSerial Serial4(UART4, TX4, RX4, STM32_PCLK1);
-HardwareSerial Serial5(UART5, TX5, RX5, STM32_PCLK1);
+#if BOARD_HAVE_USART1
+DEFINE_HWSERIAL(Serial1, 1);
+#endif
+#if BOARD_HAVE_USART2
+DEFINE_HWSERIAL(Serial2, 2);
+#endif
+#if BOARD_HAVE_USART3
+DEFINE_HWSERIAL(Serial3, 3);
+#endif
+#if BOARD_HAVE_UART4
+DEFINE_HWSERIAL(Serial4, 4);
+#endif
+#if BOARD_HAVE_UART5
+DEFINE_HWSERIAL(Serial5, 5);
+#endif
+#if BOARD_HAVE_USART6
+DEFINE_HWSERIAL(Serial6, 6);
#endif
HardwareSerial::HardwareSerial(usart_dev *usart_device,
uint8 tx_pin,
- uint8 rx_pin,
- uint32 clock_speed) {
+ uint8 rx_pin) {
this->usart_device = usart_device;
- this->clock_speed = clock_speed;
this->tx_pin = tx_pin;
this->rx_pin = rx_pin;
}
@@ -72,31 +73,44 @@ HardwareSerial::HardwareSerial(usart_dev *usart_device,
* Set up/tear down
*/
+#if STM32_MCU_SERIES == STM32_SERIES_F1
+/* F1 MCUs have no GPIO_AFR[HL], so turn off PWM if there's a conflict
+ * on this GPIO bit. */
+static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) {
+ if (txi->timer_device != NULL) {
+ timer_set_mode(txi->timer_device, txi->timer_channel, TIMER_DISABLED);
+ }
+}
+#elif (STM32_MCU_SERIES == STM32_SERIES_F2) || \
+ (STM32_MCU_SERIES == STM32_SERIES_F4)
+#define disable_timer_if_necessary(dev, ch) ((void)0)
+#else
+#warn "Unsupported STM32 series; timer conflicts are possible"
+#endif
+
void HardwareSerial::begin(uint32 baud) {
- ASSERT(baud <= usart_device->max_baud);
+ ASSERT(baud <= this->usart_device->max_baud);
- if (baud > usart_device->max_baud) {
+ if (baud > this->usart_device->max_baud) {
return;
}
- const stm32_pin_info *txi = &PIN_MAP[tx_pin];
- const stm32_pin_info *rxi = &PIN_MAP[rx_pin];
+ const stm32_pin_info *txi = &PIN_MAP[this->tx_pin];
+ const stm32_pin_info *rxi = &PIN_MAP[this->rx_pin];
- gpio_set_mode(txi->gpio_device, txi->gpio_bit, GPIO_AF_OUTPUT_PP);
- gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, GPIO_INPUT_FLOATING);
-
- if (txi->timer_device != NULL) {
- /* Turn off any PWM if there's a conflict on this GPIO bit. */
- timer_set_mode(txi->timer_device, txi->timer_channel, TIMER_DISABLED);
- }
+ disable_timer_if_necessary(txi->timer_device, txi->timer_channel);
- usart_init(usart_device);
- usart_set_baud_rate(usart_device, clock_speed, baud);
- usart_enable(usart_device);
+ usart_async_gpio_cfg(this->usart_device,
+ rxi->gpio_device, rxi->gpio_bit,
+ txi->gpio_device, txi->gpio_bit,
+ 0);
+ usart_init(this->usart_device);
+ usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud);
+ usart_enable(this->usart_device);
}
void HardwareSerial::end(void) {
- usart_disable(usart_device);
+ usart_disable(this->usart_device);
}
/*
@@ -104,17 +118,17 @@ void HardwareSerial::end(void) {
*/
uint8 HardwareSerial::read(void) {
- return usart_getc(usart_device);
+ return usart_getc(this->usart_device);
}
uint32 HardwareSerial::available(void) {
- return usart_data_available(usart_device);
+ return usart_data_available(this->usart_device);
}
void HardwareSerial::write(unsigned char ch) {
- usart_putc(usart_device, ch);
+ usart_putc(this->usart_device, ch);
}
void HardwareSerial::flush(void) {
- usart_reset_rx(usart_device);
+ usart_reset_rx(this->usart_device);
}
diff --git a/wirish/boards/VLDiscovery/include/board/board.h b/wirish/boards/VLDiscovery/include/board/board.h
index 04d21c7..c54abc1 100644
--- a/wirish/boards/VLDiscovery/include/board/board.h
+++ b/wirish/boards/VLDiscovery/include/board/board.h
@@ -45,6 +45,12 @@
/* Number of USARTs/UARTs whose pins are broken out to headers */
#define BOARD_NR_USARTS 3
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
/* Default USART pin numbers (not considering AFIO remap) */
#define BOARD_USART1_TX_PIN 7
diff --git a/wirish/boards/maple/include/board/board.h b/wirish/boards/maple/include/board/board.h
index 49f5b9a..ed89fee 100644
--- a/wirish/boards/maple/include/board/board.h
+++ b/wirish/boards/maple/include/board/board.h
@@ -39,8 +39,15 @@
#define BOARD_BUTTON_PIN 38
#define BOARD_LED_PIN 13
-/* Number of USARTs/UARTs whose pins are broken out to headers */
+/* Number of USARTs/UARTs whose pins are broken out to headers, and
+ * macros saying which ones they are. */
#define BOARD_NR_USARTS 3
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
/* Default USART pin numbers (not considering AFIO remap) */
#define BOARD_USART1_TX_PIN 7
diff --git a/wirish/boards/maple_RET6/include/board/board.h b/wirish/boards/maple_RET6/include/board/board.h
index 1a0365a..3291498 100644
--- a/wirish/boards/maple_RET6/include/board/board.h
+++ b/wirish/boards/maple_RET6/include/board/board.h
@@ -36,17 +36,20 @@
#ifndef _BOARDS_MAPLE_RET6_H_
#define _BOARDS_MAPLE_RET6_H_
-/* A few of these values will seem strange given that it's a
- * high-density board. */
-
#define CYCLES_PER_MICROSECOND 72
#define SYSTICK_RELOAD_VAL 71999 /* takes a cycle to reload */
#define BOARD_BUTTON_PIN 38
#define BOARD_LED_PIN 13
-/* Note: UART4 and UART5 have pins which aren't broken out :( */
+/* UART4 and UART5 have pins which aren't broken out :( */
#define BOARD_NR_USARTS 3
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
#define BOARD_USART1_TX_PIN 7
#define BOARD_USART1_RX_PIN 8
#define BOARD_USART2_TX_PIN 1
diff --git a/wirish/boards/maple_mini/include/board/board.h b/wirish/boards/maple_mini/include/board/board.h
index bfba46d..8ba91ce 100644
--- a/wirish/boards/maple_mini/include/board/board.h
+++ b/wirish/boards/maple_mini/include/board/board.h
@@ -43,6 +43,12 @@
#define BOARD_LED_PIN 33
#define BOARD_NR_USARTS 3
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
#define BOARD_USART1_TX_PIN 26
#define BOARD_USART1_RX_PIN 25
#define BOARD_USART2_TX_PIN 9
diff --git a/wirish/boards/maple_native/include/board/board.h b/wirish/boards/maple_native/include/board/board.h
index 397afaf..a4f8896 100644
--- a/wirish/boards/maple_native/include/board/board.h
+++ b/wirish/boards/maple_native/include/board/board.h
@@ -43,6 +43,12 @@
#define BOARD_BUTTON_PIN 6
#define BOARD_NR_USARTS 5
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 1
+#define BOARD_HAVE_UART5 1
+#define BOARD_HAVE_USART6 0
#define BOARD_USART1_TX_PIN 24
#define BOARD_USART1_RX_PIN 25
#define BOARD_USART2_TX_PIN 50
diff --git a/wirish/boards/olimex_stm32_h103/include/board/board.h b/wirish/boards/olimex_stm32_h103/include/board/board.h
index b312e26..46367ac 100644
--- a/wirish/boards/olimex_stm32_h103/include/board/board.h
+++ b/wirish/boards/olimex_stm32_h103/include/board/board.h
@@ -42,6 +42,12 @@
/* Number of USARTs/UARTs whose pins are broken out to headers */
#define BOARD_NR_USARTS 3
+#define BOARD_HAVE_USART1 1
+#define BOARD_HAVE_USART2 1
+#define BOARD_HAVE_USART3 1
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
/* Default USART pin numbers (not considering AFIO remap) */
#define BOARD_USART1_TX_PIN 3
diff --git a/wirish/boards/st_stm3220g_eval/include/board/board.h b/wirish/boards/st_stm3220g_eval/include/board/board.h
index 08b935e..f99a585 100644
--- a/wirish/boards/st_stm3220g_eval/include/board/board.h
+++ b/wirish/boards/st_stm3220g_eval/include/board/board.h
@@ -27,7 +27,11 @@
/**
* @file wirish/boards/st_stm3220g_eval/include/board/board.h
* @author Marti Bolivar <mbolivar@leaflabs.com>
- * @brief STM3220G-EVAL board header.
+ * @brief STM3220G-EVAL board stub header.
+ *
+ * This (and the corresponding board.cpp) needs to be fixed and
+ * fleshed out. Do it later? Maybe someone who wants support for this
+ * board will do it.
*/
#ifndef _BOARD_ST_STM3220G_EVAL_H_
@@ -40,6 +44,12 @@
#define BOARD_LED_PIN 0
#define BOARD_NR_USARTS 0
+#define BOARD_HAVE_USART1 0
+#define BOARD_HAVE_USART2 0
+#define BOARD_HAVE_USART3 0
+#define BOARD_HAVE_UART4 0
+#define BOARD_HAVE_UART5 0
+#define BOARD_HAVE_USART6 0
#define BOARD_NR_SPI 0
#define BOARD_NR_GPIO_PINS 6
#define BOARD_NR_PWM_PINS 0
diff --git a/wirish/include/wirish/HardwareSerial.h b/wirish/include/wirish/HardwareSerial.h
index 1eaacb6..2b1e747 100644
--- a/wirish/include/wirish/HardwareSerial.h
+++ b/wirish/include/wirish/HardwareSerial.h
@@ -2,6 +2,7 @@
* The MIT License
*
* Copyright (c) 2010 Perry Hung.
+ * Copyright (c) 2011, 2012 LeafLabs, LLC.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
@@ -33,9 +34,9 @@
#define _WIRISH_HARDWARESERIAL_H_
#include <libmaple/libmaple_types.h>
-#include <libmaple/usart.h>
#include <wirish/Print.h>
+#include <wirish/boards.h>
/*
* IMPORTANT:
@@ -47,12 +48,13 @@
* the documentation accordingly.
*/
+struct usart_dev;
+
class HardwareSerial : public Print {
public:
- HardwareSerial(usart_dev *usart_device,
+ HardwareSerial(struct usart_dev *usart_device,
uint8 tx_pin,
- uint8 rx_pin,
- uint32 clock_speed);
+ uint8 rx_pin);
/* Set up/tear down */
void begin(uint32 baud);
@@ -69,18 +71,28 @@ public:
int txPin(void) { return this->tx_pin; }
int rxPin(void) { return this->rx_pin; }
private:
- usart_dev *usart_device;
+ struct usart_dev *usart_device;
uint8 tx_pin;
uint8 rx_pin;
- uint32 clock_speed;
};
+#if BOARD_HAVE_USART1
extern HardwareSerial Serial1;
+#endif
+#if BOARD_HAVE_USART2
extern HardwareSerial Serial2;
+#endif
+#if BOARD_HAVE_USART3
extern HardwareSerial Serial3;
-#if defined(STM32_HIGH_DENSITY) && !defined(BOARD_maple_RET6)
+#endif
+#if BOARD_HAVE_UART4
extern HardwareSerial Serial4;
+#endif
+#if BOARD_HAVE_UART5
extern HardwareSerial Serial5;
#endif
+#if BOARD_HAVE_USART6
+extern HardwareSerial Serial6;
+#endif
#endif
diff --git a/wirish/rules.mk b/wirish/rules.mk
index 903c817..4084448 100644
--- a/wirish/rules.mk
+++ b/wirish/rules.mk
@@ -22,6 +22,7 @@ sSRCS_$(d) := start.S
cSRCS_$(d) := start_c.c
cppSRCS_$(d) := boards.cpp
cppSRCS_$(d) += cxxabi-compat.cpp
+cppSRCS_$(d) += HardwareSerial.cpp
cppSRCS_$(d) += Print.cpp
cppSRCS_$(d) += wirish_digital.cpp
cppSRCS_$(d) += wirish_math.cpp
@@ -31,7 +32,6 @@ cppSRCS_$(d) += $(MCU_SERIES)/boards_setup.cpp
cppSRCS_$(d) += $(MCU_SERIES)/wirish_digital.cpp
cppSRCS_$(d) += $(WIRISH_BOARD_PATH)/board.cpp
# TODO: revise these appropriately F2 and put them back in:
-# HardwareSerial.cpp
# HardwareSPI.cpp
# HardwareTimer.cpp
# usb_serial.cpp