projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/stm32f1: Add DMA and SPI drivers
[fw/altos]
/
src
/
drivers
/
ao_gps_sirf.c
diff --git
a/src/drivers/ao_gps_sirf.c
b/src/drivers/ao_gps_sirf.c
index f2abbf84033c663e36d14745ad0663c28b773656..25a31808001f4182f7b5a5bf9d168f02ae5a75c2 100644
(file)
--- a/
src/drivers/ao_gps_sirf.c
+++ b/
src/drivers/ao_gps_sirf.c
@@
-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
*
* 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
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
@@
-19,10
+20,11
@@
#include "ao.h"
#endif
#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;
+AO_TICK_TYPE 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";
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;
};
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;
struct sirf_measured_sat_data {
uint8_t svid;
@@
-119,12
+121,18
@@
struct sirf_measured_tracker_data {
struct sirf_measured_sat_data sats[12];
};
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)
{
static uint8_t data_byte(void)
{
@@
-134,11
+142,11
@@
static uint8_t data_byte(void)
return c;
}
return c;
}
-static char
__xdata
*sirf_target;
+static char *sirf_target;
static void sirf_u16(uint8_t offset)
{
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;
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)
{
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;
}
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;
uint32_t val;
val = ((uint32_t) data_byte ()) << 24;
@@
-186,7
+194,7
@@
struct sirf_packet_parse {
};
static void
};
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;
{
uint8_t i, offset, j;
@@
-250,7
+258,7
@@
static const struct sirf_packet_parse geodetic_nav_data_packet[] = {
};
static void
};
static void
-ao_sirf_parse_41(void)
__reentrant
+ao_sirf_parse_41(void)
{
ao_sirf_parse(&ao_sirf_data, geodetic_nav_data_packet);
}
{
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
};
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);
{
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
}
static void
-ao_gps_setup(void)
__reentrant
+ao_gps_setup(void)
{
uint8_t i, k;
{
uint8_t i, k;
- ao_s
erial
_set_speed(AO_SERIAL_SPEED_4800);
+ ao_s
irf
_set_speed(AO_SERIAL_SPEED_4800);
for (i = 0; i < 64; i++)
for (i = 0; i < 64; i++)
- ao_s
erial
_putchar(0x00);
+ ao_s
irf
_putchar(0x00);
for (k = 0; k < 3; k++)
for (i = 0; i < sizeof (ao_gps_set_nmea); i++)
for (k = 0; k < 3; k++)
for (i = 0; i < sizeof (ao_gps_set_nmea); i++)
- ao_s
erial
_putchar(ao_gps_set_nmea[i]);
- ao_s
erial
_set_speed(AO_SERIAL_SPEED_57600);
+ ao_s
irf
_putchar(ao_gps_set_nmea[i]);
+ ao_s
irf
_set_speed(AO_SERIAL_SPEED_57600);
for (i = 0; i < 64; i++)
for (i = 0; i < 64; i++)
- ao_s
erial
_putchar(0x00);
+ ao_s
irf
_putchar(0x00);
}
static const char ao_gps_set_message_rate[] = {
}
static const char ao_gps_set_message_rate[] = {
@@
-301,22
+309,22
@@
static const char ao_gps_set_message_rate[] = {
};
void
};
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++)
{
uint16_t cksum = 0x00a6;
uint8_t i;
for (i = 0; i < sizeof (ao_gps_set_message_rate); i++)
- ao_s
erial
_putchar(ao_gps_set_message_rate[i]);
- ao_s
erial
_putchar(msg);
- ao_s
erial
_putchar(rate);
+ ao_s
irf
_putchar(ao_gps_set_message_rate[i]);
+ ao_s
irf
_putchar(msg);
+ ao_s
irf
_putchar(rate);
cksum = 0xa6 + msg + rate;
for (i = 0; i < 4; i++)
cksum = 0xa6 + msg + rate;
for (i = 0; i < 4; i++)
- ao_s
erial
_putchar(0);
- ao_s
erial
_putchar((cksum >> 8) & 0x7f);
- ao_s
erial
_putchar(cksum & 0xff);
- ao_s
erial
_putchar(0xb0);
- ao_s
erial
_putchar(0xb3);
+ ao_s
irf
_putchar(0);
+ ao_s
irf
_putchar((cksum >> 8) & 0x7f);
+ ao_s
irf
_putchar(cksum & 0xff);
+ ao_s
irf
_putchar(0xb0);
+ ao_s
irf
_putchar(0xb3);
}
static const uint8_t sirf_disable[] = {
}
static const uint8_t sirf_disable[] = {
@@
-329,7
+337,7
@@
static const uint8_t sirf_disable[] = {
};
void
};
void
-ao_gps(void)
__reentrant
+ao_gps(void)
{
uint8_t i, k;
uint16_t cksum;
{
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++)
for (k = 0; k < 5; k++)
{
for (i = 0; i < sizeof (ao_gps_config); i++)
- ao_s
erial
_putchar(ao_gps_config[i]);
+ ao_s
irf
_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);
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
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_mutex_put(&ao_gps_mutex);
- ao_wakeup(&ao_gps_
data
);
+ ao_wakeup(&ao_gps_
new
);
break;
case 4:
ao_mutex_get(&ao_gps_mutex);
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_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_mutex_put(&ao_gps_mutex);
- ao_wakeup(&ao_gps_
tracking_data
);
+ ao_wakeup(&ao_gps_
new
);
break;
}
}
}
break;
}
}
}
-
__xdata
struct ao_task ao_gps_task;
+struct ao_task ao_gps_task;
void
ao_gps_init(void)
void
ao_gps_init(void)