Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / src / drivers / ao_radio_master.c
index 4a37ace06c39aefd66501e79af0aea295244bd5d..8b62a4de0e5df9884e62d7b7202d6f2b63634cb4 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
 #include <ao_exti.h>
 #include <ao_radio_cmac.h>
 
-static __xdata struct ao_radio_spi_reply       ao_radio_spi_reply;
-static __xdata struct ao_radio_spi_request     ao_radio_spi_request;
-static volatile __xdata uint8_t                        ao_radio_wait_mode;
-static volatile __xdata uint8_t                        ao_radio_done = 0;
-static volatile __xdata uint8_t                        ao_radio_ready = 1;
-static __xdata uint8_t                         ao_radio_mutex;
-static __xdata uint8_t                         ao_radio_aes_seq;
+static struct ao_radio_spi_reply       ao_radio_spi_reply;
+static struct ao_radio_spi_request     ao_radio_spi_request;
+static volatile uint8_t                        ao_radio_wait_mode;
+static volatile uint8_t                        ao_radio_done = 0;
+static volatile uint8_t                        ao_radio_ready = 1;
+static uint8_t                         ao_radio_mutex;
+static uint8_t                         ao_radio_aes_seq;
 
-__xdata int8_t                                 ao_radio_cmac_rssi;
+int8_t                                 ao_radio_cmac_rssi;
 
 #if 0
 #define PRINTD(...) do { printf ("\r%5u %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } while(0)
@@ -75,7 +76,7 @@ ao_radio_master_send(void)
         */
 
        PRINTD("Waiting radio ready\n");
-       cli();
+       ao_arch_block_interrupts();
        ao_radio_ready = ao_gpio_get(AO_RADIO_INT_PORT,
                                     AO_RADIO_INT_PIN, AO_RADIO_INT);
        ret = 0;
@@ -84,7 +85,7 @@ ao_radio_master_send(void)
                if (ret)
                        break;
        }
-       sei();
+       ao_arch_release_interrupts();
        if (ret)
                return 0;
 
@@ -99,11 +100,11 @@ ao_radio_master_send(void)
                    AO_RADIO_SPI_BUS);
        ao_radio_master_stop();
        PRINTD("waiting for send done %d\n", ao_radio_done);
-       cli();
+       ao_arch_block_interrupts();
        while (!ao_radio_done)
                if (ao_sleep((void *) &ao_radio_done))
                        break;
-       sei();
+       ao_arch_release_interrupts();
        PRINTD ("sent, radio done %d isr_0 %d isr_1 %d\n", ao_radio_done, isr_0_count, isr_1_count);
        return ao_radio_done;
 }
@@ -125,7 +126,7 @@ ao_radio_put(void)
 }
 
 static void
-ao_radio_get_data(__xdata void *d, uint8_t size)
+ao_radio_get_data(void *d, uint8_t size)
 {
        PRINTD ("fetch\n");
        ao_radio_master_start();
@@ -156,7 +157,7 @@ ao_radio_send(const void *d, uint8_t size)
 
 
 uint8_t
-ao_radio_recv(__xdata void *d, uint8_t size)
+ao_radio_recv(void *d, uint8_t size, uint8_t timeout)
 {
        int8_t  ret;
        uint8_t recv;
@@ -166,6 +167,7 @@ ao_radio_recv(__xdata void *d, uint8_t size)
        
        ao_radio_get(AO_RADIO_SPI_RECV, 0);
        ao_radio_spi_request.recv_len = size;
+       ao_radio_spi_request.timeout = timeout;
        recv = ao_radio_master_send();
        if (!recv) {
                ao_radio_put();
@@ -196,7 +198,7 @@ ao_radio_cmac_set_key(void)
 }
 
 int8_t
-ao_radio_cmac_send(__xdata void *packet, uint8_t len) __reentrant
+ao_radio_cmac_send(void *packet, uint8_t len) 
 {
        if (len > AO_CMAC_MAX_LEN)
                return AO_RADIO_CMAC_LEN_ERROR;
@@ -218,7 +220,7 @@ ao_radio_cmac_send(__xdata void *packet, uint8_t len) __reentrant
 }
 
 int8_t
-ao_radio_cmac_recv(__xdata void *packet, uint8_t len, uint16_t timeout) __reentrant
+ao_radio_cmac_recv(void *packet, uint8_t len, uint16_t timeout) 
 {
        int8_t  ret;
        int8_t  recv;
@@ -294,7 +296,7 @@ ao_radio_test_cmd(void)
                ao_radio_test(0);
 }
 
-__code struct ao_cmds ao_radio_cmds[] = {
+const struct ao_cmds ao_radio_cmds[] = {
        { ao_radio_test_cmd,    "C <1 start, 0 stop, none both>\0Radio carrier test" },
        { 0,    NULL },
 };