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
47extern "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
88struct 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
113struct 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
136struct 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
160struct 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
181struct 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
201struct 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
214struct 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
223struct 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
236struct 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
252struct 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
290struct 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
299struct chreWwanCellInfoGsm {
300    struct chreWwanCellIdentityGsm    cellIdentityGsm;
301    struct chreWwanSignalStrengthGsm  signalStrengthGsm;
302};
303
304//! Reference: RIL_CellInfoWcdma_v12
305struct chreWwanCellInfoWcdma {
306    struct chreWwanCellIdentityWcdma    cellIdentityWcdma;
307    struct chreWwanSignalStrengthWcdma  signalStrengthWcdma;
308};
309
310//! Reference: RIL_CellInfoCdma
311struct chreWwanCellInfoCdma {
312    struct chreWwanCellIdentityCdma    cellIdentityCdma;
313    struct chreWwanSignalStrengthCdma  signalStrengthCdma;
314    struct chreWwanSignalStrengthEvdo  signalStrengthEvdo;
315};
316
317//! Reference: RIL_CellInfoLte_v12
318struct chreWwanCellInfoLte {
319    struct chreWwanCellIdentityLte    cellIdentityLte;
320    struct chreWwanSignalStrengthLte  signalStrengthLte;
321};
322
323//! Reference: RIL_CellInfoTdscdma
324struct chreWwanCellInfoTdscdma {
325    struct chreWwanCellIdentityTdscdma    cellIdentityTdscdma;
326    struct chreWwanSignalStrengthTdscdma  signalStrengthTdscdma;
327};
328
329//! Reference: RIL_CellInfoType
330enum 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
339enum 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
348struct 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 */
386struct 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 */
425uint32_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 */
445bool chreWwanGetCellInfoAsync(const void *cookie);
446
447
448#ifdef __cplusplus
449}
450#endif
451
452#endif  /* _CHRE_WWAN_H_ */
453