blob: 3e9638a88b885ec94c8d7cc5193f8aba68d9f6ea [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/* Copyright Statement:
2 *
3 * This software/firmware and related documentation ("MediaTek Software") are
4 * protected under relevant copyright laws. The information contained herein
5 * is confidential and proprietary to MediaTek Inc. and/or its licensors.
6 * Without the prior written permission of MediaTek inc. and/or its licensors,
7 * any reproduction, modification, use or disclosure of MediaTek Software,
8 * and information contained herein, in whole or in part, shall be strictly prohibited.
9 */
10/* MediaTek Inc. (C) 2010. All rights reserved.
11 *
12 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
13 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
14 * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
15 * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
18 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
19 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
20 * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
21 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
22 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
23 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
24 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
25 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
26 * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
27 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
28 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
29 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
30 *
31 * The following software/firmware and/or related documentation ("MediaTek Software")
32 * have been modified by MediaTek Inc. All revisions are subject to any receiver's
33 * applicable license agreements with MediaTek Inc.
34 */
35#include <vendor-ril/telephony/ril.h>
36#include <stdlib.h>
37#include <stdio.h>
38#include <cutils/jstring.h>
39#include <log/log.h>
40#include <unistd.h>
41#include <math.h>
42#include "common.h"
43#include "em/em.h"
44#include "Radio_capability_switch_util.h"
45#include "WorldPhoneUtil.h"
46#include "../util/AtLine.h"
47#if EM_MODE_SUPPORT
48
49#undef LOG_TAG
50#define LOG_TAG "EM_HSPA"
51
52char *hspa_info_mode_array_td[] = {
53 "HSDPA off\n",
54 "HSDPA on\nHSUPA off\n",
55 "HSDPA on\nHSUPA on\n",
56 "HSDPA on\nHSUPA on\n",
57};
58
59char *hspa_info_mode_array_fd[] = {
60 "HSDPA off\n",
61 "HSDPA on\nHSUPA off\n",
62 "HSDPA on\nHSUPA on\nHSPA+ off\n",
63 "HSDPA on\nHSUPA on\nHSPA+ on\n",
64};
65
66const int EVENT_HSPA_INFO = 1;
67//const int EVENT_DC_HSPA_INFO = 2;
68const int EVENT_SET_HSPA = 3;
69#define QUERY_CMD "AT+EHSM?"
70#define SET_CMD "AT+EHSM="
71#define RESPONSE_CMD "+EHSM:"
72int mCurrentEmhspaFlag = 0;
73int hspamode = 0;
74
75void sendATCommand_ehspa(const char *cmd,int msg)
76{
77 mCurrentEmhspaFlag = msg;
78 emSendATCommand(cmd, Radio_capability_switch_util::get_main_capability_phone_id());
79 return ;
80}
81
82void showHspa(int mode) {
83 RLOGD("showHspa, mode=%d", mode);
84 if (mode < 0 || mode >= 4) {
85 RLOGD("Modem return invalid mode: %d", mode);
86 android::emResultNotify(RET_STRING_HSPA_FAIL);
87 return;
88 }
89 if (WorldPhoneUtil::getModemType() == WorldPhoneUtil::MODEM_TD) {
90 android::emResultNotify(hspa_info_mode_array_td[mode]);
91 } else {
92 android::emResultNotify(hspa_info_mode_array_fd[mode]);
93 }
94}
95
96void parseHspaAtCmd(const char* line) {
97 if (strstr(line, RESPONSE_CMD) != NULL) {
98 AtLine* atLine = new AtLine(line, NULL);
99 int err;
100 atLine->atTokStart(&err);
101 if (err < 0) {
102 RLOGW("this is not a valid response string");
103 return;
104 }
105 int mode = atLine->atTokNextint(&err);
106 if (err < 0) {
107 RLOGW("parse rat fail");
108 return;
109 }
110 showHspa(mode);
111 delete atLine;
112 }
113}
114
115void emHspaAtCmdHandle(char*response, int responselen) {
116 switch (mCurrentEmhspaFlag) {
117 case EVENT_HSPA_INFO:
118 {
119 //parse hspa mode.
120 if ((responselen > 0) && (response != NULL)) {
121 RLOGD("EVENT_HSPA_INFO response: %s\n",response);
122 parseHspaAtCmd(response);
123 }
124 else {
125 android::emResultNotify(RET_STRING_HSPA_FAIL);
126 RLOGD("send fail ");
127 }
128 break;
129 }
130 case EVENT_SET_HSPA:
131 {
132 if ((responselen > 0) && (response != NULL)) {
133 RLOGD("EVENT_SET_HSPA success: %s.\n",response);
134 }
135 else {
136 RLOGD("send fail ");
137 }
138 break;
139 }
140 default:
141 break;
142 }
143}
144
145
146//create thread to send command
147void * emHspaThread(void* arg)
148{
149 char cmd_str[32] = {0};
150 //sprintf(cmd_str,"%s%d,0", SET_CMD,hspamode);
151 //sendATCommand_ehspa(cmd_str,EVENT_SET_HSPA);
152 sendATCommand_ehspa(QUERY_CMD,EVENT_HSPA_INFO);
153 android::unregisterNetwork();
154 //android::emResultNotify(RET_STRING_HSPA_SUCCESS);
155 pthread_exit(0);
156}
157
158int emHspaStart(int argc, int *item)
159{
160 RLOGD("emHspaStart called");
161 if(argc < 1)
162 {
163 RLOGD("emHspaStart: please select mode to test: \
164 0: off, 2: on");
165 android::emResultNotify(RET_STRING_HSPA_FAIL);
166 return -1;
167 }
168 if((item[0] > 1 ) || (item[0] < 0)){
169 RLOGD("emHspaStart: invalid parameter %d",item[0]);
170 android::emResultNotify(RET_STRING_HSPA_FAIL);
171 return -1;
172 }
173 //int modemapping[2] = {0,2};
174 mCurrentEmhspaFlag = 0;
175 //hspamode = modemapping[item[0]];
176 android::registerForATcmdResponse(emHspaAtCmdHandle);
177 pthread_t emhspa_thread;
178 pthread_create(&emhspa_thread,NULL, emHspaThread, NULL);
179 return (0);
180}
181#endif
182