summaryrefslogtreecommitdiff
path: root/src/drivers/ao_radio_slave.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-08-28 18:13:02 -0700
committerKeith Packard <keithp@keithp.com>2012-08-28 23:00:23 -0700
commitfc9841ee5e92318471b6bec09b7075a788ab8872 (patch)
tree021ff2c2e1f5844c11692878184a9746e3faec97 /src/drivers/ao_radio_slave.c
parent27a879b4069ccedf8bbe39d7dbecf45000f29d8c (diff)
altos: Mostly working SPI radio link
This includes long delays to avoid overrunning the cc1111 input, otherwise it works pretty well. The delays mean that we can't capture the reply to a cmac command though, so more work is needed. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers/ao_radio_slave.c')
-rw-r--r--src/drivers/ao_radio_slave.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/src/drivers/ao_radio_slave.c b/src/drivers/ao_radio_slave.c
index 9dff511b..ab23894f 100644
--- a/src/drivers/ao_radio_slave.c
+++ b/src/drivers/ao_radio_slave.c
@@ -34,17 +34,24 @@ ao_radio_slave_signal(void)
ao_arch_nop();
ao_arch_nop();
ao_arch_nop();
- ao_gpio_set(AO_RADIO_SLAVE_INT_PORT, AO_RADIO_SLAVE_INT_BIT, AO_RADIO_SLAVE_INT_PIN, 0);
+ ao_gpio_set(AO_RADIO_SLAVE_INT_PORT, AO_RADIO_SLAVE_INT_BIT, AO_RADIO_SLAVE_INT_PIN, 1);
}
static void
ao_radio_slave_spi(void)
{
+ uint8_t need_signal = 0;
+
+ ao_spi_get_slave(AO_RADIO_SLAVE_BUS);
for (;;) {
- ao_spi_get_slave(AO_RADIO_SLAVE_BUS);
- ao_spi_recv(&ao_radio_spi_request, (2 << 13) | sizeof (ao_radio_spi_request), AO_RADIO_SLAVE_BUS);
- ao_spi_put_slave(AO_RADIO_SLAVE_BUS);
- ao_led_for(AO_LED_RED, AO_MS_TO_TICKS(1000));
+ ao_spi_recv(&ao_radio_spi_request,
+ (2 << 13) | sizeof (ao_radio_spi_request),
+ AO_RADIO_SLAVE_BUS);
+ if (need_signal) {
+ ao_radio_slave_signal();
+ need_signal = 0;
+ }
+ ao_spi_recv_wait();
switch (ao_radio_spi_request.request) {
case AO_RADIO_SPI_RECV:
case AO_RADIO_SPI_CMAC_RECV:
@@ -53,44 +60,43 @@ ao_radio_slave_spi(void)
ao_radio_spi_recv_len = ao_radio_spi_request.recv_len;
ao_radio_spi_recv_timeout = ao_radio_spi_request.timeout;
ao_wakeup(&ao_radio_spi_recv_len);
- break;
+ continue;
case AO_RADIO_SPI_RECV_FETCH:
- ao_spi_get_slave(AO_RADIO_SLAVE_BUS);
ao_spi_send(&ao_radio_spi_reply,
- ao_radio_spi_request.recv_len + AO_RADIO_SPI_REPLY_HEADER_LEN,
+ ao_radio_spi_request.recv_len,
AO_RADIO_SLAVE_BUS);
- ao_spi_put_slave(AO_RADIO_SLAVE_BUS);
- break;
+ ao_radio_slave_signal();
+ ao_spi_send_wait();
+ continue;
case AO_RADIO_SPI_RECV_ABORT:
ao_radio_recv_abort();
break;
case AO_RADIO_SPI_SEND:
ao_config.radio_setting = ao_radio_spi_request.setting;
- ao_radio_send(&ao_radio_spi_request.payload, ao_radio_spi_request.len - AO_RADIO_SPI_REQUEST_HEADER_LEN);
- ao_radio_slave_signal();
+ ao_radio_send(&ao_radio_spi_request.payload,
+ ao_radio_spi_request.len - AO_RADIO_SPI_REQUEST_HEADER_LEN);
break;
case AO_RADIO_SPI_CMAC_SEND:
ao_config.radio_setting = ao_radio_spi_request.setting;
- ao_radio_cmac_send(&ao_radio_spi_request.payload, ao_radio_spi_request.len - AO_RADIO_SPI_REQUEST_HEADER_LEN);
- ao_radio_slave_signal();
+ ao_radio_cmac_send(&ao_radio_spi_request.payload,
+ ao_radio_spi_request.len - AO_RADIO_SPI_REQUEST_HEADER_LEN);
break;
case AO_RADIO_SPI_CMAC_KEY:
ao_xmemcpy(&ao_config.aes_key, ao_radio_spi_request.payload, AO_AES_LEN);
- ao_radio_slave_signal();
break;
case AO_RADIO_SPI_TEST_ON:
+ ao_config.radio_setting = ao_radio_spi_request.setting;
ao_radio_test(1);
- ao_radio_slave_signal();
break;
case AO_RADIO_SPI_TEST_OFF:
ao_radio_test(0);
- ao_radio_slave_signal();
break;
}
+ need_signal = 1;
}
}