summaryrefslogtreecommitdiff
path: root/src/cc1111
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-04-09 23:27:43 -0700
committerKeith Packard <keithp@keithp.com>2012-04-14 13:21:09 -0700
commit0dd9e1dd62656a931f9559af6da9131f704f83f9 (patch)
treef0c659cda9e107b8a835c0f815d4153e4da09c8e /src/cc1111
parent35e3c47da895bdd868b9b66b98bca64bd82db862 (diff)
altos: Add support for multiple SPI busses and sharing device drivers
The STM32L151 has several SPI busses, and we want to use more than one, so add a 'bus' parameter to the SPI interfaces. To avoid wasting time on AVR and CC1111 processors which only use one SPI bus, elide those parameters from the actual functions by wrapping them with macros. Configuring chip select is now all macroized so that each chip can have its own version, allowing the STM to share the various SPI device drivers with the cc1111 and avr processors. Note that only the M25 driver has been ported; porting the others is 'trivial', but not necessary at this point. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/cc1111')
-rw-r--r--src/cc1111/ao_arch_funcs.h21
-rw-r--r--src/cc1111/ao_pins.h8
-rw-r--r--src/cc1111/ao_spi.c4
3 files changed, 22 insertions, 11 deletions
diff --git a/src/cc1111/ao_arch_funcs.h b/src/cc1111/ao_arch_funcs.h
index 9ad14fbb..d9f5955a 100644
--- a/src/cc1111/ao_arch_funcs.h
+++ b/src/cc1111/ao_arch_funcs.h
@@ -21,26 +21,27 @@
extern __xdata uint8_t ao_spi_mutex;
-#define ao_spi_get_mask(reg,mask) do {\
+#define ao_spi_get_mask(reg,mask,bus) do { \
ao_mutex_get(&ao_spi_mutex); \
(reg) &= ~(mask); \
} while (0)
-#define ao_spi_put_mask(reg,mask) do { \
+#define ao_spi_put_mask(reg,mask,bus) do { \
(reg) |= (mask); \
ao_mutex_put(&ao_spi_mutex); \
} while (0)
-#define ao_spi_get_bit(bit) do {\
+#define ao_spi_get_bit(bit,bus) do { \
ao_mutex_get(&ao_spi_mutex); \
(bit) = 0; \
} while (0)
-#define ao_spi_put_bit(bit) do { \
+#define ao_spi_put_bit(bit,bus) do { \
(bit) = 1; \
ao_mutex_put(&ao_spi_mutex); \
} while (0)
+
/*
* The SPI mutex must be held to call either of these
* functions -- this mutex covers the entire SPI operation,
@@ -48,11 +49,19 @@ extern __xdata uint8_t ao_spi_mutex;
*/
void
-ao_spi_send(void __xdata *block, uint16_t len) __reentrant;
+ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant;
void
-ao_spi_recv(void __xdata *block, uint16_t len) __reentrant;
+ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant;
+
+#define ao_spi_send(block, len, bus) ao_spi_send_bus(block, len)
+#define ao_spi_recv(block, len, bus) ao_spi_recv_bus(block, len)
void
ao_spi_init(void);
+#define ao_spi_init_cs(port, mask) do { \
+ SPI_CS_PORT |= mask; \
+ SPI_CS_DIR |= mask; \
+ SPI_CS_SEL &= ~mask; \
+ } while (0)
diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h
index a18c74c8..5c0cb7df 100644
--- a/src/cc1111/ao_pins.h
+++ b/src/cc1111/ao_pins.h
@@ -82,7 +82,7 @@
#define HAS_ACCEL_REF 1
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
- #define M25_CS_MASK 0x02 /* CS0 is P1_1 */
+ #define AO_M25_SPI_CS_MASK 0x02 /* CS0 is P1_1 */
#define M25_MAX_CHIPS 1
#define HAS_ACCEL 1
#define HAS_IGNITE 1
@@ -119,7 +119,7 @@
#define HAS_ACCEL_REF 1
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
- #define M25_CS_MASK 0x02 /* CS0 is P1_1 */
+ #define AO_M25_SPI_CS_MASK 0x02 /* CS0 is P1_1 */
#define M25_MAX_CHIPS 1
#define HAS_ACCEL 1
#define HAS_IGNITE 1
@@ -358,7 +358,7 @@
#define LEDS_AVAILABLE (AO_LED_RED|AO_LED_GREEN)
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
- #define M25_CS_MASK 0x04 /* CS0 is P1_2 */
+ #define AO_M25_SPI_CS_MASK 0x04 /* CS0 is P1_2 */
#define M25_MAX_CHIPS 1
#define HAS_ACCEL 0
#define HAS_IGNITE 0
@@ -458,6 +458,8 @@
#define SPI_CS_DIR P0DIR
#endif
+#define AO_M25_SPI_CS_PORT SPI_CS_PORT
+
#ifndef IGNITE_ON_P2
#error Please define IGNITE_ON_P2
#endif
diff --git a/src/cc1111/ao_spi.c b/src/cc1111/ao_spi.c
index 1fa8e128..1bf5e155 100644
--- a/src/cc1111/ao_spi.c
+++ b/src/cc1111/ao_spi.c
@@ -38,7 +38,7 @@ static __xdata uint8_t ao_spi_const;
* completion one byte before the transfer is actually complete
*/
void
-ao_spi_send(void __xdata *block, uint16_t len) __reentrant
+ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
{
ao_dma_set_transfer(ao_spi_dma_in_id,
&U0DBUFXADDR,
@@ -76,7 +76,7 @@ ao_spi_send(void __xdata *block, uint16_t len) __reentrant
* clocks the data coming in.
*/
void
-ao_spi_recv(void __xdata *block, uint16_t len) __reentrant
+ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant
{
ao_dma_set_transfer(ao_spi_dma_in_id,
&U0DBUFXADDR,