summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-03-30 01:31:12 -0700
committerKeith Packard <keithp@keithp.com>2013-03-30 01:31:12 -0700
commit7455a892e8bf5402e7ff2c4bd2ddad05dfe76638 (patch)
treee5c0a87ffb03368fb9420f4a5f4cfe7b54d547d2
parentbd32140df2a595ce66d603b98516bae519327c5d (diff)
altos: Lock cc115l radio mutex when using global radio values
This moves the locking up above the global state variable uses so that multiple radio users (as if we had any) won't collide. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/drivers/ao_cc115l.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c
index 6da1a678..0e019bc0 100644
--- a/src/drivers/ao_cc115l.c
+++ b/src/drivers/ao_cc115l.c
@@ -516,7 +516,7 @@ ao_radio_get(void)
}
static void
-ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode);
+_ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode);
#define ao_radio_put() ao_mutex_put(&ao_radio_mutex)
@@ -569,10 +569,12 @@ ao_radio_tone_fill(uint8_t *buf, int16_t len)
static void
ao_radio_tone_run(struct ao_radio_tone *tones, int ntones)
{
+ ao_radio_get();
ao_radio_tone = tones;
ao_radio_tone_current = 0;
ao_radio_tone_offset = 0;
- ao_radio_send_lots(ao_radio_tone_fill, AO_RADIO_MODE_RDF);
+ _ao_radio_send_lots(ao_radio_tone_fill, AO_RADIO_MODE_RDF);
+ ao_radio_put();
}
void
@@ -718,15 +720,19 @@ ao_radio_send_fill(uint8_t *buf, int16_t len)
void
ao_radio_send(const void *d, uint8_t size)
{
+ int i;
+
+ ao_radio_get();
ao_radio_send_len = ao_fec_encode(d, size, tx_data);
ao_radio_send_buf = tx_data;
- ao_radio_send_lots(ao_radio_send_fill, AO_RADIO_MODE_PACKET_TX);
+ _ao_radio_send_lots(ao_radio_send_fill, AO_RADIO_MODE_PACKET_TX);
+ ao_radio_put();
}
#define AO_RADIO_LOTS 64
static void
-ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode)
+_ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode)
{
uint8_t buf[AO_RADIO_LOTS], *b;
int cnt;
@@ -735,7 +741,6 @@ ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode)
uint8_t started = 0;
uint8_t fifo_space;
- ao_radio_get();
fifo_space = CC115L_FIFO_SIZE;
ao_radio_done = 0;
ao_radio_fifo = 0;
@@ -795,13 +800,14 @@ ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode)
ao_radio_idle();
ao_radio_wait_done();
ao_radio_pa_off();
- ao_radio_put();
}
void
ao_radio_send_aprs(ao_radio_fill_func fill)
{
- ao_radio_send_lots(fill, AO_RADIO_MODE_APRS);
+ ao_radio_get();
+ _ao_radio_send_lots(fill, AO_RADIO_MODE_APRS);
+ ao_radio_put();
}
#if CC115L_DEBUG