altos: Remove 8051 address space specifiers
[fw/altos] / src / drivers / ao_gps_sirf.c
index f2abbf84033c663e36d14745ad0663c28b773656..bdd9410e41d43d0ba83143e06478efaaebe05b17 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.h"
 #endif
 
-__xdata uint8_t ao_gps_mutex;
-__pdata uint16_t ao_gps_tick;
-__xdata struct ao_telemetry_location   ao_gps_data;
-__xdata struct ao_telemetry_satellite  ao_gps_tracking_data;
+uint8_t ao_gps_new;
+uint8_t ao_gps_mutex;
+uint16_t ao_gps_tick;
+struct ao_telemetry_location   ao_gps_data;
+struct ao_telemetry_satellite  ao_gps_tracking_data;
 
 static const char ao_gps_set_nmea[] = "\r\n$PSRF100,0,57600,8,1,0*37\r\n";
 
@@ -105,7 +107,7 @@ struct sirf_geodetic_nav_data {
        uint8_t         hdop;
 };
 
-static __xdata struct sirf_geodetic_nav_data   ao_sirf_data;
+static struct sirf_geodetic_nav_data   ao_sirf_data;
 
 struct sirf_measured_sat_data {
        uint8_t         svid;
@@ -119,12 +121,18 @@ struct sirf_measured_tracker_data {
        struct sirf_measured_sat_data   sats[12];
 };
 
-static __xdata struct sirf_measured_tracker_data       ao_sirf_tracker_data;
+static struct sirf_measured_tracker_data       ao_sirf_tracker_data;
 
-static __pdata uint16_t ao_sirf_cksum;
-static __pdata uint16_t ao_sirf_len;
+static uint16_t ao_sirf_cksum;
+static uint16_t ao_sirf_len;
 
-#define ao_sirf_byte() ((uint8_t) ao_serial_getchar())
+#ifndef ao_sirf_getchar
+#define ao_sirf_getchar                ao_serial1_getchar
+#define ao_sirf_putchar                ao_serial1_putchar
+#define ao_sirf_set_speed      ao_serial1_set_speed
+#endif
+
+#define ao_sirf_byte() ((uint8_t) ao_sirf_getchar())
 
 static uint8_t data_byte(void)
 {
@@ -134,11 +142,11 @@ static uint8_t data_byte(void)
        return c;
 }
 
-static char __xdata *sirf_target;
+static char *sirf_target;
 
 static void sirf_u16(uint8_t offset)
 {
-       uint16_t __xdata *ptr = (uint16_t __xdata *) (sirf_target + offset);
+       uint16_t *ptr = (uint16_t *) (sirf_target + offset);
        uint16_t val;
 
        val = data_byte() << 8;
@@ -148,16 +156,16 @@ static void sirf_u16(uint8_t offset)
 
 static void sirf_u8(uint8_t offset)
 {
-       uint8_t __xdata *ptr = (uint8_t __xdata *) (sirf_target + offset);
+       uint8_t *ptr = (uint8_t *) (sirf_target + offset);
        uint8_t val;
 
        val = data_byte ();
        *ptr = val;
 }
 
-static void sirf_u32(uint8_t offset) __reentrant
+static void sirf_u32(uint8_t offset) 
 {
-       uint32_t __xdata *ptr = (uint32_t __xdata *) (sirf_target + offset);
+       uint32_t *ptr = (uint32_t *) (sirf_target + offset);
        uint32_t val;
 
        val = ((uint32_t) data_byte ()) << 24;
@@ -186,7 +194,7 @@ struct sirf_packet_parse {
 };
 
 static void
-ao_sirf_parse(void __xdata *target, const struct sirf_packet_parse *parse) __reentrant
+ao_sirf_parse(void *target, const struct sirf_packet_parse *parse) 
 {
        uint8_t i, offset, j;
 
@@ -250,7 +258,7 @@ static const struct sirf_packet_parse geodetic_nav_data_packet[] = {
 };
 
 static void
-ao_sirf_parse_41(void) __reentrant
+ao_sirf_parse_41(void) 
 {
        ao_sirf_parse(&ao_sirf_data, geodetic_nav_data_packet);
 }
@@ -271,7 +279,7 @@ static const struct sirf_packet_parse measured_sat_data_packet[] = {
 };
 
 static void
-ao_sirf_parse_4(void) __reentrant
+ao_sirf_parse_4(void) 
 {
        uint8_t i;
        ao_sirf_parse(&ao_sirf_tracker_data, measured_tracker_data_packet);
@@ -280,18 +288,18 @@ ao_sirf_parse_4(void) __reentrant
 }
 
 static void
-ao_gps_setup(void) __reentrant
+ao_gps_setup(void) 
 {
        uint8_t i, k;
-       ao_serial_set_speed(AO_SERIAL_SPEED_4800);
+       ao_sirf_set_speed(AO_SERIAL_SPEED_4800);
        for (i = 0; i < 64; i++)
-               ao_serial_putchar(0x00);
+               ao_sirf_putchar(0x00);
        for (k = 0; k < 3; k++)
                for (i = 0; i < sizeof (ao_gps_set_nmea); i++)
-                       ao_serial_putchar(ao_gps_set_nmea[i]);
-       ao_serial_set_speed(AO_SERIAL_SPEED_57600);
+                       ao_sirf_putchar(ao_gps_set_nmea[i]);
+       ao_sirf_set_speed(AO_SERIAL_SPEED_57600);
        for (i = 0; i < 64; i++)
-               ao_serial_putchar(0x00);
+               ao_sirf_putchar(0x00);
 }
 
 static const char ao_gps_set_message_rate[] = {
@@ -301,22 +309,22 @@ static const char ao_gps_set_message_rate[] = {
 };
 
 void
-ao_sirf_set_message_rate(uint8_t msg, uint8_t rate) __reentrant
+ao_sirf_set_message_rate(uint8_t msg, uint8_t rate) 
 {
        uint16_t        cksum = 0x00a6;
        uint8_t         i;
 
        for (i = 0; i < sizeof (ao_gps_set_message_rate); i++)
-               ao_serial_putchar(ao_gps_set_message_rate[i]);
-       ao_serial_putchar(msg);
-       ao_serial_putchar(rate);
+               ao_sirf_putchar(ao_gps_set_message_rate[i]);
+       ao_sirf_putchar(msg);
+       ao_sirf_putchar(rate);
        cksum = 0xa6 + msg + rate;
        for (i = 0; i < 4; i++)
-               ao_serial_putchar(0);
-       ao_serial_putchar((cksum >> 8) & 0x7f);
-       ao_serial_putchar(cksum & 0xff);
-       ao_serial_putchar(0xb0);
-       ao_serial_putchar(0xb3);
+               ao_sirf_putchar(0);
+       ao_sirf_putchar((cksum >> 8) & 0x7f);
+       ao_sirf_putchar(cksum & 0xff);
+       ao_sirf_putchar(0xb0);
+       ao_sirf_putchar(0xb3);
 }
 
 static const uint8_t sirf_disable[] = {
@@ -329,7 +337,7 @@ static const uint8_t sirf_disable[] = {
 };
 
 void
-ao_gps(void) __reentrant
+ao_gps(void) 
 {
        uint8_t i, k;
        uint16_t cksum;
@@ -338,7 +346,7 @@ ao_gps(void) __reentrant
        for (k = 0; k < 5; k++)
        {
                for (i = 0; i < sizeof (ao_gps_config); i++)
-                       ao_serial_putchar(ao_gps_config[i]);
+                       ao_sirf_putchar(ao_gps_config[i]);
                for (i = 0; i < sizeof (sirf_disable); i++)
                        ao_sirf_set_message_rate(sirf_disable[i], 0);
                ao_sirf_set_message_rate(41, 1);
@@ -416,8 +424,9 @@ ao_gps(void) __reentrant
                        else
                                ao_gps_data.v_error = ao_sirf_data.v_error / 100;
 #endif
+                       ao_gps_new |= AO_GPS_NEW_DATA;
                        ao_mutex_put(&ao_gps_mutex);
-                       ao_wakeup(&ao_gps_data);
+                       ao_wakeup(&ao_gps_new);
                        break;
                case 4:
                        ao_mutex_get(&ao_gps_mutex);
@@ -426,14 +435,15 @@ ao_gps(void) __reentrant
                                ao_gps_tracking_data.sats[i].svid = ao_sirf_tracker_data.sats[i].svid;
                                ao_gps_tracking_data.sats[i].c_n_1 = ao_sirf_tracker_data.sats[i].c_n_1;
                        }
+                       ao_gps_new |= AO_GPS_NEW_TRACKING;
                        ao_mutex_put(&ao_gps_mutex);
-                       ao_wakeup(&ao_gps_tracking_data);
+                       ao_wakeup(&ao_gps_new);
                        break;
                }
        }
 }
 
-__xdata struct ao_task ao_gps_task;
+struct ao_task ao_gps_task;
 
 void
 ao_gps_init(void)