summaryrefslogtreecommitdiffstats
path: root/misc.c
diff options
context:
space:
mode:
authorPaulK <contact@paulk.fr>2011-11-22 21:50:42 +0100
committerPaulK <contact@paulk.fr>2011-11-22 21:50:42 +0100
commit233f0f23c75971de36d77605572c9df6b344ca73 (patch)
tree06598ad50aa97a30041d05ab9c0e8d13c797ea51 /misc.c
parent791fd3e4a946c05d6598f5054075515df6327b7d (diff)
downloadhardware_ril_samsung-ril-233f0f23c75971de36d77605572c9df6b344ca73.zip
hardware_ril_samsung-ril-233f0f23c75971de36d77605572c9df6b344ca73.tar.gz
hardware_ril_samsung-ril-233f0f23c75971de36d77605572c9df6b344ca73.tar.bz2
Modified samsung-ril to work on Nexus S.
Currently, the following is working: * (automatic) network registration (clean and stable) * SMS (no clean queue engine and no support for multiple message SMS) * SIM I/O * Other minor stuff And the following is left to do: * DATA (3G) * airplane to normal power mode * calls (including audio routing) * RFS messages handling (mostly to be done at IPC level) * Other minor stuff
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/misc.c b/misc.c
index 4f745eb..68862f2 100644
--- a/misc.c
+++ b/misc.c
@@ -7,12 +7,92 @@ extern const struct RIL_Env *rilenv;
extern struct radio_state radio;
extern struct ipc_client *ipc_client;
+void respondNitz(void *data, int length)
+{
+ struct ipc_misc_time_info *nitz = (struct ipc_misc_time_info*)data;
+ char str[128];
+
+ sprintf(str, "%02u/%02u/%02u,%02u:%02u:%02u+%02d,%02d",
+ nitz->year, nitz->mon, nitz->day, nitz->hour, nitz->min, nitz->sec, nitz->tz, 0);
+
+ RIL_onUnsolicitedResponse(RIL_UNSOL_NITZ_TIME_RECEIVED, str, strlen(str) + 1);
+}
+
+// TODO: implement RIL_REQUEST_DEVICE_IDENTITY also
+
+void respondIMEI(RIL_Token t, void *data, int length)
+{
+ struct ipc_misc_me_sn *imei_info;
+ char imei[33];
+ char imeisv[3];
+
+ imei_info = (struct ipc_misc_me_sn *) data;
+
+ if(radio.tokens.get_imei != 0 && radio.tokens.get_imei != t)
+ LOGE("IMEI tokens mismatch");
+
+ if(imei_info->length > 32)
+ return;
+
+ memset(imei, 0, sizeof(imei));
+ memset(imeisv, 0, sizeof(imeisv));
+
+ memcpy(imei, imei_info->data, imei_info->length);
+
+ /* Last two bytes of IMEI in imei_info are the SV bytes */
+ memcpy(imeisv, (imei_info->data + imei_info->length - 2), 2);
+
+ /* IMEI */
+ RIL_onRequestComplete(t, RIL_E_SUCCESS, imei, sizeof(char *));
+ radio.tokens.get_imei = 0;
+
+ /* IMEI SV */
+ if(radio.tokens.get_imeisv != 0) {
+ RIL_onRequestComplete(radio.tokens.get_imeisv, RIL_E_SUCCESS, imeisv, sizeof(char *));
+ radio.tokens.get_imeisv = 0;
+ }
+}
+
+void respondMeSn(RIL_Token t, void *data, int length)
+{
+ struct ipc_misc_me_sn *me_sn_info;
+
+ me_sn_info = (struct ipc_misc_me_sn *) data;
+
+ switch(me_sn_info->type) {
+ case IPC_MISC_ME_SN_SERIAL_NUM:
+ respondIMEI(t, data, length);
+ break;
+ case IPC_MISC_ME_SN_SERIAL_NUM_SERIAL:
+ LOGD("Got IPC_MISC_ME_SN_SERIAL_NUM_SERIAL: %s\n", me_sn_info->data);
+ break;
+ }
+}
+
+void requestIMEI(RIL_Token t)
+{
+ char data;
+
+ if(radio.radio_state != RADIO_STATE_OFF) {
+ data = IPC_MISC_ME_SN_SERIAL_NUM;
+
+ ipc_client_send(ipc_client, IPC_MISC_ME_SN, IPC_TYPE_GET, (unsigned char *) &data, sizeof(data), getRequestId(t));
+ } else {
+ radio.tokens.get_imei = t;
+ }
+}
+
+void requestIMEISV(RIL_Token t)
+{
+ radio.tokens.get_imeisv = t;
+}
+
void requestBasebandVersion(RIL_Token t)
{
if(radio.radio_state != RADIO_STATE_OFF) {
ipc_client_send_get(IPC_MISC_ME_VERSION, getRequestId(t));
} else {
- radio.token_baseband_ver = t;
+ radio.tokens.baseband_version = t;
}
}