diff options
author | Keith Packard <keithp@keithp.com> | 2012-04-09 23:27:43 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2012-04-14 13:21:09 -0700 |
commit | 0dd9e1dd62656a931f9559af6da9131f704f83f9 (patch) | |
tree | f0c659cda9e107b8a835c0f815d4153e4da09c8e /src/avr | |
parent | 35e3c47da895bdd868b9b66b98bca64bd82db862 (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/avr')
-rw-r--r-- | src/avr/ao_arch_funcs.h | 35 | ||||
-rw-r--r-- | src/avr/ao_pins.h | 3 | ||||
-rw-r--r-- | src/avr/ao_spi_usart.c | 4 |
3 files changed, 26 insertions, 16 deletions
diff --git a/src/avr/ao_arch_funcs.h b/src/avr/ao_arch_funcs.h index 9ad14fbb..1eeca6cc 100644 --- a/src/avr/ao_arch_funcs.h +++ b/src/avr/ao_arch_funcs.h @@ -21,24 +21,24 @@ extern __xdata uint8_t ao_spi_mutex; -#define ao_spi_get_mask(reg,mask) do {\ - ao_mutex_get(&ao_spi_mutex); \ - (reg) &= ~(mask); \ +#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 { \ - (reg) |= (mask); \ - ao_mutex_put(&ao_spi_mutex); \ +#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 {\ - ao_mutex_get(&ao_spi_mutex); \ - (bit) = 0; \ +#define ao_spi_get_bit(bit) do { \ + ao_mutex_get(&ao_spi_mutex); \ + (bit) = 0; \ } while (0) -#define ao_spi_put_bit(bit) do { \ - (bit) = 1; \ - ao_mutex_put(&ao_spi_mutex); \ +#define ao_spi_put_bit(bit) do { \ + (bit) = 1; \ + ao_mutex_put(&ao_spi_mutex); \ } while (0) /* @@ -48,11 +48,18 @@ 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); \ + } while (0) diff --git a/src/avr/ao_pins.h b/src/avr/ao_pins.h index bf02db1b..6a63468f 100644 --- a/src/avr/ao_pins.h +++ b/src/avr/ao_pins.h @@ -85,4 +85,7 @@ #define SPI_SLAVE_PIN_2_5 0 #endif +#define AO_M25_SPI_CS_PORT SPI_CS_PORT +#define AO_M25_SPI_CS_MASK M25_CS_MASK + #endif /* _AO_PINS_H_ */ diff --git a/src/avr/ao_spi_usart.c b/src/avr/ao_spi_usart.c index 5ea11da6..7c41042a 100644 --- a/src/avr/ao_spi_usart.c +++ b/src/avr/ao_spi_usart.c @@ -29,7 +29,7 @@ __xdata uint8_t ao_spi_mutex; * so using interrupts would take way too long */ void -ao_spi_send(void __xdata *block, uint16_t len) __reentrant +ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant { uint8_t *d = block; @@ -46,7 +46,7 @@ ao_spi_send(void __xdata *block, uint16_t len) __reentrant * Poll, sending zeros and reading data back */ void -ao_spi_recv(void __xdata *block, uint16_t len) __reentrant +ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant { uint8_t *d = block; |