Home | History | Annotate | Download | only in chre
      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