altos/telefireone-v1.0: Track ao_led_init API change
[fw/altos] / src / drivers / ao_gps_ublox.h
1 /*
2  * Copyright © 2013 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #ifndef _AO_GPS_UBLOX_H_
20 #define _AO_GPS_UBLOX_H_
21
22 struct ublox_hdr {
23         uint8_t         class, message;
24         uint16_t        length;
25 };
26
27 #define UBLOX_NAV               0x01
28
29 #define UBLOX_NAV_DOP           0x04
30
31 struct ublox_nav_dop {
32         uint8_t         class;          /* 0x01 */
33         uint8_t         message;        /* 0x04 */
34         uint16_t        length;         /* 18 */
35
36         uint32_t        itow;           /* ms */
37         uint16_t        gdop;
38         uint16_t        ddop;
39         uint16_t        tdop;
40         uint16_t        vdop;
41         uint16_t        hdop;
42         uint16_t        ndop;
43         uint16_t        edop;
44 };
45
46 #define UBLOX_NAV_POSLLH        0x02
47
48 struct ublox_nav_posllh {
49         uint8_t         class;          /* 0x01 */
50         uint8_t         message;        /* 0x02 */
51         uint16_t        length;         /* 28 */
52
53         uint32_t        itow;           /* ms */
54         int32_t         lon;            /* deg * 1e7 */
55         int32_t         lat;            /* deg * 1e7 */
56         int32_t         height;         /* mm */
57         int32_t         hmsl;           /* mm */
58         uint32_t        hacc;           /* mm */
59         uint32_t        vacc;           /* mm */
60 };
61
62 #define UBLOX_NAV_SOL           0x06
63
64 struct ublox_nav_sol {
65         uint8_t         class;          /* 0x01 */
66         uint8_t         message;        /* 0x06 */
67         uint16_t        length;         /* 52 */
68
69         uint32_t        itow;           /* ms */
70         int32_t         ftow;           /* ns */
71         int16_t         week;
72         int8_t          gpsfix;
73         uint8_t         flags;
74         int32_t         exefx;          /* cm */
75         int32_t         exefy;          /* cm */
76         int32_t         exefz;          /* cm */
77         uint32_t        pacc;           /* cm */
78         int32_t         exefvx;         /* cm/s */
79         int32_t         exefvy;         /* cm/s */
80         int32_t         exefvz;         /* cm/s */
81         uint32_t        sacc;           /* cm/s */
82         uint16_t        pdop;           /* * 100 */
83         uint8_t         reserved1;
84         uint8_t         numsv;
85         uint32_t        reserved2;
86 };
87
88 #define UBLOX_NAV_SOL_GPSFIX_NO_FIX             0
89 #define UBLOX_NAV_SOL_GPSFIX_DEAD_RECKONING     1
90 #define UBLOX_NAV_SOL_GPSFIX_2D                 2
91 #define UBLOX_NAV_SOL_GPSFIX_3D                 3
92 #define UBLOX_NAV_SOL_GPSFIX_GPS_DEAD_RECKONING 4
93 #define UBLOX_NAV_SOL_GPSFIX_TIME_ONLY          5
94
95 #define UBLOX_NAV_SOL_FLAGS_GPSFIXOK            0
96 #define UBLOX_NAV_SOL_FLAGS_DIFFSOLN            1
97 #define UBLOX_NAV_SOL_FLAGS_WKNSET              2
98 #define UBLOX_NAV_SOL_FLAGS_TOWSET              3
99
100 #define UBLOX_NAV_STATUS        0x03
101
102 struct ublox_nav_status {
103         uint8_t         class;          /* 0x01 */
104         uint8_t         message;        /* 0x03 */
105         uint16_t        length;         /* 16 */
106
107         uint8_t         gpsfix;
108         uint8_t         flags;
109         uint8_t         fixstat;
110         uint8_t         flags2;
111
112         uint32_t        ttff;           /* ms */
113         uint32_t        msss;           /* ms */
114 };
115
116 #define UBLOX_NAV_STATUS_GPSFIX_NO_FIX                  0
117 #define UBLOX_NAV_STATUS_GPSFIX_DEAD_RECKONING          1
118 #define UBLOX_NAV_STATUS_GPSFIX_2D                      2
119 #define UBLOX_NAV_STATUS_GPSFIX_3D                      3
120 #define UBLOX_NAV_STATUS_GPSFIX_GPS_DEAD_RECKONING      4
121 #define UBLOX_NAV_STATUS_GPSFIX_TIME_ONLY               5
122
123 #define UBLOX_NAV_STATUS_FLAGS_GPSFIXOK                 0
124 #define UBLOX_NAV_STATUS_FLAGS_DIFFSOLN                 1
125 #define UBLOX_NAV_STATUS_FLAGS_WKNSET                   2
126 #define UBLOX_NAV_STATUS_FLAGS_TOWSET                   3
127
128 #define UBLOX_NAV_STATUS_FIXSTAT_DGPSISTAT              0
129 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING            6
130 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_NONE               0
131 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_VALID              1
132 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_USED               2
133 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_DR                 3
134 #define UBLOX_NAV_STATUS_FIXSTAT_MAPMATCHING_MASK               3
135
136 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE                0
137 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_ACQUISITION                    0
138 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_TRACKING                       1
139 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_POWER_OPTIMIZED_TRACKING       2
140 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_INACTIVE                       3
141 #define UBLOX_NAV_STATUS_FLAGS2_PSMSTATE_MASK                           3
142
143 #define UBLOX_NAV_SVINFO        0x30
144
145 struct ublox_nav_svinfo {
146         uint8_t         class;          /* 0x01 */
147         uint8_t         message;        /* 0x30 */
148         uint16_t        length;         /* 8 + 12 * numch */
149
150         uint32_t        itow;           /* ms */
151
152         uint8_t         numch;
153         uint8_t         globalflags;
154         uint16_t        reserved;
155 };
156
157 #define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN   0
158 #define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_ANTARIS   0
159 #define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_U_BLOX_5  1
160 #define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_U_BLOX_6  2
161 #define UBLOX_NAV_SVINFO_GLOBAL_FLAGS_CHIPGEN_MASK      7
162
163 struct ublox_nav_svinfo_block {
164         uint8_t         chn;
165         uint8_t         svid;
166         uint8_t         flags;
167         uint8_t         quality;
168
169         uint8_t         cno;            /* dbHz */
170         int8_t          elev;           /* deg */
171         int16_t         azim;           /* deg */
172
173         int32_t         prres;          /* cm */
174 };
175
176 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_SVUSED     0
177 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_DIFFCORR   1
178 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITAVAIL 2
179 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITEPH   3
180 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_UNHEALTHY  4
181 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITALM   5
182 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_ORBITAOP   6
183 #define UBLOX_NAV_SVINFO_BLOCK_FLAGS_SMOOTHED   7
184
185 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND       0
186 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_IDLE                  0
187 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_SEARCHING             1
188 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_ACQUIRED              2
189 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_UNUSABLE              3
190 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CODE_LOCK             4
191 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_5      5
192 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_6      6
193 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_CARRIER_LOCKED_7      7
194 #define UBLOX_NAV_SVINFO_BLOCK_QUALITY_QUALITYIND_MASK                  7
195
196 #define UBLOX_NAV_TIMEUTC       0x21
197
198 struct ublox_nav_timeutc {
199         uint8_t         class;          /* 0x01 */
200         uint8_t         message;        /* 0x21 */
201         uint16_t        length;         /* 20 */
202
203         uint32_t        itow;           /* ms */
204         uint32_t        tacc;           /* ns */
205         int32_t         nano;           /* ns */
206
207         uint16_t        year;
208         uint8_t         month;
209         uint8_t         day;
210
211         uint8_t         hour;
212         uint8_t         min;
213         uint8_t         sec;
214         uint8_t         valid;
215 };
216
217 #define UBLOX_NAV_TIMEUTC_VALID_VALIDTOW        0
218 #define UBLOX_NAV_TIMEUTC_VALID_VALIDWKN        1
219 #define UBLOX_NAV_TIMEUTC_VALID_VALIDUTC        2
220
221 #define UBLOX_NAV_VELNED        0x12
222
223 struct ublox_nav_velned {
224         uint8_t         class;          /* 0x01 */
225         uint8_t         message;        /* 0x12 */
226         uint16_t        length;         /* 36 */
227
228         uint32_t        itow;           /* ms */
229
230         int32_t         veln;           /* cm/s */
231         int32_t         vele;           /* cm/s */
232         int32_t         veld;           /* cm/s */
233
234         uint32_t        speed;          /* cm/s */
235         uint32_t        gspeed;         /* cm/s */
236
237         int32_t         heading;        /* deg */
238         uint32_t        sacc;           /* cm/s */
239         uint32_t        cacc;           /* deg */
240 };
241
242 #define UBLOX_CFG       0x06
243
244 #define UBLOX_CFG_NAV5  0x24
245
246 #define UBLOX_CFG_NAV5_MASK_DYN                 0
247 #define UBLOX_CFG_NAV5_MASK_MINE1               1
248 #define UBLOX_CFG_NAV5_MASK_FIXMODE             2
249 #define UBLOX_CFG_NAV5_MASK_DRLIM               3
250 #define UBLOX_CFG_NAV5_MASK_POSMASK             4
251 #define UBLOX_CFG_NAV5_MASK_TIMEMASK            5
252 #define UBLOX_CFG_NAV5_MASK_STATICHOLDMASK      6
253 #define UBLOX_CFG_NAV5_MASK_DGPSMASK            7
254
255 #define UBLOX_CFG_NAV5_DYNMODEL_PORTABLE        0
256 #define UBLOX_CFG_NAV5_DYNMODEL_STATIONARY      2
257 #define UBLOX_CFG_NAV5_DYNMODEL_PEDESTRIAN      3
258 #define UBLOX_CFG_NAV5_DYNMODEL_AUTOMOTIVE      4
259 #define UBLOX_CFG_NAV5_DYNMODEL_SEA             5
260 #define UBLOX_CFG_NAV5_DYNMODEL_AIRBORNE_1G     6
261 #define UBLOX_CFG_NAV5_DYNMODEL_AIRBORNE_2G     7
262 #define UBLOX_CFG_NAV5_DYNMODEL_AIRBORNE_4G     8
263
264 #define UBLOX_CFG_NAV5_FIXMODE_2D               1
265 #define UBLOX_CFG_NAV5_FIXMODE_3D               2
266 #define UBLOX_CFG_NAV5_FIXMODE_AUTO             3
267
268 #endif /* _AO_GPS_UBLOX_H_ */