summaryrefslogtreecommitdiff
path: root/src/drivers/ao_cc1200.c
diff options
context:
space:
mode:
authorBdale Garbee <bdale@gag.com>2016-07-04 23:47:24 +0200
committerBdale Garbee <bdale@gag.com>2016-07-04 23:47:24 +0200
commit2e26d1ab42163988dc26b06b016c3b05efe17659 (patch)
tree5736db47fa979abb0e37b0fc3b956cd6cdbe9405 /src/drivers/ao_cc1200.c
parent639e461ded29a48c155afea12171cbfc191ccfd7 (diff)
parent65ed2f588ca596fe9aa559bebd590a2a11b9859b (diff)
Merge branch 'master' into branch-1.6
Diffstat (limited to 'src/drivers/ao_cc1200.c')
-rw-r--r--src/drivers/ao_cc1200.c105
1 files changed, 31 insertions, 74 deletions
diff --git a/src/drivers/ao_cc1200.c b/src/drivers/ao_cc1200.c
index 6bccb188..cd85f208 100644
--- a/src/drivers/ao_cc1200.c
+++ b/src/drivers/ao_cc1200.c
@@ -185,9 +185,9 @@ ao_radio_fifo_write_fixed(uint8_t data, uint8_t len)
}
static uint8_t
-ao_radio_tx_fifo_space(void)
+ao_radio_int_pin(void)
{
- return CC1200_FIFO_SIZE - ao_radio_reg_read(CC1200_NUM_TXBYTES);
+ return ao_gpio_get(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN, AO_CC1200_INT);
}
static uint8_t
@@ -482,6 +482,7 @@ static const uint16_t rdf_setup[] = {
*/
#define APRS_SYMBOL_RATE_E 6
#define APRS_SYMBOL_RATE_M 1013008
+#define APRS_BUFFER_SIZE 64
static const uint16_t aprs_setup[] = {
CC1200_DEVIATION_M, APRS_DEV_M,
@@ -516,6 +517,9 @@ static const uint16_t aprs_setup[] = {
(CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) |
(CC1200_MDMCFG2_UPSAMPLER_P_8 << CC1200_MDMCFG2_UPSAMPLER_P) |
(0 << CC1200_MDMCFG2_CFM_DATA_EN)),
+ CC1200_FIFO_CFG,
+ ((0 << CC1200_FIFO_CFG_CRC_AUTOFLUSH) |
+ (APRS_BUFFER_SIZE << CC1200_FIFO_CFG_FIFO_THR)),
};
/*
@@ -861,105 +865,58 @@ ao_radio_send(const void *d, uint8_t size)
ao_radio_run();
}
-
-#define AO_RADIO_LOTS 64
-
void
ao_radio_send_aprs(ao_radio_fill_func fill)
{
- uint8_t buf[AO_RADIO_LOTS], *b;
+ uint8_t buf[APRS_BUFFER_SIZE];
int cnt;
int total = 0;
uint8_t done = 0;
uint8_t started = 0;
- uint8_t fifo_space;
ao_radio_abort = 0;
ao_radio_get(0xff);
- fifo_space = CC1200_FIFO_SIZE;
- while (!done) {
+ ao_radio_wake = 0;
+ while (!done && !ao_radio_abort) {
cnt = (*fill)(buf, sizeof(buf));
if (cnt < 0) {
done = 1;
cnt = -cnt;
}
-#if CC1200_APRS_TRACE
- printf("APRS fill %d bytes done %d\n", cnt, done);
-#endif
total += cnt;
/* At the last buffer, set the total length */
if (done)
ao_radio_set_len(total & 0xff);
- b = buf;
- while (cnt) {
- uint8_t this_len = cnt;
-
- /* Wait for some space in the fifo */
- while (!ao_radio_abort && (fifo_space = ao_radio_tx_fifo_space()) == 0) {
-#if CC1200_APRS_TRACE
- printf("APRS space %d cnt %d\n", fifo_space, cnt); flush();
-#endif
- ao_radio_wake = 0;
- ao_radio_wait_isr(AO_MS_TO_TICKS(1000));
- }
- if (ao_radio_abort)
- break;
- if (this_len > fifo_space)
- this_len = fifo_space;
-
- cnt -= this_len;
-
- if (done) {
- if (cnt)
- ao_radio_set_mode(AO_RADIO_MODE_APRS_LAST_BUF);
- else
- ao_radio_set_mode(AO_RADIO_MODE_APRS_FINISH);
- } else
- ao_radio_set_mode(AO_RADIO_MODE_APRS_BUF);
-
+ /* Wait for some space in the fifo */
+ while (started && ao_radio_int_pin() != 0 && !ao_radio_abort) {
+ ao_radio_wake = 0;
ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN);
-
- ao_radio_fifo_write(b, this_len);
- b += this_len;
-#if CC1200_APRS_TRACE
- printf("APRS write fifo %d space now %d\n", this_len, ao_radio_tx_fifo_space());
-#endif
- if (!started) {
-#if CC1200_APRS_TRACE
- printf("APRS start\n");
-#endif
- ao_radio_strobe(CC1200_STX);
-#if CC1200_APRS_TRACE
- { int t;
- for (t = 0; t < 20; t++) {
- uint8_t status = ao_radio_status();
- uint8_t space = ao_radio_tx_fifo_space();
- printf ("status: %02x fifo %d\n", status, space);
- if ((status >> 4) == 2)
- break;
- ao_delay(AO_MS_TO_TICKS(0));
- }
- }
-#endif
- started = 1;
- }
+ ao_radio_wait_isr(AO_MS_TO_TICKS(1000));
}
- if (ao_radio_abort) {
- ao_radio_idle();
+ if (ao_radio_abort)
break;
+
+ if (done)
+ ao_radio_set_mode(AO_RADIO_MODE_APRS_FINISH);
+ else
+ ao_radio_set_mode(AO_RADIO_MODE_APRS_BUF);
+
+ ao_radio_fifo_write(buf, cnt);
+ if (!started) {
+ ao_radio_strobe(CC1200_STX);
+ started = 1;
}
}
/* Wait for the transmitter to go idle */
- ao_radio_wake = 0;
-#if CC1200_APRS_TRACE
- printf("APRS wait idle\n"); flush();
-#endif
- ao_radio_wait_isr(AO_MS_TO_TICKS(1000));
-#if CC1200_APRS_TRACE
- printf("APRS abort %d\n", ao_radio_abort);
-#endif
+ while (started && ao_radio_int_pin() != 0 && !ao_radio_abort) {
+ ao_radio_wake = 0;
+ ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN);
+ ao_radio_wait_isr(AO_MS_TO_TICKS(1000));
+ }
+ if (ao_radio_abort)
+ ao_radio_idle();
ao_radio_put();
}