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