blob: 60bd502bbe651626e9defed5c2515e9720e6d5aa [file] [log] [blame]
b.liu87afc4c2024-08-14 17:33:45 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <sys/un.h>
7#include <netinet/in.h>
8#include <pthread.h>
9#include <sys/epoll.h>
10#include <fcntl.h>
11#include <signal.h>
12
13#include "mbtk_type.h"
14#include "mbtk_ril.h"
15#include "atchannel.h"
16#include "at_tok.h"
17#include "mbtk_utils.h"
18#include "ril_info.h"
19
b.liu7ca612c2025-04-25 09:23:36 +080020void ril_rsp_pack_send(mbtk_sim_type_enum sim_id, ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
21ATPortId_enum portType_2_portId(mbtk_sim_type_enum sim_id, ATPortType_enum port);
b.liu87afc4c2024-08-14 17:33:45 +080022
23/*
24AT+CGSN
25864788050901201
26
27OK
28*/
b.liu7ca612c2025-04-25 09:23:36 +080029static int req_imei_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080030{
31 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +080032 int err = at_send_command_numeric(portType_2_portId(sim_id, port), "AT+CGSN", &response);
b.liu87afc4c2024-08-14 17:33:45 +080033
34 if (err < 0 || response->success == 0 || !response->p_intermediates) {
35 *cme_err = at_get_cme_error(response);
36 goto exit;
37 }
38
39 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
40exit:
41 at_response_free(response);
42 return err;
43}
44
45/*
46AT+MRD_SN=R
47+MRD_SN:0101,Thu Nov 12 00:00:00 2020,G4M32301020006
48
49OK
50
51*/
b.liu7ca612c2025-04-25 09:23:36 +080052static int req_sn_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080053{
54 ATResponse *response = NULL;
55 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +080056 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+MRD_SN=R", "+MRD_SN:", &response);
b.liu87afc4c2024-08-14 17:33:45 +080057
58 if (err < 0 || response->success == 0 || !response->p_intermediates){
59 *cme_err = at_get_cme_error(response);
60 goto exit;
61 }
62
63 char *line = response->p_intermediates->line;
64 err = at_tok_start(&line);
65 if (err < 0)
66 {
67 goto exit;
68 }
69
70 err = at_tok_nextstr(&line, &tmp_ptr);
71 if (err < 0)
72 {
73 goto exit;
74 }
75
76 err = at_tok_nextstr(&line, &tmp_ptr);
77 if (err < 0)
78 {
79 goto exit;
80 }
81
82 err = at_tok_nextstr(&line, &tmp_ptr);
83 if (err < 0)
84 {
85 goto exit;
86 }
87
88 memcpy(data, tmp_ptr, strlen(tmp_ptr));
89
90 goto exit;
91exit:
92 at_response_free(response);
93 return err;
94}
95
96/*
97ATI
98Manufacturer:"LYNQ"
99Model:"LYNQ_L508TLC"
100Revision:L508TLCv02.01b01.00
101IMEI:864788050901201
102
103OK
104
105*/
b.liu7ca612c2025-04-25 09:23:36 +0800106static int req_version_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800107{
108 ATResponse *response = NULL;
b.liu6917e9b2025-03-26 17:23:11 +0800109
110// sleep(3);
111
b.liu7ca612c2025-04-25 09:23:36 +0800112 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "ATI", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800113
114 if (err < 0 || response->success == 0 || !response->p_intermediates){
115 *cme_err = at_get_cme_error(response);
116 goto exit;
117 }
118
119 ATLine* lines_ptr = response->p_intermediates;
120 char *line = NULL;
121 while(lines_ptr)
122 {
123 line = lines_ptr->line;
124 if(strStartsWith(line, "Revision"))
125 {
126 err = at_tok_start(&line);
127 if (err < 0)
128 {
129 goto exit;
130 }
131 memcpy(data, line, strlen(line));
132 break;
133 }
134 lines_ptr = lines_ptr->p_next;
135 }
136
137 goto exit;
138exit:
139 at_response_free(response);
140 return err;
141}
142
143/*
144ATI
145Manufacturer:"LYNQ"
146Model:"LYNQ_L508TLC"
147Revision:L508TLCv02.01b01.00
148IMEI:864788050901201
149
150OK
151
152*/
b.liu7ca612c2025-04-25 09:23:36 +0800153static int req_model_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800154{
155 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800156 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "ATI", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800157
158 if (err < 0 || response->success == 0 || !response->p_intermediates){
159 *cme_err = at_get_cme_error(response);
160 goto exit;
161 }
162
163 ATLine* lines_ptr = response->p_intermediates;
164 char *line = NULL;
165 while(lines_ptr)
166 {
167 line = lines_ptr->line;
168 if(strStartsWith(line, "Model"))
169 {
170 err = at_tok_start(&line);
171 if (err < 0)
172 {
173 goto exit;
174 }
175 memcpy(data, line, strlen(line));
176 break;
177 }
178 lines_ptr = lines_ptr->p_next;
179 }
180
181 goto exit;
182exit:
183 at_response_free(response);
184 return err;
185}
186
187/*
188AT+ACONFIG="IMSD=1"
189or
190AT+ACONFIG="IMSD=0"
191
192OK
193*/
b.liu7ca612c2025-04-25 09:23:36 +0800194static int req_volte_set(mbtk_sim_type_enum sim_id, ATPortType_enum port, int state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800195{
196 ATResponse *response = NULL;
197 char cmd[30] = {0};
198 if(state)
199 {
200 strcpy(cmd, "AT+ACONFIG=\"IMSD=1\"");
201 }
202 else
203 {
204 strcpy(cmd, "AT+ACONFIG=\"IMSD=0\"");
205 }
b.liu7ca612c2025-04-25 09:23:36 +0800206 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800207
208 if (err < 0 || response->success == 0) {
209 *cme_err = at_get_cme_error(response);
210 goto exit;
211 }
212
213 err = 0;
214exit:
215 at_response_free(response);
216 return err;
217}
218
219/*
220AT+ACONFIG?
221PID=0,VID=0,IMSD=1,PIPE=0,FAST=0,RDUP=1,NOCP=0,GEFL=-1237040617
222
223OK
224*/
b.liu7ca612c2025-04-25 09:23:36 +0800225static int req_volte_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, int *state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800226{
227 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800228// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800229 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+ACONFIG?", "", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800230
231 if (err < 0 || response->success == 0 || !response->p_intermediates){
232 *cme_err = at_get_cme_error(response);
233 goto exit;
234 }
235
236 char *line = response->p_intermediates->line;
237 char* ptr = strstr(line, "IMSD=");
238 if(ptr)
239 {
240 *state = atoi(ptr + strlen("IMSD="));
241 }
242 else
243 {
244 err = -1;
245 }
246exit:
247 at_response_free(response);
248 return err;
249}
250
251
252/*
253* Get system temperature.
254*
255* type[IN]:
256* 0: Soc temperature.
257* 1: RF temperature.
258* temp[OUT]:
259* temperature in celsius.
260*
261
262AT*RFTEMP
263*RFTEMP:0,28
264OK
265
266AT*SOCTEMP
267*SOCTEMP:24000
268OK
269
270*/
b.liu7ca612c2025-04-25 09:23:36 +0800271static int req_temp_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_temp_type_enum type, int16 *temp, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800272{
273 ATResponse *response = NULL;
274 int err = -1;
275 int tmp_int;
276 if(type == MBTK_TEMP_TYPE_SOC) { // Soc
b.liu7ca612c2025-04-25 09:23:36 +0800277 err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*SOCTEMP", "*SOCTEMP:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800278 } else { // RF
b.liu7ca612c2025-04-25 09:23:36 +0800279 err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*RFTEMP", "*RFTEMP:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800280 }
281
282 if (err < 0 || response->success == 0 || !response->p_intermediates){
283 *cme_err = at_get_cme_error(response);
284 goto exit;
285 }
286
287 char *line = response->p_intermediates->line;
288 err = at_tok_start(&line);
289 if (err < 0)
290 {
291 goto exit;
292 }
293 err = at_tok_nextint(&line, &tmp_int);
294 if (err < 0)
295 {
296 goto exit;
297 }
298
299 if(type == MBTK_TEMP_TYPE_RF) { // RF
300 err = at_tok_nextint(&line, &tmp_int);
301 if (err < 0)
302 {
303 goto exit;
304 }
305 *temp = (int16)tmp_int;
306 } else {
307 tmp_int = tmp_int / 1000;
308 *temp = (int16)tmp_int;
309 }
310
311exit:
312 at_response_free(response);
313 return err;
314}
315
316/*
317AT+CCLK?
318+CCLK: "23/03/20,01:58:00+32"
319
320OK
321
322*/
b.liu7ca612c2025-04-25 09:23:36 +0800323static int req_cell_time_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, char *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800324{
325 ATResponse *response = NULL;
326 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800327 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CCLK?", "+CCLK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800328
329 if (err < 0 || response->success == 0 || !response->p_intermediates){
330 *cme_err = at_get_cme_error(response);
331 goto exit;
332 }
333
334 char *line = response->p_intermediates->line;
335 err = at_tok_start(&line);
336 if (err < 0)
337 {
338 goto exit;
339 }
340 err = at_tok_nextstr(&line, &tmp_ptr);
341 if (err < 0)
342 {
343 goto exit;
344 }
345 memcpy(data, tmp_ptr, strlen(tmp_ptr));
346
347exit:
348 at_response_free(response);
349 return err;
350}
351
352/*
3530: minimum functionality
3541: full functionality
3553: disable phone receive RF circuits.
3564: disable phone both transmit and receive RF circuits
3575: disable SIM
3586: turn off full secondary receive.
359-1: fail
360*/
b.liu7ca612c2025-04-25 09:23:36 +0800361mbtk_radio_state_enum ril_radio_state_get(mbtk_sim_type_enum sim_id, ATPortType_enum port)
b.liu87afc4c2024-08-14 17:33:45 +0800362{
363 ATResponse *p_response = NULL;
364 int err;
365 char *line;
366 int ret;
367
b.liu7ca612c2025-04-25 09:23:36 +0800368 err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CFUN?", "+CFUN:", &p_response);
b.liu87afc4c2024-08-14 17:33:45 +0800369
370 if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
371 {
372 // assume radio is off
373 goto done;
374 }
375
376 line = p_response->p_intermediates->line;
377
378 err = at_tok_start(&line);
379 if (err < 0) goto done;
380
381 err = at_tok_nextint(&line, &ret);
382 if (err < 0) goto done;
383
384 at_response_free(p_response);
385
b.liu7ca612c2025-04-25 09:23:36 +0800386 ril_info.radio_state[sim_id] = (mbtk_radio_state_enum)ret;
b.liu87afc4c2024-08-14 17:33:45 +0800387
b.liu7ca612c2025-04-25 09:23:36 +0800388 return ril_info.radio_state[sim_id];
b.liu87afc4c2024-08-14 17:33:45 +0800389done:
390 at_response_free(p_response);
391 return MBTK_RADIO_STATE_UNKNOWN;
392}
393
b.liu7ca612c2025-04-25 09:23:36 +0800394mbtk_ril_err_enum ril_radio_state_set(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_radio_state_enum state, bool reset)
b.liu87afc4c2024-08-14 17:33:45 +0800395{
396 int err;
397 ATResponse *p_response = NULL;
398 mbtk_ril_err_enum ret = MBTK_RIL_ERR_UNKNOWN;
399
b.liu7ca612c2025-04-25 09:23:36 +0800400 if(state == ril_info.radio_state[sim_id]) {
b.liu87afc4c2024-08-14 17:33:45 +0800401 LOGE("Radio state is same.");
402 //return MBTK_RIL_ERR_PARAMETER;
403 return MBTK_RIL_ERR_SUCCESS;
404 }
405
406 LOGI("Set radio state - %d", state);
407
408 char cmd[64] = {0};
409 if(reset) {
410 snprintf(cmd, sizeof(cmd), "AT+CFUN=%d,1", state);
411 } else {
412 snprintf(cmd, sizeof(cmd), "AT+CFUN=%d", state);
413 }
b.liu7ca612c2025-04-25 09:23:36 +0800414 err = at_send_command(portType_2_portId(sim_id, port), cmd, &p_response);
b.liu87afc4c2024-08-14 17:33:45 +0800415 if (err || !p_response->success) {
416 goto done;
417 }
418
419 if(state == MBTK_RADIO_STATE_FULL_FUNC) { // +CFUN=1
b.liu7ca612c2025-04-25 09:23:36 +0800420 if(ril_radio_state_get(sim_id, port) == MBTK_RADIO_STATE_FULL_FUNC) { // success
421 ril_info.radio_state[sim_id] = MBTK_RADIO_STATE_FULL_FUNC;
b.liu87afc4c2024-08-14 17:33:45 +0800422 ret = MBTK_RIL_ERR_SUCCESS;
423 LOGD("Radio open success.");
424 } else {
425 LOGW("Radio open fail.");
426 }
427 } else {
b.liu7ca612c2025-04-25 09:23:36 +0800428 ril_info.radio_state[sim_id] = state;
b.liu87afc4c2024-08-14 17:33:45 +0800429 ret = MBTK_RIL_ERR_SUCCESS;
430 LOGD("Set radio state to %d success.", state);
431 }
432
433done:
434 at_response_free(p_response);
435 return ret;
436}
437
b.liu9c19cc62024-11-28 09:43:02 +0800438/*
439AT*POWERIND=0"
440or
441AT*POWERIND=1~31"
442
443OK
444
b.liu2d7a5e42024-11-28 09:46:03 +0800445AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
446其中PS DATA目前暂时不支持,只是保留了这个标志位,0 means resume all.
b.liu9c19cc62024-11-28 09:43:02 +0800447
448AP power state: 1~31 means suspend,
449bitmap:
450bit0 - NETWORK;
451bit1 - SIM;
452bit2 - SMS;
453bit3 - CS CALL
454bit4 - PS DATA
455
456*/
b.liu7ca612c2025-04-25 09:23:36 +0800457static int req_powerind_set(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8 state, int *cme_err)
b.liu9c19cc62024-11-28 09:43:02 +0800458{
459 ATResponse *response = NULL;
460 int err = -1;
461
462 if (state >= 0 && state < 32)
463 {
464 char cmd[100] = {0};
465 sprintf(cmd, "AT*POWERIND=%d", state);
b.liu7ca612c2025-04-25 09:23:36 +0800466 err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu9c19cc62024-11-28 09:43:02 +0800467 if (err < 0 || response->success == 0){
468 *cme_err = at_get_cme_error(response);
469 goto exit;
470 }
471 }
472
473exit:
474 at_response_free(response);
475 return err;
476}
477
b.liu7ca612c2025-04-25 09:23:36 +0800478static int req_md_version_get(mbtk_sim_type_enum sim_id, ATPortType_enum port,void *data, int *cme_err)
b.liu7d102f82025-03-26 18:30:21 +0800479{
480 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800481 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "AT*CGMR", "", &response);
b.liu7d102f82025-03-26 18:30:21 +0800482
483 if (err < 0 || response->success == 0 || !response->p_intermediates)
484 {
485 *cme_err = at_get_cme_error(response);
486 goto exit;
487 }
488
489 ATLine* lines_ptr = response->p_intermediates;
490 char *line = NULL;
491 while(lines_ptr)
492 {
493 line = lines_ptr->line;
l.yange5332392025-05-13 03:16:04 -0700494 char *start = strstr(line, "FALCON_CP");
b.liu7d102f82025-03-26 18:30:21 +0800495 if(start)
496 {
497 char *end = strstr(start, "_Linux");
498 if(end)
499 {
500 end += strlen("_Linux");
501 int length = end - start;
502 if (length)
503 {
504 strncpy(data, start, length);
505 ((char*)data)[length] = '\0';
506 break;
507 }
508 else
509 {
510 err = -1;
511 goto exit;
512
513 }
514 }
515 else
516 {
517 err = -1;
518 goto exit;
519 }
520 }
521 lines_ptr = lines_ptr->p_next;
522 }
523
524 goto exit;
525exit:
526 at_response_free(response);
527 return err;
528}
529
b.liu87afc4c2024-08-14 17:33:45 +0800530
531//void net_list_free(void *data);
532// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
533// Otherwise, do not call pack_error_send().
534mbtk_ril_err_enum dev_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
535{
536 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
537 int cme_err = MBTK_RIL_ERR_CME_NON;
q.huanged004222025-09-26 21:33:56 +0800538 LOGD("lynq rild 61, simid %d port %d %d",cli_info->sim_id,cli_info->port,pack->msg_id);
b.liu87afc4c2024-08-14 17:33:45 +0800539 switch(pack->msg_id)
540 {
541 case RIL_MSG_ID_DEV_IMEI:
542 {
543 if(pack->data_len == 0 || pack->data == NULL) // Get IMEI
544 {
545 char imei[20] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800546 if(req_imei_get(cli_info->sim_id, cli_info->port, imei, &cme_err) || strlen(imei) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800547 {
548 if(cme_err != MBTK_RIL_ERR_CME_NON) {
549 err = MBTK_RIL_ERR_CME + cme_err;
550 } else {
551 err = MBTK_RIL_ERR_UNKNOWN;
552 }
553 LOG("Get IMEI fail.");
554 }
555 else
556 {
b.liu7ca612c2025-04-25 09:23:36 +0800557 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, imei, strlen(imei));
b.liu87afc4c2024-08-14 17:33:45 +0800558 }
559 }
560 else // Set IMEI(Unsupport).
561 {
562 err = MBTK_RIL_ERR_UNSUPPORTED;
563 LOG("Unsupport set IMEI.");
564 }
565 break;
566 }
567 case RIL_MSG_ID_DEV_SN:
568 {
569 if(pack->data_len == 0 || pack->data == NULL)
570 {
571 char sn[20] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800572 if(req_sn_get(cli_info->sim_id, cli_info->port, sn, &cme_err) || strlen(sn) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800573 {
574 if(cme_err != MBTK_RIL_ERR_CME_NON) {
575 err = MBTK_RIL_ERR_CME + cme_err;
576 } else {
577 err = MBTK_RIL_ERR_UNKNOWN;
578 }
579 LOG("Get SN fail.");
580 }
581 else
582 {
b.liu7ca612c2025-04-25 09:23:36 +0800583 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, sn, strlen(sn));
b.liu87afc4c2024-08-14 17:33:45 +0800584 }
585 }
586 else // Set
587 {
588 err = MBTK_RIL_ERR_UNSUPPORTED;
589 LOG("Unsupport set SN.");
590 }
591 break;
592 }
593 case RIL_MSG_ID_DEV_MEID:
594 {
595 if(pack->data_len == 0 || pack->data == NULL)
596 {
597 err = MBTK_RIL_ERR_UNSUPPORTED;
598 LOG("Support only for CDMA.");
599 }
600 else // Set
601 {
602 err = MBTK_RIL_ERR_UNSUPPORTED;
603 LOG("Unsupport set MEID.");
604 }
605 break;
606 }
607 case RIL_MSG_ID_DEV_VERSION:
608 {
609 if(pack->data_len == 0 || pack->data == NULL)
610 {
611 char version[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800612 if(req_version_get(cli_info->sim_id, cli_info->port, version, &cme_err) || strlen(version) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800613 {
614 if(cme_err != MBTK_RIL_ERR_CME_NON) {
615 err = MBTK_RIL_ERR_CME + cme_err;
616 } else {
617 err = MBTK_RIL_ERR_UNKNOWN;
618 }
619 LOG("Get Version fail.");
620 }
621 else
622 {
b.liu7ca612c2025-04-25 09:23:36 +0800623 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, version, strlen(version));
b.liu87afc4c2024-08-14 17:33:45 +0800624 }
625 }
626 else // Set
627 {
628 err = MBTK_RIL_ERR_UNSUPPORTED;
629 LOG("Unsupport set Version.");
630 }
631 break;
632 }
633 case RIL_MSG_ID_DEV_MODEL:
634 {
635 if(pack->data_len == 0 || pack->data == NULL)
636 {
637 char model[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800638 if(req_model_get(cli_info->sim_id, cli_info->port, model, &cme_err) || strlen(model) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800639 {
640 if(cme_err != MBTK_RIL_ERR_CME_NON) {
641 err = MBTK_RIL_ERR_CME + cme_err;
642 } else {
643 err = MBTK_RIL_ERR_UNKNOWN;
644 }
645 LOG("Get Version fail.");
646 }
647 else
648 {
b.liu7ca612c2025-04-25 09:23:36 +0800649 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, model, strlen(model));
b.liu87afc4c2024-08-14 17:33:45 +0800650 }
651 }
652 else // Set
653 {
654 err = MBTK_RIL_ERR_UNSUPPORTED;
655 LOG("Unsupport set Model.");
656 }
657 break;
658 }
659 case RIL_MSG_ID_DEV_VOLTE: // <uint8> 0:Close 1:Open
660 {
661 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
662 {
663 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800664 if(req_volte_get(cli_info->sim_id, cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800665 {
666 if(cme_err != MBTK_RIL_ERR_CME_NON) {
667 err = MBTK_RIL_ERR_CME + cme_err;
668 } else {
669 err = MBTK_RIL_ERR_UNKNOWN;
670 }
671 LOG("Get VoLTE state fail.");
672 }
673 else
674 {
b.liu7ca612c2025-04-25 09:23:36 +0800675 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800676 }
677 }
678 else // Set VoLTE state.
679 {
680 if(pack->data == NULL || pack->data_len != sizeof(uint8)
681 || (*(pack->data) != 0 && *(pack->data) != 1))
682 {
683 err = MBTK_RIL_ERR_REQ_PARAMETER;
684 LOG("Set VOLTE parameter error.");
685 break;
686 }
687
688 uint8 on = *(pack->data);
b.liu7ca612c2025-04-25 09:23:36 +0800689 if(req_volte_set(cli_info->sim_id, cli_info->port, on, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800690 {
691 if(cme_err != MBTK_RIL_ERR_CME_NON) {
692 err = MBTK_RIL_ERR_CME + cme_err;
693 } else {
694 err = MBTK_RIL_ERR_UNKNOWN;
695 }
696 LOG("Set VoLTE state fail.");
697 }
698 else
699 {
b.liu7ca612c2025-04-25 09:23:36 +0800700 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800701
702 // Restart is required to take effect.
703 // LOG("Will reboot system...");
704 }
705 }
706 break;
707 }
708 case RIL_MSG_ID_DEV_TEMP:
709 {
710 if(pack->data && pack->data_len == sizeof(uint8)) {
711 int16 temp;
712 mbtk_temp_type_enum type = (mbtk_temp_type_enum)(*(pack->data));
b.liu7ca612c2025-04-25 09:23:36 +0800713 if(req_temp_get(cli_info->sim_id, cli_info->port, type, &temp, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800714 {
715 if(cme_err != MBTK_RIL_ERR_CME_NON) {
716 err = MBTK_RIL_ERR_CME + cme_err;
717 } else {
718 err = MBTK_RIL_ERR_UNKNOWN;
719 }
720 LOG("Get temperature fail.");
721 }
722 else
723 {
b.liu7ca612c2025-04-25 09:23:36 +0800724 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &temp, sizeof(int16));
b.liu87afc4c2024-08-14 17:33:45 +0800725 }
726 } else {
727 err = MBTK_RIL_ERR_UNSUPPORTED;
728 LOG("Unsupport set Temperature.");
729 }
730 break;
731 }
732 case RIL_MSG_ID_DEV_CELL_TIME:
733 {
734 if(pack->data_len == 0 || pack->data == NULL) // Get Time
735 {
736 char time[100] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800737 if(req_cell_time_get(cli_info->sim_id, cli_info->port, time, &cme_err) || strlen(time) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800738 {
739 if(cme_err != MBTK_RIL_ERR_CME_NON) {
740 err = MBTK_RIL_ERR_CME + cme_err;
741 } else {
742 err = MBTK_RIL_ERR_UNKNOWN;
743 }
744 LOG("Get cell time fail.");
745 }
746 else
747 {
b.liu7ca612c2025-04-25 09:23:36 +0800748 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, time, strlen(time));
b.liu87afc4c2024-08-14 17:33:45 +0800749 }
750 }
751 else // Set Time
752 {
753 err = MBTK_RIL_ERR_UNSUPPORTED;
754 LOG("Unsupport set cell time.");
755 }
756 break;
757 }
758 case RIL_MSG_ID_DEV_MODEM:
759 {
760 if(pack->data_len == 0 || pack->data == NULL)
761 {
b.liu7ca612c2025-04-25 09:23:36 +0800762 mbtk_radio_state_enum radio_state = ril_radio_state_get(cli_info->sim_id, cli_info->port);
b.liu87afc4c2024-08-14 17:33:45 +0800763 if(radio_state == MBTK_RADIO_STATE_UNKNOWN)
764 {
765 err = MBTK_RIL_ERR_UNKNOWN;
766 LOG("Get Version fail.");
767 }
768 else
769 {
b.liu7ca612c2025-04-25 09:23:36 +0800770 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &radio_state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800771 }
772 }
773 else // Set
774 {
775 // <func><reset>
776 if(pack->data && pack->data_len == 2) {
777 mbtk_radio_state_enum radio_state = (mbtk_radio_state_enum)(*(pack->data));
778 bool reset = *(pack->data + 1);
b.liu7ca612c2025-04-25 09:23:36 +0800779 err = ril_radio_state_set(cli_info->sim_id, cli_info->port, radio_state, reset);
b.liu87afc4c2024-08-14 17:33:45 +0800780 if(MBTK_RIL_ERR_SUCCESS == err) {
b.liu7ca612c2025-04-25 09:23:36 +0800781 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800782 }
783 } else {
784 err = MBTK_RIL_ERR_FORMAT;
785 }
786 }
787 break;
788 }
b.liu9c19cc62024-11-28 09:43:02 +0800789 case RIL_MSG_ID_DEV_POWERIND:
790 {
791 if(pack->data_len == 0 || pack->data == NULL)
792 {
793 err = MBTK_RIL_ERR_UNSUPPORTED;
794 LOG("Get POWERIND state UNSUPPORTED.");
795 }
796 else // Set powerind state.
797 {
798 uint8 state = *(pack->data);
b.liu7ca612c2025-04-25 09:23:36 +0800799 if(req_powerind_set(cli_info->sim_id, cli_info->port, state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu9c19cc62024-11-28 09:43:02 +0800800 {
801 if(cme_err != MBTK_RIL_ERR_CME_NON) {
802 err = MBTK_RIL_ERR_CME + cme_err;
803 } else {
804 err = MBTK_RIL_ERR_UNKNOWN;
805 }
806 LOG("Set POWERIND state fail.");
807 }
808 else
809 {
810 // pack_rsp_send(cli_info->fd, MBTK_INFO_ID_WAKEUP_STA_RSP, NULL, 0);
b.liu7ca612c2025-04-25 09:23:36 +0800811 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu9c19cc62024-11-28 09:43:02 +0800812 }
813 }
814 break;
815 }
b.liu7d102f82025-03-26 18:30:21 +0800816 case RIL_MSG_ID_DEV_MD_VERSION_REQ:
817 {
818 if(pack->data_len == 0 || pack->data == NULL) // Get VERSION
819 {
820 char version[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800821 if(req_md_version_get(cli_info->sim_id, cli_info->port,version, &cme_err) || strlen(version) == 0 || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu7d102f82025-03-26 18:30:21 +0800822 {
823 if(cme_err != MBTK_RIL_ERR_CME_NON) {
824 err = MBTK_RIL_ERR_CME + cme_err;
825 } else {
826 err = MBTK_RIL_ERR_UNKNOWN;
827 }
828 LOG("Get MD Version fail.");
829 }
830 else
831 {
b.liu7ca612c2025-04-25 09:23:36 +0800832 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, version, strlen((char*)version));
b.liu7d102f82025-03-26 18:30:21 +0800833 }
834 }
835 break;
836
837 }
b.liu87afc4c2024-08-14 17:33:45 +0800838 default:
839 {
840 err = MBTK_RIL_ERR_REQ_UNKNOWN;
841 LOG("Unknown request : %s", id2str(pack->msg_id));
842 break;
843 }
844 }
845
846 return err;
847}
848
849
850
851