1 
2 /*
3  * Copyright (C) 2016 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _CHRE_WWAN_H_
19 #define _CHRE_WWAN_H_
20 
21 /**
22  * @file
23  * Wireless Wide Area Network (WWAN, i.e. mobile/cellular network) API relevant
24  * for querying cell tower identity and associated information that can be
25  * useful in determining location.
26  *
27  * Based on Android N RIL definitions (located at this path as of the time of
28  * this comment: hardware/ril/include/telephony/ril.h), version 12. Refer to
29  * that file and associated documentation for futher details.
30  *
31  * In general, the parts of this API that are taken from the RIL follow the
32  * field naming conventions established in that interface rather than the CHRE
33  * API conventions, in order to avoid confusion and enable code re-use where
34  * applicable. Note that structure names include the chreWwan* prefix rather
35  * than RIL_*, but field names are the same. If necessary to enable code
36  * sharing, it is recommended to create typedefs that map from the CHRE
37  * structures to the associated RIL type names, for example "typedef struct
38  * chreWwanCellIdentityGsm RIL_CellIdentityGsm_v12", etc.
39  */
40 
41 #include <chre/common.h>
42 
43 #include <stdbool.h>
44 #include <stdint.h>
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49 
50 /**
51  * The set of flags returned by chreWwanGetCapabilities().
52  * @defgroup CHRE_WWAN_CAPABILITIES
53  * @{
54  */
55 
56 //! No WWAN APIs are supported
57 #define CHRE_WWAN_CAPABILITIES_NONE  UINT32_C(0)
58 
59 //! Current cell information can be queried via chreWwanGetCellInfoAsync()
60 #define CHRE_WWAN_GET_CELL_INFO      UINT32_C(1 << 0)
61 
62 /** @} */
63 
64 /**
65  * Produce an event ID in the block of IDs reserved for WWAN
66  * @param offset  Index into WWAN event ID block; valid range [0,15]
67  */
68 #define CHRE_WWAN_EVENT_ID(offset)  (CHRE_EVENT_WWAN_FIRST_EVENT + (offset))
69 
70 /**
71  * nanoappHandleEvent argument: struct chreWwanCellInfoResult
72  *
73  * Provides the result of an asynchronous request for cell info sent via
74  * chreWwanGetCellInfoAsync().
75  */
76 #define CHRE_EVENT_WWAN_CELL_INFO_RESULT  CHRE_WWAN_EVENT_ID(0)
77 
78 // NOTE: Do not add new events with ID > 15; only values 0-15 are reserved
79 // (see chre/event.h)
80 
81 /**
82  * The current version of struct chreWwanCellInfoResult associated with this
83  * API definition.
84  */
85 #define CHRE_WWAN_CELL_INFO_RESULT_VERSION  UINT8_C(1)
86 
87 //! Reference: RIL_CellIdentityGsm_v12
88 struct chreWwanCellIdentityGsm {
89     //! 3-digit Mobile Country Code, 0..999, INT32_MAX if unknown
90     int32_t mcc;
91 
92     //! 2 or 3-digit Mobile Network Code, 0..999, INT32_MAX if unknown
93     int32_t mnc;
94 
95     //! 16-bit Location Area Code, 0..65535, INT32_MAX if unknown
96     int32_t lac;
97 
98     //! 16-bit GSM Cell Identity described in TS 27.007, 0..65535,
99     //! INT32_MAX if unknown
100     int32_t cid;
101 
102     //! 16-bit GSM Absolute RF channel number, INT32_MAX if unknown
103     int32_t arfcn;
104 
105     //! 6-bit Base Station Identity Code, UINT8_MAX if unknown
106     uint8_t bsic;
107 
108     //! Reserved for future use; must be set to 0
109     uint8_t reserved[3];
110 };
111 
112 //! Reference: RIL_CellIdentityWcdma_v12
113 struct chreWwanCellIdentityWcdma {
114     //! 3-digit Mobile Country Code, 0..999, INT32_MAX if unknown
115     int32_t mcc;
116 
117     //! 2 or 3-digit Mobile Network Code, 0..999, INT32_MAX if unknown
118     int32_t mnc;
119 
120     //! 16-bit Location Area Code, 0..65535, INT32_MAX if unknown
121     int32_t lac;
122 
123     //! 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455,
124     //! INT32_MAX if unknown
125     int32_t cid;
126 
127     //! 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511,
128     //! INT32_MAX if unknown
129     int32_t psc;
130 
131     //! 16-bit UMTS Absolute RF Channel Number, INT32_MAX if unknown
132     int32_t uarfcn;
133 };
134 
135 //! Reference: RIL_CellIdentityCdma
136 struct chreWwanCellIdentityCdma {
137     //! Network Id 0..65535, INT32_MAX if unknown
138     int32_t networkId;
139 
140     //! CDMA System Id 0..32767, INT32_MAX if unknown
141     int32_t systemId;
142 
143     //! Base Station Id 0..65535, INT32_MAX if unknown
144     int32_t basestationId;
145 
146     //! Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
147     //! It is represented in units of 0.25 seconds and ranges from -2592000
148     //! to 2592000, both values inclusive (corresponding to a range of -180
149     //! to +180 degrees). INT32_MAX if unknown
150     int32_t longitude;
151 
152     //! Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
153     //! It is represented in units of 0.25 seconds and ranges from -1296000
154     //! to 1296000, both values inclusive (corresponding to a range of -90
155     //! to +90 degrees). INT32_MAX if unknown
156     int32_t latitude;
157 };
158 
159 //! Reference: RIL_CellIdentityLte_v12
160 struct chreWwanCellIdentityLte {
161     //! 3-digit Mobile Country Code, 0..999, INT32_MAX if unknown
162     int32_t mcc;
163 
164     //! 2 or 3-digit Mobile Network Code, 0..999, INT32_MAX if unknown
165     int32_t mnc;
166 
167     //! 28-bit Cell Identity described in TS ???, INT32_MAX if unknown
168     int32_t ci;
169 
170     //! physical cell id 0..503, INT32_MAX if unknown
171     int32_t pci;
172 
173     //! 16-bit tracking area code, INT32_MAX if unknown
174     int32_t tac;
175 
176     //! 18-bit LTE Absolute RF Channel Number, INT32_MAX if unknown
177     int32_t earfcn;
178 };
179 
180 //! Reference: RIL_CellIdentityTdscdma
181 struct chreWwanCellIdentityTdscdma {
182     //! 3-digit Mobile Country Code, 0..999, INT32_MAX if unknown
183     int32_t mcc;
184 
185     //! 2 or 3-digit Mobile Network Code, 0..999, INT32_MAX if unknown
186     int32_t mnc;
187 
188     //! 16-bit Location Area Code, 0..65535, INT32_MAX if unknown
189     int32_t lac;
190 
191     //! 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455,
192     //! INT32_MAX if unknown
193     int32_t cid;
194 
195     //! 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT32_MAX if
196     //! unknown
197     int32_t cpid;
198 };
199 
200 //! Reference: RIL_GSM_SignalStrength_v12
201 struct chreWwanSignalStrengthGsm {
202     //! Valid values are (0-31, 99) as defined in TS 27.007 8.5
203     int32_t signalStrength;
204 
205     //! bit error rate (0-7, 99) as defined in TS 27.007 8.5
206     int32_t bitErrorRate;
207 
208     //! Timing Advance in bit periods. 1 bit period = 48.13 us. INT32_MAX
209     //! denotes invalid value
210     int32_t timingAdvance;
211 };
212 
213 //! Reference: RIL_SignalStrengthWcdma
214 struct chreWwanSignalStrengthWcdma {
215     //! Valid values are (0-31, 99) as defined in TS 27.007 8.5
216     int32_t signalStrength;
217 
218     //! bit error rate (0-7, 99) as defined in TS 27.007 8.5
219     int32_t bitErrorRate;
220 };
221 
222 //! Reference: RIL_CDMA_SignalStrength
223 struct chreWwanSignalStrengthCdma {
224     //! Valid values are positive integers.  This value is the actual RSSI value
225     //! multiplied by -1.  Example: If the actual RSSI is -75, then this
226     //! response value will be 75.
227     int32_t dbm;
228 
229     //! Valid values are positive integers.  This value is the actual Ec/Io
230     //! multiplied by -10.  Example: If the actual Ec/Io is -12.5 dB, then this
231     //! response value will be 125.
232     int32_t ecio;
233 };
234 
235 //! Reference: RIL_EVDO_SignalStrength
236 struct chreWwanSignalStrengthEvdo {
237     //! Valid values are positive integers.  This value is the actual RSSI value
238     //! multiplied by -1.  Example: If the actual RSSI is -75, then this
239     //! response value will be 75.
240     int32_t dbm;
241 
242     //! Valid values are positive integers.  This value is the actual Ec/Io
243     //! multiplied by -10.  Example: If the actual Ec/Io is -12.5 dB, then this
244     //! response value will be 125.
245     int32_t ecio;
246 
247     //! Valid values are 0-8.  8 is the highest signal to noise ratio.
248     int32_t signalNoiseRatio;
249 };
250 
251 //! Reference: RIL_LTE_SignalStrength_v8
252 struct chreWwanSignalStrengthLte {
253     //! Valid values are (0-31, 99) as defined in TS 27.007 8.5
254     int32_t signalStrength;
255 
256     //! The current Reference Signal Receive Power in dBm multipled by -1.
257     //! Range: 44 to 140 dBm
258     //! INT32_MAX: 0x7FFFFFFF denotes invalid value.
259     //! Reference: 3GPP TS 36.133 9.1.4
260     int32_t rsrp;
261 
262     //! The current Reference Signal Receive Quality in dB multiplied by -1.
263     //! Range: 20 to 3 dB.
264     //! INT32_MAX: 0x7FFFFFFF denotes invalid value.
265     //! Reference: 3GPP TS 36.133 9.1.7
266     int32_t rsrq;
267 
268     //! The current reference signal signal-to-noise ratio in 0.1 dB units.
269     //! Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB).
270     //! INT32_MAX : 0x7FFFFFFF denotes invalid value.
271     //! Reference: 3GPP TS 36.101 8.1.1
272     int32_t rssnr;
273 
274     //! The current Channel Quality Indicator.
275     //! Range: 0 to 15.
276     //! INT32_MAX : 0x7FFFFFFF denotes invalid value.
277     //! Reference: 3GPP TS 36.101 9.2, 9.3, A.4
278     int32_t cqi;
279 
280     //! timing advance in micro seconds for a one way trip from cell to device.
281     //! Approximate distance can be calculated using 300m/us * timingAdvance.
282     //! Range: 0 to 0x7FFFFFFE
283     //! INT32_MAX : 0x7FFFFFFF denotes invalid value.
284     //! Reference: 3GPP 36.321 section 6.1.3.5
285     //! also: http://www.cellular-planningoptimization.com/2010/02/timing-advance-with-calculation.html
286     int32_t timingAdvance;
287 };
288 
289 //! Reference: RIL_TD_SCDMA_SignalStrength
290 struct chreWwanSignalStrengthTdscdma {
291     //! The Received Signal Code Power in dBm multipled by -1.
292     //! Range : 25 to 120
293     //! INT32_MAX: 0x7FFFFFFF denotes invalid value.
294     //! Reference: 3GPP TS 25.123, section 9.1.1.1
295     int32_t rscp;
296 };
297 
298 //! Reference: RIL_CellInfoGsm_v12
299 struct chreWwanCellInfoGsm {
300     struct chreWwanCellIdentityGsm    cellIdentityGsm;
301     struct chreWwanSignalStrengthGsm  signalStrengthGsm;
302 };
303 
304 //! Reference: RIL_CellInfoWcdma_v12
305 struct chreWwanCellInfoWcdma {
306     struct chreWwanCellIdentityWcdma    cellIdentityWcdma;
307     struct chreWwanSignalStrengthWcdma  signalStrengthWcdma;
308 };
309 
310 //! Reference: RIL_CellInfoCdma
311 struct chreWwanCellInfoCdma {
312     struct chreWwanCellIdentityCdma    cellIdentityCdma;
313     struct chreWwanSignalStrengthCdma  signalStrengthCdma;
314     struct chreWwanSignalStrengthEvdo  signalStrengthEvdo;
315 };
316 
317 //! Reference: RIL_CellInfoLte_v12
318 struct chreWwanCellInfoLte {
319     struct chreWwanCellIdentityLte    cellIdentityLte;
320     struct chreWwanSignalStrengthLte  signalStrengthLte;
321 };
322 
323 //! Reference: RIL_CellInfoTdscdma
324 struct chreWwanCellInfoTdscdma {
325     struct chreWwanCellIdentityTdscdma    cellIdentityTdscdma;
326     struct chreWwanSignalStrengthTdscdma  signalStrengthTdscdma;
327 };
328 
329 //! Reference: RIL_CellInfoType
330 enum chreWwanCellInfoType {
331     CHRE_WWAN_CELL_INFO_TYPE_GSM      = 1,
332     CHRE_WWAN_CELL_INFO_TYPE_CDMA     = 2,
333     CHRE_WWAN_CELL_INFO_TYPE_LTE      = 3,
334     CHRE_WWAN_CELL_INFO_TYPE_WCDMA    = 4,
335     CHRE_WWAN_CELL_INFO_TYPE_TD_SCDMA = 5,
336 };
337 
338 //! Reference: RIL_TimeStampType
339 enum chreWwanCellTimeStampType {
340     CHRE_WWAN_CELL_TIMESTAMP_TYPE_UNKNOWN  = 0,
341     CHRE_WWAN_CELL_TIMESTAMP_TYPE_ANTENNA  = 1,
342     CHRE_WWAN_CELL_TIMESTAMP_TYPE_MODEM    = 2,
343     CHRE_WWAN_CELL_TIMESTAMP_TYPE_OEM_RIL  = 3,
344     CHRE_WWAN_CELL_TIMESTAMP_TYPE_JAVA_RIL = 4,
345 };
346 
347 //! Reference: RIL_CellInfo_v12
348 struct chreWwanCellInfo {
349     //! Timestamp in nanoseconds; must be in the same time base as chreGetTime()
350     uint64_t timeStamp;
351 
352     //! A value from enum {@link #CellInfoType} indicating the radio access
353     //! technology of the cell, and which field in union CellInfo can be used
354     //! to retrieve additional information
355     uint8_t cellInfoType;
356 
357     //! A value from value from enum {@link #CellTimeStampType} that identifies
358     //! the source of the value in timeStamp. This is typically set to
359     //! CHRE_WWAN_CELL_TIMESTAMP_TYPE_OEM_RIL, and indicates the time given by
360     //! chreGetTime() that an intermediate module received the data from the
361     //! modem and forwarded it to the requesting CHRE client.
362     uint8_t timeStampType;
363 
364     //! !0 if this cell is registered, 0 if not registered
365     uint8_t registered;
366 
367     //! Reserved for future use; must be set to 0
368     uint8_t reserved;
369 
370     //! The value in cellInfoType indicates which field in this union is valid
371     union {
372         struct chreWwanCellInfoGsm     gsm;
373         struct chreWwanCellInfoCdma    cdma;
374         struct chreWwanCellInfoLte     lte;
375         struct chreWwanCellInfoWcdma   wcdma;
376         struct chreWwanCellInfoTdscdma tdscdma;
377     } CellInfo;
378 
379     //! Additional bytes reserved for future use; must be set to 0
380     uint8_t reserved2[4];
381 };
382 
383 /**
384  * Data structure provided with events of type CHRE_EVENT_WWAN_CELL_INFO_RESULT.
385  */
386 struct chreWwanCellInfoResult {
387     //! Indicates the version of the structure, for compatibility purposes.
388     //! Clients do not normally need to worry about this field; the CHRE
389     //! implementation guarantees that the client only receives the structure
390     //! version it expects.
391     uint8_t version;
392 
393     //! Populated with a value from enum {@link #chreError}, indicating whether
394     //! the request failed, and if so, provides the cause of the failure
395     uint8_t errorCode;
396 
397     //! The number of valid entries in cells[]
398     uint8_t cellInfoCount;
399 
400     //! Reserved for future use; must be set to 0
401     uint8_t reserved;
402 
403     //! Set to the cookie parameter given to chreWwanGetCellInfoAsync()
404     const void *cookie;
405 
406     //! Pointer to an array of cellInfoCount elements containing information
407     //! about serving and neighbor cells
408     const struct chreWwanCellInfo *cells;
409 };
410 
411 
412 /**
413  * Retrieves a set of flags indicating the WWAN features supported by the
414  * current CHRE implementation. The value returned by this function must be
415  * consistent for the entire duration of the Nanoapp's execution.
416  *
417  * The client must allow for more flags to be set in this response than it knows
418  * about, for example if the implementation supports a newer version of the API
419  * than the client was compiled against.
420  *
421  * @return A bitmask with zero or more CHRE_WWAN_CAPABILITIES_* flags set
422  *
423  * @since v1.1
424  */
425 uint32_t chreWwanGetCapabilities(void);
426 
427 /**
428  * Query information about the current serving cell and its neighbors. This does
429  * not perform a network scan, but should return state from the current network
430  * registration data stored in the cellular modem. This is effectively the same
431  * as a request for RIL_REQUEST_GET_CELL_INFO_LIST in the RIL.
432  *
433  * The requested cellular information is returned asynchronously via
434  * CHRE_EVENT_WWAN_CELL_INFO_RESULT. The implementation must send this event,
435  * either with successful data or an error status, within
436  * CHRE_ASYNC_RESULT_TIMEOUT_NS.
437  *
438  * @param cookie An opaque value that will be included in the chreAsyncResult
439  *        sent in relation to this request.
440  *
441  * @return true if the request was accepted for processing, false otherwise
442  *
443  * @since v1.1
444  */
445 bool chreWwanGetCellInfoAsync(const void *cookie);
446 
447 
448 #ifdef __cplusplus
449 }
450 #endif
451 
452 #endif  /* _CHRE_WWAN_H_ */
453