int COM_Init (int *fd_atcmd, int *fd_uart, int *hUsbComPort) { char dev_node[32]; if(is_support_modem(1)) { snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS1)); fd_atcmd = openDeviceWithDeviceName(dev_node); } else if(is_support_modem(2)) { snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS2)); fd_atcmd = openDeviceWithDeviceName(dev_node); } if((is_support_modem(1) || is_support_modem(2)) && (*fd_atcmd == -1)) { LOGE(TAG "Open ccci port fail\r\n" ); return *fd_atcmd; } //ATE Tool use 115200 baud rate *fd_uart = open_uart_port(UART_PORT1, 115200, 8, 'N', 1); if(*fd_uart == -1) { LOGE(TAG "Open uart port %d fail\r\n" ,UART_PORT1); return *fd_uart; } else LOGD(TAG "Open uart port %d success\r\n" ,UART_PORT1); //*hUsbComPort = open("/dev/ttyGS0",O_RDWR | O_NOCTTY | /*O_NONBLOCK | */O_NDELAY); *hUsbComPort = open_usb_port(UART_PORT1, 115200, 8, 'N', 1); if(*hUsbComPort == -1) { LOGE(TAG "Open usb fail\r\n"); return *hUsbComPort; } else { //initTermIO(*hUsbComPort); LOGD(TAG "Open usb success\r\n"); } return 0; }
int get_ccci_path(int modem_index,char * path) { int idx[MAX_MODEM_INDEX] = {1,2,5}; int md_sys[MAX_MODEM_INDEX] = {MD_SYS1, MD_SYS2, MD_SYS5}; int i = 0; if(is_support_modem(idx[modem_index])) { snprintf(path, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, (CCCI_MD)md_sys[modem_index])); LOGD(TAG "CCCI Path:%s",path); return 1 ; } else { return 0 ; } }
int idle_entry(struct ftm_param *param, void *priv) { struct ftm_idle *idle = (struct ftm_idle *)priv; struct textview *tv = &idle->tv; int fd_suspend = -1, fd_backlight = -1, fd_mdm = -1; int ret = 0, key = 0, i = 0; char *s_state_mem = "mem"; char *s_state_on = "on"; char *s_backlight_on = "102"; char *s_backlight_off = "0"; char *s_mdm_txpwr_disable = "0"; char *close_com_port = "close com port!"; #ifdef MTK_ENABLE_MD1 char ccci_md1_dev[32]; #endif #ifdef MTK_ENABLE_MD2 char ccci_md2_dev[32]; #endif #ifdef MTK_MD_SHUT_DOWN_NT char ccci_md1_power_ioctl_dev[32]; char ccci_md2_power_ioctl_dev[32]; #endif const char *atcmd_ret; LOGD(TAG "%s: idle_entry\n", __FUNCTION__); init_text(&idle->title, param->name, COLOR_YELLOW); ui_init_textview(tv, idle_key_handler, (void*)idle); tv->set_title(tv, &idle->title); /* Make MD into flight mode */ #ifdef MTK_ENABLE_MD1 snprintf(ccci_md1_dev, 32, "%s", ccci_get_node_name(USR_FACTORY_IDLE, MD_SYS1)); LOGD(TAG "Open CCCI MD1 dev node: %s\n", ccci_md1_dev); fd_atcmd = openDeviceWithDeviceName(ccci_md1_dev); if (-1 == fd_atcmd) { LOGD(TAG "Fail to open CCCI interface\n"); return 0; } for (i = 0; i < 30; i++) usleep(50000); // sleep 1s wait for modem bootup #ifdef MTK_MD_SHUT_DOWN_NT snprintf(ccci_md1_power_ioctl_dev, 32, "%s", ccci_get_node_name(USR_FACTORY_IDLE_IOCTL, MD_SYS1)); LOGD(TAG "Open CCCI MD1 Power IOCTL dev node: %s\n", ccci_md1_power_ioctl_dev); fd_ioctl = openDeviceWithDeviceName(ccci_md1_power_ioctl_dev); if (-1 == fd_ioctl) { LOGD(TAG "Fail to open CCCI IOCTL interface\n"); return 0; } ExitFlightMode_PowerOffModem(fd_atcmd,fd_ioctl,FALSE); #else ExitFlightMode(fd_atcmd, FALSE); #endif #endif #ifdef MTK_ENABLE_MD2 snprintf(ccci_md2_dev, 32, "%s", ccci_get_node_name(USR_FACTORY_IDLE, MD_SYS2)); LOGD(TAG "Open CCCI MD2 dev node: %s\n", ccci_md2_dev); fd_atcmd2 = openDeviceWithDeviceName(ccci_md2_dev); if (-1 == fd_atcmd2) { LOGD(TAG "Fail to open MD2 CCCI interface\n"); return 0; } for (i = 0; i < 30; i++) usleep(50000); // sleep 1s wait for modem bootup #ifdef MTK_MD_SHUT_DOWN_NT snprintf(ccci_md2_power_ioctl_dev, 32, "%s", ccci_get_node_name(USR_FACTORY_IDLE_IOCTL, MD_SYS2)); LOGD(TAG "Open CCCI MD2 Power IOCTL dev node: %s\n", ccci_md2_power_ioctl_dev); fd_ioctlmd2 = openDeviceWithDeviceName(ccci_md2_power_ioctl_dev); if (-1 == fd_ioctlmd2) { LOGD(TAG "Fail to open CCCI MD2 IOCTL interface\n"); return 0; } ExitFlightMode_PowerOffModem(fd_atcmd2,fd_ioctlmd2,FALSE); #else ExitFlightMode(fd_atcmd2, FALSE); #endif #endif #if defined(MTK_EXTERNAL_MODEM_SLOT) && !defined(EVDO_DT_SUPPORT) #if defined(PURE_AP_USE_EXTERNAL_MODEM) fd_atcmd_dt = openDeviceWithDeviceName(CCCI_MODEM_MT8135); #else fd_atcmd_dt= openDeviceWithDeviceName(CCCI_MODEM_MT6252); #endif if (-1 == fd_atcmd_dt) { LOGD(TAG "Fail to open CCCI interface\n"); return 0; } #if defined(PURE_AP_USE_EXTERNAL_MODEM) initTermIO(fd_atcmd_dt, 5); #endif for (i = 0; i < 30; i++) usleep(50000); // sleep 1s wait for modem bootup ExitFlightMode(fd_atcmd_dt, FALSE); #endif /* Turn off thermal query MD TXPWR function */ fd_mdm = open("/proc/mtk_mdm_txpwr/txpwr_sw", O_RDWR, 0); if (fd_mdm == -1) { idle->mod->test_result = FTM_TEST_FAIL; LOGD(TAG "%s: cannot open /proc/mtk_mdm_txpwr/txpwr_sw, not support\n", __FUNCTION__); } else { ret = write(fd_mdm, s_mdm_txpwr_disable, strlen(s_mdm_txpwr_disable)); } /* Turn off backlight */ fd_backlight = open("/sys/class/leds/lcd-backlight/brightness", O_RDWR, 0); if (fd_backlight == -1) { idle->mod->test_result = FTM_TEST_FAIL; LOGD(TAG "%s: cannot open /sys/class/leds/lcd-backlight/brightness\n", __FUNCTION__); return -1; } ret = write(fd_backlight, s_backlight_off, strlen(s_backlight_off)); /* Make AP enter sleep mode */ fd_suspend = open("/sys/power/state", O_RDWR, 0); if (fd_suspend == -1) { idle->mod->test_result = FTM_TEST_FAIL; LOGD(TAG "%s: cannot open /sys/power/state\n", __FUNCTION__); return -1; } ret = write(fd_suspend, s_state_mem, strlen(s_state_mem)); if(!get_is_ata()) { while (1) { key = ui_wait_phisical_key(); LOGD(TAG "%s: %d\n", __FUNCTION__, key); ret = write(fd_suspend, s_state_on, strlen(s_state_on)); close(fd_suspend); LOGD(TAG "%s: exit from suspend\n", __FUNCTION__); break; } } else { int write_len = write(usb_com_port, close_com_port, strlen(close_com_port)); LOGD(TAG "after write data to pc\n"); if(write_len != strlen(close_com_port)) { LOGD(TAG "write data to pc fail\n"); } close_usb(); while(is_USB_State_PlugIn()) { sleep(1); } sleep(2); while(!is_USB_State_PlugIn()) { sleep(1); } ret = write(fd_suspend, s_state_on, strlen(s_state_on)); close(fd_suspend); LOGD(TAG "%s: exit from suspend\n", __FUNCTION__); usb_plug_in = 1; } close(fd_mdm); /* Turn on backlight */ ret = write(fd_backlight, s_backlight_on, strlen(s_backlight_on)); close(fd_backlight); #ifdef MTK_ENABLE_MD1 #ifdef MTK_MD_SHUT_DOWN_NT ExitFlightMode_PowerOffModem(fd_atcmd,fd_ioctl,TRUE); closeDevice(fd_ioctl); #endif closeDevice(fd_atcmd); #endif #ifdef MTK_ENABLE_MD2 #ifdef MTK_MD_SHUT_DOWN_NT ExitFlightMode_PowerOffModem(fd_atcmd2,fd_ioctlmd2,TRUE); closeDevice(fd_ioctlmd2); #endif closeDevice(fd_atcmd2); #endif #if defined(MTK_EXTERNAL_MODEM_SLOT) && !defined(EVDO_DT_SUPPORT) closeDevice(fd_atcmd_dt); #endif idle->mod->test_result = FTM_TEST_PASS; return 0; }
/// The below is for ATE signal test. void ate_signal(void) { struct itemview ate; text_t ate_title, info; char buf[100]; char buf_cmd[100]; char buf_ret[100]; int len, i; const char *pret; char dev_node[32]; int flag=0; ui_init_itemview(&ate); init_text(&info, buf, COLOR_YELLOW); ate.set_text(&ate, &info); len = sprintf(buf, "%s", "ATE Signaling Test\nEmergency call is not started\n"); //sprintf(buf+len, "%s", "Emergency call is not started\n"); ate.redraw(&ate); if(is_support_modem(1)) { if(-1 == COM_Init (&g_fd_atcmd, &g_fd_uart, &g_hUsbComPort)) { LOGE(TAG "COM_Init init fail!\n"); return; } g_fd_uart = g_hUsbComPort; } if(is_support_modem(2)){ if(g_fd_uart != -1 && g_hUsbComPort != -1) { snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS2)); g_fd_atcmdmd2 = openDeviceWithDeviceName(dev_node); if(g_fd_atcmdmd2 == -1) { LOGE(TAG "Open md2 fail\r\n"); return; } } else { if(-1 == COM_Init (&g_fd_atcmdmd2, &g_fd_uart, &g_hUsbComPort)) { LOGE(TAG "COM_Init init fail!\n"); return; } g_fd_uart = g_hUsbComPort; } } #if defined(MTK_DT_SUPPORT) && !defined(EVDO_DT_SUPPORT) if(g_fd_uart != -1 && g_hUsbComPort != -1) { g_fd_atcmdmd_dt= openDeviceWithDeviceName("/dev/ttyMT0"); if(g_fd_atcmdmd_dt== -1) { LOGE(TAG "Open md2 fail\r\n"); return; } } else { if(-1 == COM_Init (&g_fd_atcmdmd2, &g_fd_uart, &g_hUsbComPort)) { LOGE(TAG "COM_Init init fail!\n"); return; } g_fd_uart = g_hUsbComPort; } #endif for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup LOGD(TAG "fd_atcmd = %d, fd_uart = %d, hUsbComPort = %d\r\n", g_fd_atcmd, g_fd_uart, g_hUsbComPort); if(is_support_modem(1)){ ExitFlightMode (g_fd_atcmd, TRUE); } if(is_support_modem(2)){ ExitFlightMode_DualTalk (g_fd_atcmdmd2, TRUE); } #if defined(MTK_DT_SUPPORT) && !defined(EVDO_DT_SUPPORT) ExitFlightMode_DualTalk(g_fd_atcmdmd_dt, TRUE); #endif New_Thread (); while(1) { usleep(HALT_INTERVAL*20); } Free_Thread (); if(is_support_modem(1)){ COM_DeInit (&g_fd_atcmd, &g_fd_uart, &g_hUsbComPort); if(is_support_modem(2)){ if(g_fd_atcmdmd2 != -1) { close(g_fd_atcmdmd2); g_fd_atcmdmd2 = -1; } } #if defined(MTK_DT_SUPPORT) && !defined(EVDO_DT_SUPPORT) if(g_fd_atcmdmd_dt != -1) { close(g_fd_atcmdmd_dt); g_fd_atcmdmd_dt = -1; } #endif }else if(is_support_modem(2)){ COM_DeInit(&g_fd_atcmdmd2, &g_fd_uart, &g_hUsbComPort); } return; }
int sigtest_entry(struct ftm_param *param, void *priv) { char *ptr; int chosen, i; bool exit = false; struct sigtest *st = (struct sigtest *)priv; struct itemview *iv; int ret; const char *pret; int test_result_temp = FTM_TEST_PASS; char dev_node1[32]; char dev_node2[32]; char dev_node5[32]; LOGD(TAG "%s\n", __FUNCTION__); if(is_support_modem(1)){ snprintf(dev_node1, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS1)); st->fd_atmd = openDeviceWithDeviceName(dev_node1); if (-1 == st->fd_atmd) { LOGD(TAG "Fail to open CCCI interface\n"); return 0; } for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup } if(is_support_modem(2)){ snprintf(dev_node2, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS2)); st->fd_atmd2 = openDeviceWithDeviceName(dev_node2); if (-1 == st->fd_atmd2) { LOGD(TAG "Fail to open CCCI interface\n"); return 0; } for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup } #if defined(MTK_EXTERNAL_MODEM_SLOT) && !defined(EVDO_DT_SUPPORT) #if defined(PURE_AP_USE_EXTERNAL_MODEM) st->fd_atmd_dt = openDeviceWithDeviceName("/dev/ttyUSB1"); #else st->fd_atmd_dt = openDeviceWithDeviceName("/dev/ttyMT0"); #endif //st->fd_atmd_dt= openDeviceWithDeviceName(CCCI_MODEM_MT6252); if (-1 == st->fd_atmd_dt) { LOGD(TAG "Fail to open CCCI interface\n"); return 0; } for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup #endif if(is_support_modem(5)){ snprintf(dev_node5, 32, "%s", ccci_get_node_name(USR_FACTORY_DATA, MD_SYS5)); st->fd_atmd5 = openDeviceWithDeviceName(dev_node5); if (-1 == st->fd_atmd5) { LOGD(TAG "Fail to open /dev/eemcs_mux interface\n"); return 0; } for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup } for (i = 0; i<50; i++) usleep(50000); //sleep 1s wait for modem bootup if(is_support_modem(1)){ ExitFlightMode (st->fd_atmd, TRUE); } if(is_support_modem(2)){ ExitFlightMode_DualTalk (st->fd_atmd2, TRUE); } #if defined(MTK_EXTERNAL_MODEM_SLOT) && !defined(EVDO_DT_SUPPORT) ExitFlightMode_DualTalk(st->fd_atmd_dt, TRUE); #endif for (i = 0; i<30; i++) usleep(50000); //sleep 1s wait for modem bootup if(is_support_modem(5)){ ExitFlightMode (st->fd_atmd5, TRUE); } init_text(&st->title, param->name, COLOR_YELLOW); init_text(&st->text, &st->info[0], COLOR_YELLOW); memset(&st->info[0], 0, sizeof(st->info)); sprintf(st->info, "%s\n", uistr_info_emergency_call_testing); st->exit_thd = false; if (!st->iv) { iv = ui_new_itemview(); if (!iv) { LOGD(TAG "No memory"); return -1; } st->iv = iv; } iv = st->iv; iv->set_title(iv, &st->title); iv->set_items(iv, sigtest_items, 0); iv->set_text(iv, &st->text); iv->start_menu(iv,0); iv->redraw(iv); #if 0 do { chosen = iv->run(iv, &exit); switch (chosen) { #ifdef MTK_DT_SUPPORT case ITEM_CALL_FOR_MODEM_75: pret = dial112(st->fd_atmd); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", "Dial 112 Success!\n"); } else { LOGD(TAG "Dial 112 Fail\n"); sprintf(st->info, "%s\n", "Dial 112 Fail!\n"); } iv->redraw(iv); break; case ITEM_CALL_FOR_MODEM_52: pret = dial112(st->fd_atmd2); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", "Dial 112 Success!\n"); } else { LOGD(TAG "Dial 112 Fail\n"); sprintf(st->info, "%s\n", "Dial 112 Fail!\n"); } iv->redraw(iv); break; #else case ITEM_EMG_CALL: LOGD(TAG "Come to EMG Call...\n"); //mtk70828 sprintf(st->info, "%s\n", "Dial 112 on going ...!\n"); iv->redraw(iv); //mtk70828 pret = dial112(st->fd_atmd); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", "Dial 112 Success!\n"); } else { LOGD(TAG "Dial 112 Fail\n"); sprintf(st->info, "%s\n", "Dial 112 Fail!\n"); } iv->redraw(iv); break; #endif case ITEM_PASS: case ITEM_FAIL: if (chosen == ITEM_PASS) { st->mod->test_result = FTM_TEST_PASS; } else if (chosen == ITEM_FAIL) { st->mod->test_result = FTM_TEST_FAIL; } exit = true; break; } if (exit) { st->exit_thd = true; // Need to add ATH command else the loop back test will have noise. ExitFlightMode (st->fd_atmd, FALSE); #ifdef MTK_DT_SUPPORT ExitFlightMode_DualTalk (st->fd_atmd2, FALSE); #endif break; } } while (1); #endif if(is_support_modem(1)){ LOGD(TAG "Come to EMG Call IN MTK_ENABLE_MD1\n"); pret = dial112(st->fd_atmd); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_success_in_modem1); st->mod->test_result = FTM_TEST_PASS; test_result_temp = FTM_TEST_PASS; } else { LOGD(TAG "Dial 112 Fail IN MTK_ENABLE_MD1\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_fail_in_modem1); st->mod->test_result = FTM_TEST_FAIL; test_result_temp = FTM_TEST_FAIL; } ExitFlightMode (st->fd_atmd, FALSE); closeDevice(st->fd_atmd); iv->redraw(iv); } if(is_support_modem(2)){ LOGD(TAG "Come to EMG Call\n"); pret = dial112(st->fd_atmd2); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_success_in_modem2); if(test_result_temp == FTM_TEST_PASS) { st->mod->test_result = FTM_TEST_PASS; } else { st->mod->test_result = FTM_TEST_FAIL; } } else { LOGD(TAG "Dial 112 Fail in MTK_ENABLE_MD2\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_fail_in_modem2); st->mod->test_result = FTM_TEST_FAIL; } ExitFlightMode (st->fd_atmd2, FALSE); closeDevice (st->fd_atmd2); iv->redraw(iv); } #if defined(MTK_EXTERNAL_MODEM_SLOT) && !defined(EVDO_DT_SUPPORT) LOGD(TAG "Come to EMG Call\n"); pret = dial112(st->fd_atmd_dt); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_success_in_modem2); if(test_result_temp == FTM_TEST_PASS) { st->mod->test_result = FTM_TEST_PASS; } else { st->mod->test_result = FTM_TEST_FAIL; } } else { LOGD(TAG "Dial 112 Fail in MTK_ENABLE_MD2\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_fail_in_modem2); st->mod->test_result = FTM_TEST_FAIL; } ExitFlightMode (st->fd_atmd_dt, FALSE); closeDevice (st->fd_atmd_dt); iv->redraw(iv); #endif if(is_support_modem(5)){ LOGD(TAG "Come to EMG Call IN MTK_ENABLE_MD5\n"); pret = dial112(st->fd_atmd5); if(!strcmp(pret, "OK")) { LOGD(TAG "Dial 112 Success\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_success_in_modem5); st->mod->test_result = FTM_TEST_PASS; test_result_temp = FTM_TEST_PASS; } else { LOGD(TAG "Dial 112 Fail IN MTK_ENABLE_MD5\n"); sprintf(st->info, "%s\n", uistr_info_emergency_call_fail_in_modem5); st->mod->test_result = FTM_TEST_FAIL; test_result_temp = FTM_TEST_FAIL; } ExitFlightMode (st->fd_atmd5, FALSE); closeDevice(st->fd_atmd5); iv->redraw(iv); } return 0; }
int sim_entry(struct ftm_param *param, void *priv) { bool exit = false; bool evdoDtSupport = false; int passCount = 0; struct sim_factory *sim = (struct sim_factory*)priv; struct itemview *iv = NULL; LOGD(TAG "%s: Start\n", __FUNCTION__); strcpy(sim->info, ""); init_text(&sim->title, param->name, COLOR_YELLOW); init_text(&sim->text, &sim->info[0], COLOR_YELLOW); if(NULL == sim->iv) { iv = ui_new_itemview(); if(!iv) { LOGD(TAG "No memory for item view"); return -1; } sim->iv = iv; } iv = sim->iv; iv->set_title(iv, &sim->title); iv->set_items(iv, sim_items, 0); iv->set_text(iv, &sim->text); iv->start_menu(iv,0); iv->redraw(iv); sim->exit_thread = false; #ifdef EVDO_DT_VIA_SUPPORT evdoDtSupport = true; #endif if(MTK_DT_SUPPORT && !evdoDtSupport) { snprintf(dev_node_1, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM, MD_SYS1)); snprintf(dev_node_2, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM, MD_SYS2)); pthread_create(&sim->update_thread, NULL, sim_update_thread_for_dualtalk, priv); } else { if (MTK_ENABLE_MD1) { snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM, MD_SYS1)); } else if (MTK_ENABLE_MD2) { snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM, MD_SYS2)); } else if (MTK_ENABLE_MD5){ snprintf(dev_node, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM, MD_SYS5)); } else { LOGD("not open md1,md2,md5"); } pthread_create(&sim->update_thread, NULL, sim_update_thread, priv); } #if 0 while(!exit) { int chosen = iv->run(iv, &exit); switch(chosen) { case ITEM_SIM1: sim->sim_id = SIM_ID_1; sim->test_done = false; exit = false; break; case ITEM_SIM2: sim->sim_id = SIM_ID_2; sim->test_done = false; exit = false; break; case ITEM_PASS: case ITEM_FAIL: if(ITEM_PASS == chosen) { sim->mod->test_result = FTM_TEST_PASS; } else { sim->mod->test_result = FTM_TEST_FAIL; } sim->exit_thread = true; sim->test_done = true; exit = true; break; default: sim->exit_thread = true; sim->test_done = true; exit = true; LOGD(TAG "DEFAULT EXIT\n"); break; } // end switch(chosen) if(exit) { sim->exit_thread = true; } } // end while(!exit) #endif //Detect SIM 1 // strcpy(sim->info, ""); memset(sim->info, 0, sizeof(sim->info) / sizeof(*(sim->info))); sim->sim_id = SIM_ID_1; sim->test_done = false; while (strlen(sim->info) == 0) { LOGD (TAG "detect slot 1:enter"); LOGD (TAG "sim_entry:sim->info:%s, lenth:%d",sim->info,strlen(sim->info)); usleep(200000); if (strstr(sim->info, uistr_info_pass)) { passCount++; } } LOGD(TAG "[SLOT 1]passCount = %d\n", passCount); LOGD (TAG "begin redraw"); iv->redraw(iv); LOGD (TAG "end redraw"); #if defined(GEMINI) || defined(MTK_GEMINI_3SIM_SUPPORT)|| defined(EVDO_DT_VIA_SUPPORT) || defined(FTM_SIM_USE_USIMSMT) //Detect SIM 2 // strcpy(sim->info, ""); memset(sim->info, 0, sizeof(sim->info) / sizeof(*(sim->info))); sim->sim_id = SIM_ID_2; sim->test_done = false; while (strlen(sim->info) == 0) { LOGD (TAG "detect slot 2:enter"); LOGD (TAG "sim_entry:sim->info:%s, lenth:%d",sim->info,strlen(sim->info)); usleep(200000); if (strstr(sim->info, uistr_info_pass)) { passCount++; } } LOGD(TAG "[SLOT 2]passCount = %d\n", passCount); LOGD (TAG "begin redraw"); iv->redraw(iv); LOGD (TAG "end redraw"); #else passCount++; LOGD(TAG "GEMINI is not defined, do not need to check SIM2\n"); #endif #if defined(MTK_GEMINI_3SIM_SUPPORT) //Detect SIM 3 // strcpy(sim->info, ""); memset(sim->info, 0, sizeof(sim->info) / sizeof(*(sim->info))); sim->sim_id = SIM_ID_3; sim->test_done = false; while (strlen(sim->info) == 0) { LOGD (TAG "detect slot 3:enter"); LOGD (TAG "sim_entry:sim->info:%s, lenth:%d",sim->info,strlen(sim->info)); usleep(200000); if (strstr(sim->info, uistr_info_pass)) { passCount++; } } LOGD(TAG "[SLOT 3]passCount = %d\n", passCount); LOGD (TAG "begin redraw"); iv->redraw(iv); LOGD (TAG "end redraw"); #else passCount++; LOGD(TAG "MTK_GEMINI_3SIM_SUPPORT is not defined, do not need to check SIM3\n"); #endif //Exit SIM detect thread sim->exit_thread = true; sim->test_done = true; pthread_join(sim->update_thread, NULL); //Check test result if (passCount == 3) { //SIM1, SIM2 and SIM3 are detected. sim->mod->test_result = FTM_TEST_PASS; } else { sim->mod->test_result = FTM_TEST_FAIL; } LOGD(TAG "%s: End\n", __FUNCTION__); return 0; }
static void *sim_update_thread(void *priv) { LOGD(TAG "%s: Start\n", __FUNCTION__); struct sim_factory *sim = (struct sim_factory*)priv; struct itemview *iv = sim->iv; int ret_ioctl_val = -1, fd_mdreset = -1, i = 0; int switchMode; char cmd_buf[BUF_SIZE] = {0}; char rsp_buf[BUF_SIZE] = {0}; /// choose fd #ifdef EVDO_DT_VIA_SUPPORT unsigned char* str_sim1_mode = MTK_TELEPHONY_BOOTUP_MODE_SLOT1; unsigned char* str_sim2_mode = MTK_TELEPHONY_BOOTUP_MODE_SLOT2; int sim1_mode = atoi(str_sim1_mode); int sim2_mode = atoi(str_sim2_mode); LOGD("bootup telephony mode [%d, %d].\n", sim1_mode, sim2_mode); char dev_node_ioctrl[32] = {0}; if (sim1_mode == 0 || sim2_mode == 0) { /// use ioctrl to do sim switch if (MTK_ENABLE_MD1) { snprintf(dev_node_ioctrl, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM_IOCTL,MD_SYS1)); } else if (MTK_ENABLE_MD2) { snprintf(dev_node_ioctrl, 32, "%s", ccci_get_node_name(USR_FACTORY_SIM_IOCTL,MD_SYS2)); } else { LOGD("not open md1 and md2's ioctrl"); } } if (MTK_ENABLE_MD1) { fd_at= open(dev_node, O_RDWR | O_NONBLOCK); if (fd_at < 0) { LOGD(TAG "md1 open fd_at error"); return 0; } else { LOGD(TAG "md1 open fd_at %d",fd_at); } if (sim1_mode == 0 || sim2_mode == 0) { fd_ioctlmd = open(dev_node_ioctrl, O_RDWR | O_NONBLOCK); if (fd_ioctlmd < 0) { LOGD(TAG "open fd_ioctlmd error"); return 0; } else { LOGD(TAG "open fd_ioctlmd %d",fd_ioctlmd); } } //for (i = 0; i < 30; i++) usleep(50000); // sleep 1s wait for modem bootup } else { fd_at= open(dev_node, O_RDWR | O_NONBLOCK); if (fd_at < 0) { LOGD(TAG "md2 open fd_at error"); return 0; } else { LOGD(TAG "md2 open fd_at %d",fd_at); } if (sim1_mode == 0 || sim2_mode == 0) { fd_ioctlmd = open(dev_node_ioctrl, O_RDWR | O_NONBLOCK); if (fd_ioctlmd < 0) { LOGD(TAG "open fd_ioctlmd error"); return 0; } else { LOGD(TAG "open fd_ioctlmd %d",fd_ioctlmd); } } } /// if bootup mode is W+C or C+G, should do sim switch if (sim1_mode == 0 || sim2_mode == 0) { ///step1:off modem:AT+EPOF do { send_at (fd_at, "AT\r\n"); } while (wait4_ack (fd_at, NULL, 300)); LOGD(TAG "[AT]Enable Sleep Mode:\n"); if (send_at (fd_at, "AT+ESLP=1\r\n")) return -1; if (wait4_ack (fd_at, NULL, 3000)) return -1; LOGD(TAG "[AT]Power OFF Modem:\n"); if (send_at (fd_at, "AT+EFUN=0\r\n")) return -1; wait4_ack (fd_at, NULL, 15000); if (send_at (fd_at, "AT+EPOF\r\n")) return -1; wait4_ack (fd_at, NULL, 10000); ///step2:CCCI_IOC_ENTER_DEEP_FLIGHT LOGD(TAG "[AT]CCCI_IOC_ENTER_DEEP_FLIGHT \n"); ret_ioctl_val = ioctl(fd_ioctlmd, CCCI_IOC_ENTER_DEEP_FLIGHT); LOGD("[AT]CCCI ioctl result: ret_val=%d, request=%d", ret_ioctl_val, CCCI_IOC_ENTER_DEEP_FLIGHT); ///step3:modem switch switchMode = SIM_SWITCH_MODE_GSM; LOGD(TAG "Begin:switchMode to gsm with index %d", switchMode); ret_ioctl_val = ioctl(fd_ioctlmd, CCCI_IOC_SIM_SWITCH, &switchMode); if (ret_ioctl_val == -1) { LOGD(TAG "strerror(errno)=%s", strerror(errno)); } ///step4:CCCI_IOC_LEAVE_DEEP_FLIGHT LOGD(TAG "[AT]CCCI_IOC_LEAVE_DEEP_FLIGHT \n"); ret_ioctl_val = ioctl(fd_ioctlmd, CCCI_IOC_LEAVE_DEEP_FLIGHT); LOGD("[AT]CCCI ioctl result: ret_val=%d, request=%d", ret_ioctl_val, CCCI_IOC_LEAVE_DEEP_FLIGHT); ///wait 50ms close() for usleep(50000); ///close ttyC0 because of enter/leave flight modem, and sim switch close(fd_at); LOGD(TAG "close fd_at %d",fd_at); char state_buf[6] = {0}; /// check md open status int ret_mdreset = -1; int md_flag = 0; fd_mdreset = open("sys/class/BOOT/BOOT/boot/md", O_RDWR); LOGD(TAG "ret_mdreset = %d", fd_mdreset); LOGD(TAG "open sys/class/BOOT/BOOT/boot/md \n"); if (fd_mdreset < 0) { fd_mdreset = open("sys/kernel/ccci/boot", O_RDWR); LOGD(TAG "open sys/kernel/ccci/boot \n"); md_flag = 1; } if (fd_mdreset >= 0 && md_flag == 0) { do{ usleep(500000); ret_mdreset = read(fd_mdreset, state_buf, sizeof(state_buf)); LOGD(TAG "flag 0's state_buf = %s",state_buf); } while (state_buf[0]!= '2'); } else if (fd_mdreset >= 0 && md_flag == 1) { do{ usleep(500000); ret_mdreset = read(fd_mdreset, state_buf, sizeof(state_buf)); LOGD(TAG "flag 1's state_buf = %s",state_buf); } while (state_buf[4]!= '2'); } else { LOGE (TAG "open md open status file error"); } ///wait a while for modem reset //for (i = 0; i < 10; i++) usleep(50000); // sleep 500ms wait for modem bootup ///step5: open ttyC0 again for AT cmd fd_at= open(dev_node, O_RDWR); if (fd_at < 0) { LOGD(TAG "open fd_at error"); return 0; } else { LOGD(TAG "open fd_at %d",fd_at); } } #else //EVDO_DT_VIA_SUPPORT #if defined(PURE_AP_USE_EXTERNAL_MODEM) fd_at = open(DEVICE_NAME_3, O_RDWR); #else fd_at = open(dev_node, O_RDWR); #endif if(fd_at < 0) { LOGD(TAG "Fail to open %s: %s\n", dev_node,strerror(errno)); return 0; } #endif //EVDO_DT_VIA_SUPPORT LOGD(TAG "Device has been opened...\n"); const int rdTimes = 3; int rdCount = 0; int tobreak = 0; int tr = 0, rsp_len = 0, isEsims = 1; struct termios options; cfmakeraw(&options); // no timeout but request at least one character per read options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 1; tcflush(fd_at, TCIOFLUSH); if (tcsetattr(fd_at, TCSANOW, &options) == -1) { LOGD(TAG "Fail to set %s attributes!! : %s\n",dev_node, strerror(errno)); } #if defined(FTM_SIM_USE_USIMSMT) isEsims = 0; #endif #if defined(GEMINI) || defined(EVDO_DT_VIA_SUPPORT) isEsims = 1; #endif LOGD(TAG "isEsims: %d\n", isEsims); #if defined(PURE_AP_USE_EXTERNAL_MODEM) || defined(FTM_SIM_USE_USIMSMT) usleep(3000000); //ALPS01194291: sleep 3s to wait device ready memset(cmd_buf, 0, sizeof(cmd_buf)); memset(rsp_buf, 0, sizeof(rsp_buf)); strcpy(cmd_buf, "ATE0\r\n"); tcflush(fd_at, TCIOFLUSH); //ALPS01194291: clear buffer to avoid wrong data write(fd_at, cmd_buf, strlen(cmd_buf)); LOGD(TAG "Send ATE0\n"); while (tobreak == 0) { read(fd_at, rsp_buf, BUF_SIZE); rsp_len = strlen(rsp_buf); LOGD(TAG "------AT+ATE0 echo start------\n"); LOGD(TAG "%d\n", rsp_len); LOGD(TAG "%s\n", rsp_buf); LOGD(TAG "------AT+ATE0 echo end------\n"); for (tr = 0; tr < rsp_len; tr++) { if (rsp_buf[tr] == 'O') { tobreak = 1; LOGD(TAG "Got Ok!------\n"); break; } } } usleep(HALT_TIME * 10); #endif int retryTime = 0; while(1) { usleep(500000); if (sim->exit_thread) { LOGD(TAG "Exit thread\n"); break; } //memset(sim->info, 0, sizeof(sim->info) / sizeof(*(sim->info))); if (!sim->test_done) { int ret = -1; sim->test_done = true; memset(cmd_buf, 0, sizeof(cmd_buf)); memset(rsp_buf, 0, sizeof(rsp_buf)); // to detect 3G capability retryTime = 0; if (isEsims == 1) { /* Use ESIMS to do SIM detect */ int sim_switch_flag = 0; int swtich_to_SIM2 = 0; int swtich_to_SIM3 = 0; sim_switch_flag = check3GSwitchStatus(fd_at); swtich_to_SIM2 = (((sim->sim_id == SIM_ID_1) && (sim_switch_flag == 2)) || ((sim->sim_id == SIM_ID_2) && (sim_switch_flag == 1))); swtich_to_SIM3 = (((sim->sim_id == SIM_ID_1) && (sim_switch_flag == 3)) || ((sim->sim_id == SIM_ID_3) && (sim_switch_flag == 1))); //SIM1=4, SIM2=5, SIM3=6 if(swtich_to_SIM2) { // switch UART to SIM2 sendEsuo(fd_at, 5); } else if (swtich_to_SIM3) { // switch UART to SIM3 sendEsuo(fd_at, 6); } int nread = 0; tcflush(fd_at, TCIOFLUSH); //ALPS01194291: clear buffer to avoid wrong data memset(cmd_buf, 0, sizeof(cmd_buf)); memset(rsp_buf, 0, sizeof(rsp_buf)); strcpy(cmd_buf, "AT+ESIMS\r\n"); write(fd_at, cmd_buf, strlen(cmd_buf)); LOGD(TAG "Send AT+ESIMS\n"); tobreak = 0; while (tobreak == 0) { nread = read(fd_at, rsp_buf, BUF_SIZE); rsp_len = strlen(rsp_buf); LOGD(TAG "------AT+ESIMS(SIM%d) start------\n", sim->sim_id); LOGD(TAG "nread= %d len=%d buf=%s \n", nread, rsp_len,rsp_buf); LOGD(TAG "------AT+ESIMS(SIM%d) end------\n", sim->sim_id); ret = checkESIMSStatus(rsp_buf); if (ret != -1) { tobreak = 1; LOGD(TAG "Got response!------\n"); break; } } // switch only if 3G on SIM 1 if (swtich_to_SIM2 || swtich_to_SIM3) { sendEsuo(fd_at, 4); } } else { /* Use USIMSMT to do SIM detect */ do { retryTime++; if (sim->sim_id == SIM_ID_1) { strcpy(cmd_buf, "AT+USIMSMT=1\r\n"); } else if (sim->sim_id == SIM_ID_2) { strcpy(cmd_buf, "AT+USIMSMT=2\r\n"); } write(fd_at, cmd_buf, strlen(cmd_buf)); LOGD(TAG "Send AT+USIMSMT=%d\n", sim->sim_id); usleep(HALT_TIME); read(fd_at, rsp_buf, BUF_SIZE); //usleep(HALT_TIME); tr = 0; tobreak = 0; rsp_len = strlen(rsp_buf); LOGD(TAG "------AT+USIMSMT(SIM%d) start------\n", sim->sim_id); LOGD(TAG "%s\n", rsp_buf); ret = checkUsimSmtStatus(rsp_buf); if ((ret == RET_ESIMS_YES) || (ret == RET_ESIMS_NO)) { for (tr = 0; tr < rsp_len; tr++) { if (rsp_buf[tr] == 'O') { tobreak = 1; LOGD(TAG "Got USIMSMT Ok!------\n"); break; } } if (tobreak == 0) { // Didn't get OK yet, so read again memset(rsp_buf, 0, sizeof(rsp_buf)); read(fd_at, rsp_buf, BUF_SIZE); LOGD(TAG "%s\n", rsp_buf); } } LOGD(TAG "------AT+USIMSMT(SIM%d) end------\n", sim->sim_id); }while (ret == -1 && (retryTime < 3)); } if (ret != -1) { rdCount = 0; } else { if (rdCount < rdTimes) { LOGD(TAG "detect unknown response, redo\n"); rdCount++; sim->test_done = false; continue; } } if(ret == RET_ESIMS_YES) { sprintf(sim->info + strlen(sim->info), "%s%d: %s.\n", uistr_info_detect_sim, sim->sim_id, uistr_info_pass); LOGD(TAG "Detect SIM%d: Pass.\n",sim->sim_id); } else { sprintf(sim->info + strlen(sim->info), "%s%d: %s!!\n", uistr_info_detect_sim, sim->sim_id, uistr_info_fail); LOGD(TAG "Detect SIM%d: Fail.\n",sim->sim_id); } //LOGD(TAG "redraw\n"); //iv->redraw(iv); } // end if(!sim->test_done) } // end while(1) #ifdef EVDO_DT_VIA_SUPPORT ///maybe not need to do. This is Factory mode test, when normal power on, modem will reset again. if (sim1_mode == 0 || sim2_mode == 0) { close(fd_at); fd_at = -1; switchMode = SIM_SWITCH_MODE_CDMA; LOGD(TAG "End:switchMode to cdma with index %d", switchMode); ret_ioctl_val = ioctl(fd_ioctlmd, CCCI_IOC_SIM_SWITCH, &switchMode); if (ret_ioctl_val == -1) { LOGD(TAG "strerror(errno)=%s", strerror(errno)); } close(fd_ioctlmd); fd_ioctlmd = -1; close(fd_mdreset); fd_mdreset = -1; } else { close(fd_at); fd_at = -1; } #else close(fd_at); fd_at = -1; #endif LOGD(TAG "%s: Exit\n", __FUNCTION__); return NULL; }