From b7486c8360cda212b7d9342156e451f0ea47b61a Mon Sep 17 00:00:00 2001 From: Waldo Bastian Date: Fri, 14 May 2010 17:26:44 -0700 Subject: [PATCH] Add DBUS and Modem API for AGPS support. --- doc/agps-api.txt | 98 +++++++++++++++++++++++++++++++++++++++ include/agps.h | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+), 0 deletions(-) create mode 100644 doc/agps-api.txt create mode 100644 include/agps.h diff --git a/doc/agps-api.txt b/doc/agps-api.txt new file mode 100644 index 0000000..7245eac --- /dev/null +++ b/doc/agps-api.txt @@ -0,0 +1,98 @@ +AgpsManager hierarchy +=============== + +Service org.ofono +Interface org.ofono.AgpsManager +Object path [variable prefix]/{modem0,modem1,...} + +Methods dict GetProperties() + + Returns properties for the modem object. See + the properties section for available properties. + + Possible Errors: [service].Error.InvalidArguments + + void SetProperty(string name, variant value) + + Changes the value of the specified property. Only + properties that are listed as read-write are + changeable. On success a PropertyChanged signal + will be emitted. + + Possible Errors: [service].Error.InvalidArguments + [service].Error.DoesNotExist + + void SendLCSFrame(string framedata) + + Send a LCS position protocol frame to the Mobile + Network. The LCS frame typically represents a + Position Response. + The raw frame data is formatted as the concatenated + sequence of the two digit hexadecimal representation + of each of its octets. Example: "00FC2345" + + void RequestFineTimeInjection(uint16 pulselength) + + Request modem to generate a fine time injection + pulse. pulselength is the duration of the pulse + expressed in radio frames. + + +Signals PropertyChanged(string name, variant value) + + This signal indicates a changed value of the given + property. + + IncomingLCSFrame(string framedata) + + LCS positioning protocol frame received from the + Mobile Network. The LCS frame typically represents + Assistance Data, a Position Request or a combination + of both. + The raw frame data is formatted as the concatenated + sequence of the two digit hexadecimal representation + of each of its octets. Example: "00FC2345" + + FineTimeInjectionNotification(dict radioframenumber) + + Notification about fine time injection pulse + generated by modem. The radioframenumber dict + is defined as follow: + + string AccessTechnology + "gsm" or "umts" + + uint32 TdmaFrameNumber (gsm only) + range 0 - 2715647 (2048*26*51) + + uint16 TdmaTimeslot (gsm only) + range 0 - 7 + + uint16 TimeslotBit (gsm only) + range 0 - 156 + + uint16 TimingAdvance (gsm only) + range 0 - 63 + + uint16 BcchArfcn (gsm only) + range 0 - 1023 + + uint16 Bsic (gsm only) + range 0 - 64 + + uint16 Sfn (umts only) + range 0 - 4095 + + string RrcState (umts only) + "cell_dch", "cell_fach", "cell_pch" or + "ura_pch" + + uint16 RoundTripTime (umts only) + range 0 - 32766 + + +Properties boolean LcsEnabled [readwrite] + + If LcsEnabled is False, then no LCS positioning + protocol frames are received. + diff --git a/include/agps.h b/include/agps.h new file mode 100644 index 0000000..07a0fb2 --- /dev/null +++ b/include/agps.h @@ -0,0 +1,135 @@ +/* + * + * oFono - Open Source Telephony + * + * Copyright (C) 2008-2010 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __OFONO_AGPS_H +#define __OFONO_AGPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct ofono_agps; + +enum ofono_rrc_state { + RRC_CELL_PCH = 0, + RRC_CELL_FACH = 1, + RRC_CELL_DCH = 2, + RRC_URA_PCH = 3, +}; + +struct ofono_lcs_frame { + enum ofono_lcs_frame_type lcs_frame_type; + int frame_length; /* size of raw_frame in bytes */ + unsigned char* raw_frame; +}; + +struct ofono_lcs_gsm_fn { + int TDMA_frame_number; /* range 0 - 2715647 (2048*26*51) */ + int TDMA_timeslot; /* range 0 - 7 */ + int timeslot_bit; /* range 0 - 156 */ + int timing_advance; /* range 0 - 63 */ + int bcch_arfcn; /* range 0 - 1023 */ + int bsic; /* range 0 - 64 */ +}; + +struct ofono_lcs_utran_fn { + int sfn; /* range 0 - 4095 */ + int rrc_state; /* enum ofono_rrc_state */ + int round_trip_time; /* range 0 - 32766 */ +}; + +struct ofono_lcs_radio_fn { + int radio_access_technology; /* enum access_technology */ + union { + ofono_lcs_gsm_fn gsm_frame_number; + ofono_lcs_utran_fn utran_frame_number; + } +}; + +typedef void (*ofono_agps_send_lcs_frame_cb_t)(const struct ofono_error *error, + void *data); + +typedef void (*ofono_agps_inject_time_cb_t)(const struct ofono_error *error, + struct ofono_lcs_radio_fn *radio_frame_number, + void *data); + +/* AGPS related functions, including LCS frame forwarding and fine time injection + */ +struct ofono_agps_driver { + const char *name; + int (*probe)(struct ofono_agps *agps, unsigned int vendor, + void *data); + void (*remove)(struct ofono_agps *agps); + + void (*receive_lcs_frames)(struct ofono_agps *agps, int enabled); + + /* Assistance Data and Position Requests from the Mobile Network are + * signalled via the ofono_agps_lcs_frame_notify function and the + * oFono core to an external GPS manager. This GPS manager can reply + * to Position Requests with one or more Position Responses which + * are then send back to the modem via the send_lcs_frame function. + */ + void (*send_lcs_frame)(struct ofono_agps *agps, + int frame_length, /* size of frame_data in bytes */ + unsigned char* frame_data /* raw frame data */, + ofono_agps_send_lcs_frame_cb_t cb, void *data); + + /* The GPS manager can ask the modem to generate a HW pulse (time + * stamp) with a defined length and the modem replies indicates when + * it generates the pulse. But as the modem has no precise idae of + * Universal Time, it indicates at which radio frame number it + * generated the pulse. The GPS manager which knows the link between + * Universal Time and the Radio Frame number knows very precisely at + * what time the pulse was generated and its duration. + * + * Timing accuracy is typically a few microseconds. + */ + void (*inject_time)(struct ofono_agps *agps, + int radio_access_technology, /* enum access_technology */ + int pulse_length, /* duration of pulse in radio slots */ + ofono_agps_inject_time_cb_t cb, void *data); +}; + +void ofono_agps_lcs_frame_notify(struct ofono_agps *agps, + int frame_length, /* size of frame_data in bytes */ + unsigned char* frame_data /* raw frame data */); + +int ofono_agps_driver_register(const struct ofono_agps_driver *d); +void ofono_agps_driver_unregister(const struct ofono_agps_driver *d); + +struct ofono_agps *ofono_agps_create(struct ofono_modem *modem, + unsigned int vendor, + const char *driver, + void *data); + +void ofono_agps_register(struct ofono_agps *agps); +void ofono_agps_remove(struct ofono_agps *agps); + +void ofono_agps_set_data(struct ofono_agps *agps, void *data); +void *ofono_agps_get_data(struct ofono_agps *agps); + +#ifdef __cplusplus +} +#endif + +#endif /* __OFONO_AGPS_H */ -- 1.5.4.3