blob: 55638efff48866cd357a89d504dea1ab74c81164 [file] [log] [blame]
/*
* MBTK Basic AT Process.
*
* Author : lb
* Date : 2021/11/5 10:14:32
*
*/
#include "mbtk_at.h"
#include "mbtk_device_info.h"
#include "mbtk/mbtk_type.h"
#include "mbtk/mbtk_device.h"
#include <dlfcn.h>
//#include <sys/statfs.h>
#include <sys/vfs.h>
#include <errno.h>
#include <linux/magic.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include <cutils/properties.h>
#include "configwrapper.h"
#include<linux/msg.h>
//#include "gps.h"
#include "atcmdsvr_ubus.h"
#define MAX_GPIO_TEST_NUM 60
typedef int (*mbtk_dev_info_read_func)(mbtk_device_info_item_enum, void *, int);
#define MBTK_LIB_PATH "/lib/libmbtk_lib.so"
const struct blobmsg_policy gps_user_cb_policy1[] = {
[0] = {
.name = "event",
.type = BLOBMSG_TYPE_INT32,
},
};
bool mbtk_urc_enable = TRUE;
int mbtk_at_loopback(int type);
int mbtk_at_play(const char *args);
int mbtk_at_rec(const char *args);
typedef struct
{
int gpio;
bool busy;
bool state;
} mbtk_gpio_state_t;
static bool gpio_test_usable = true;
static mbtk_gpio_state_t gpio_pins[] =
{
{22, FALSE, FALSE}, // IN
{33,FALSE,FALSE},
{35,FALSE,FALSE},
{36,FALSE,FALSE},
{34,FALSE,FALSE},
{21,FALSE,FALSE},
{4,FALSE,FALSE},
{123,FALSE,FALSE},
{20,FALSE,FALSE},
{43,FALSE,FALSE},
{13,FALSE,FALSE},
// {12,FALSE,FALSE},
{14,FALSE,FALSE},
{118,FALSE,FALSE},
// {19,FALSE,FALSE},
{120,FALSE,FALSE},
{49,FALSE,FALSE},
{50,FALSE,FALSE},
{32,FALSE,FALSE},
{31,FALSE,FALSE},
{51,FALSE,FALSE},
// {23,FALSE,FALSE},
{24,FALSE,FALSE},
{52,FALSE,FALSE},
{27,FALSE,FALSE},
{28,FALSE,FALSE},
{26,FALSE,FALSE},
{25,FALSE,FALSE},
{5,FALSE,FALSE},
{0,FALSE,FALSE},
{1,FALSE,FALSE},
{2,FALSE,FALSE},
{3,FALSE,FALSE},
{6,FALSE,FALSE},
{7,FALSE,FALSE},
{15,FALSE,FALSE},
{18,FALSE,FALSE},
{16,FALSE,FALSE},
{17,FALSE,FALSE},
{54,FALSE,FALSE},
{53,FALSE,FALSE},
{48,FALSE,FALSE},
{55,FALSE,FALSE},
{58,FALSE,FALSE},
{57,FALSE,FALSE},
{29,FALSE,FALSE},
{30,FALSE,FALSE},
{99,FALSE,FALSE},
{126,FALSE,FALSE},
{125,FALSE,FALSE},
{56,FALSE,FALSE},
{59,FALSE,FALSE},
{117,FALSE,FALSE},
// {122,FALSE,FALSE}
};
int gpio_register_auto_test_out(int *result);
#define MBTK_GPIO_NUM (sizeof(gpio_pins)/sizeof(mbtk_gpio_state_t))
static bool dev_info_inited = FALSE;
static mbtk_device_info_basic_t info_basic;
static mbtk_device_info_modem_t info_modem;
static int dev_info_get()
{
if(dev_info_inited) {
return 0;
}
void *handle = dlopen(MBTK_LIB_PATH , RTLD_LAZY);
if(handle == NULL)
{
DBGMSG(MBTK_AT, "dlopen() %s fail : %d", MBTK_LIB_PATH, errno);
return -1;
}
mbtk_dev_info_read_func dev_info_read = (mbtk_dev_info_read_func)dlsym(handle, "mbtk_dev_info_read");
if(dev_info_read == NULL)
{
DBGMSG(MBTK_AT, "dlsym(mbtk_dev_info_read) fail : %d", errno);
return -1;
}
memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));
memset(&info_modem, 0, sizeof(mbtk_device_info_modem_t));
// mbtk_dev_info_read()
int result = dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
if(result) {
DBGMSG(MBTK_AT, "mbtk_dev_info_read(BASIC) fail.");
return -1;
}
result = dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, &info_modem, sizeof(mbtk_device_info_modem_t));
if(result) {
DBGMSG(MBTK_AT, "mbtk_dev_info_read(MODEM) fail.");
return -1;
}
dev_info_inited = TRUE;
return 0;
}
static char* band_area_2_str(mbtk_modem_band_area_enum band_area)
{
switch(band_area) {
case MBTK_MODEM_BAND_AREA_CN:
return "CN";
case MBTK_MODEM_BAND_AREA_EU:
return "EU";
case MBTK_MODEM_BAND_AREA_SA:
return "SA";
default:
return "DEF";
}
}
static int gpio_export(void)
{
int index=0;
int file=-1;
int result =-1;
char pin_index_buffer[5]= {0};
for(index = 0; index < MBTK_GPIO_NUM; index++)
{
file = open("/sys/class/gpio/export",O_WRONLY);
if(file == -1)
{
LOG("Open gpio export file fail.");
return -1;
}
memset(pin_index_buffer,0,5);
sprintf(pin_index_buffer,"%d",gpio_pins[index].gpio);
result = write(file,pin_index_buffer,strlen(pin_index_buffer));
if(result < 0)
{
LOG("Gpio[%d] export fail.", gpio_pins[index].gpio);
gpio_pins[index].busy = TRUE;
}
close(file);
}
return 0;
}
static int gpio_unexport(void)
{
int index=0;
int file=-1;
int result =-1;
char pin_index_buffer[5]= {0};
for(index = 0; index < MBTK_GPIO_NUM; index++)
{
if(!gpio_pins[index].busy)
{
file = open("/sys/class/gpio/unexport",O_WRONLY);
if(file == -1)
{
LOG("Open gpio unexport file fail.");
return -1;
}
memset(pin_index_buffer,0,5);
sprintf(pin_index_buffer,"%d",gpio_pins[index].gpio);
result=write(file,pin_index_buffer,strlen(pin_index_buffer));
if(result < 0)
{
close(file);
LOG("Gpio[%d] unexport fail.",gpio_pins[index].gpio);
return -1;
}
close(file);
}
}
return 0;
}
static int gpio_direct_set(char *value,int gpio)
{
char buffer[50]= {0};
int file =-1;
int result =-1;
memset(buffer,0,50);
sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
file = open(buffer, O_WRONLY);
if(file == -1)
{
LOG("Open gpio[%d] direct fail.", gpio);
return -1;
}
result = write(file,value,strlen(value));
if(result != strlen(value))
{
LOG("Set gpio[%d] direct fail.", gpio);
close(file);
return -1;
}
close(file);
return 0;
}
static int gpio_value_get(int gpio)
{
char buffer[50];
char path[10];
int file =-1;
int result =-1;
int value;
memset(path,0,50);
memset(buffer,0,10);
sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
file = open(path,O_RDONLY);
if(file == -1)
{
LOG("Open gpio[%d] fail.", gpio);
return -1;
}
result = read(file,buffer,5);
if(result <= 0)
{
LOG("Get gpio[%d] value fail", gpio);
close(file);
return -1;
}
close(file);
value = atoi(buffer);
return value;
}
static int gpio_value_set(int value, int gpio)
{
char buffer[50]= {0};
int file =-1;
int result =-1;
memset(buffer,0,50);
sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
file = open(buffer,O_WRONLY);
if(file == -1)
{
LOG("Open gpio[%d] value fail.", gpio);
return -1;
}
if(value == 0) {
result = write(file,"0",1);
} else {
result = write(file,"1",1);
}
if(result != 1)
{
LOG("Set gpio[%d] value fail.", gpio);
close(file);
return -1;
}
close(file);
return 0;
}
//type:0 value 0
//type:1 value 1
//type:2 direction "out"
//type:3 direction "in"
static int one_gpio_export(int gpio, int type)
{
int index=0;
int file=-1;
int file1=-1;
int result =-1;
char pin_index_buffer[5]= {0};
char buffer[50]= {0};
int ret =0;
file = open("/sys/class/gpio/export",O_WRONLY);
if(file == -1)
{
LOG("Open gpio export file fail.");
return -1;
}
memset(buffer,0,50);
sprintf(buffer,"/sys/class/gpio/gpio%d", gpio);
file1 = open(buffer,O_RDONLY);
if(file1 != -1)
{
//file is created
}
else{ // create gpio
memset(pin_index_buffer,0,5);
sprintf(pin_index_buffer,"%d",gpio);
result = write(file,pin_index_buffer,strlen(pin_index_buffer));
if(result < 0)
{
ATRESP(IND_REQ_HANDLE , ATCI_RESULT_CODE_NULL, 0, "Gpio export fail");
LOG("Gpio[%d] export fail.", gpio);
return -1;
}
}
close(file);
switch(type)
{
case 0 :
{
ret = gpio_value_set(0, gpio);
break;
}
case 1:
{
ret = gpio_value_set(1, gpio);
break;
}
case 2:
{
ret = gpio_direct_set("out", gpio);
break;
}
case 3:
{
ret = gpio_direct_set("in", gpio);
break;
}
default:
{
break;
}
}
return ret;
}
static int gpio_test(void)
{
int index = 0;
int fail_count = 0;
gpio_export();
gpio_direct_set("in", gpio_pins[0].gpio);
//set all gpio low level start
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
if(!gpio_pins[index].busy)
{
gpio_direct_set("out", gpio_pins[index].gpio);
gpio_value_set(0, gpio_pins[index].gpio);
}
}
if(gpio_value_get(gpio_pins[0].gpio) != 0)
{
LOG("gpio_test set all gpio level[%d] fail", gpio_pins[0].gpio);
gpio_unexport();
return -1;
}
//set all gpio low level end
#if 1
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
if(!gpio_pins[index].busy)
{
gpio_value_set(1, gpio_pins[index].gpio);
if(gpio_value_get(gpio_pins[index].gpio) == 1 && gpio_value_get(gpio_pins[0].gpio) == 1)
{
gpio_pins[index].state = TRUE;
}
else
{
LOG("gpio[%d] input not match output level [1]", gpio_pins[index].gpio);
gpio_pins[index].state = FALSE;
fail_count++;
continue;
}
}
}
if(fail_count > 0) {
gpio_unexport();
return fail_count;
}
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
if(!gpio_pins[index].busy)
{
gpio_value_set(0, gpio_pins[index].gpio);
if(gpio_value_get(gpio_pins[index].gpio) == 0 && gpio_value_get(gpio_pins[0].gpio) == 0)
{
gpio_pins[index].state = TRUE;
}
else
{
LOG("gpio[%d] input not match output level [0]", gpio_pins[index].gpio);
gpio_pins[index].state = FALSE;
fail_count++;
continue;
}
}
}
gpio_unexport();
#endif
return fail_count;
}
static int gpio_test2(void)
{
int index=0;
int value=0;
int fail_count = 0;
//export all test gpio
gpio_export();
//set main control gpio in
gpio_direct_set("in", gpio_pins[0].gpio);
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
gpio_direct_set("out",gpio_pins[index].gpio);
gpio_value_set(1, gpio_pins[index].gpio);
}
if(gpio_value_get(gpio_pins[0].gpio) != 1)
{
LOG("gpio_test set all gpio level[%d] fail", gpio_pins[0].gpio);
gpio_unexport();
return -1;
}
//set all gpio value as 0
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
gpio_value_set(0, gpio_pins[index].gpio);
}
//set gpio direct in except main control gpio
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
gpio_direct_set("in",gpio_pins[index].gpio);
}
//set main control gpio out
gpio_direct_set("out",gpio_pins[0].gpio);
gpio_value_set(1,gpio_pins[0].gpio);
for(index = 1; index < MBTK_GPIO_NUM; index++)
{
value = -1;
value=gpio_value_get(gpio_pins[index].gpio);
if(1==value)
{
gpio_pins[index].state = TRUE;
}
else
{
LOG("gpio[%d] input not match output level [0]", gpio_pins[index].gpio);
gpio_pins[index].state = FALSE;
fail_count++;
continue;
}
}
//unexport gpio
gpio_unexport();
return fail_count;
//set main
}
uint64 partion_space_get(const char *path)
{
unsigned long long totle = 0;
unsigned long long blocksize = 0;
struct statfs diskInfo;
if(path == NULL){
return 0;
}
memset(&diskInfo, 0, sizeof(diskInfo));
if(statfs(path, &diskInfo)){
LOG("statfs() fail - %d.", errno);
return 0;
}
blocksize = diskInfo.f_bsize;
LOG("path=%s [totle=%lld MB] :f_type= %lld, f_bsize=%lld, f_blocks=%lld, f_bfree=%lld, f_bavail%lld\n", path,totle,
diskInfo.f_type, diskInfo.f_bsize,diskInfo.f_blocks,diskInfo.f_bfree, diskInfo.f_bavail);
// MSDOS_SUPER_MAGIC 0x4d44
if((diskInfo.f_type & 0x0ffff) == MSDOS_SUPER_MAGIC) {
totle = (diskInfo.f_blocks * blocksize) >> 20;
return totle;
} else {
LOG("Unknow fs type : %x", diskInfo.f_type);
return 0;
}
}
static unsigned int shell_at_handle;
static void shell_cb_func(char *buf,int buf_size)
{
if(buf && buf_size > 0)
{
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "+MSHELL: %d\r\n%s\r\n",
buf_size, buf);
//MBTK_FUNC(log_hex)("+MSHELL", buf, buf_size);
ATRESP(shell_at_handle, ATCI_RESULT_CODE_NULL, 0, resp_buf);
}
}
int metis_strptime(char *str_time)
{
struct tm stm;
char dateTime[30];
struct timeval tv;
if( strptime(str_time, "%Y-%m-%d %H:%M:%S",&stm) != NULL)
{
printf("success\n");
}
else{
printf("error\n");
return -1;
}
// printf("设置系统时间前的时间是:\n");
// system("date");
time_t _t = mktime(&stm);
// stime(&_t);
tv.tv_sec = _t;
// tv.tv_usec = USEC(pnew_time_packet->transmit_timestamp.fine);
settimeofday(&tv, NULL);
printf("设置系统时间HOU的时间是:\n");
// system("date");
return 0;
}
extern int mbtk_time_type;
#if 0
static void gpio_timer_alrm_func(int signo)
{
LOG("TIMEOUT : %d", signo);
if(SIGALRM == signo) {
gpio_test_usable = true;
LOG("gpio_test_usable has reset to true.");
}
}
#else
static void* gpio_thread_func(void *arg)
{
sleep(1);
gpio_test_usable = true;
LOG("gpio_test_usable has reset to true.");
return NULL;
}
#endif
#ifdef MBTK_DATA_MODE_SUPPORT
static void data_mode_callback_cb(const char *data, int data_len)
{
LOG("DATA - %d:%s", data_len, data);
}
#endif
utlReturnCode_T MBTK_AT_MTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlSUCCESS;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
unsigned int svc_id = 0;
*xid_p = At_handle;
const static int arg2_len_max = 10;
static int arg1 = 0;
static char arg2[MBTK_AT_RESP_LEN_MAX];
LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
sprintf(resp_buf, "%s : %d,\"%s\"\r\n", command_name_p, arg1, arg2);
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
int len = 0;
memset(arg2, 0x0, MBTK_AT_RESP_LEN_MAX);
if(!getExtString(parameter_values_p, 1, arg2, arg2_len_max, &len, "test"))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
break;
}
case TEL_EXT_ACTION_CMD :
{
// ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
#ifdef MBTK_DATA_MODE_SUPPORT
ret = mbtk_data_mode_enter(sAtp_index, data_mode_callback_cb);
#else
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
#endif
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MINFO_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
if(!dev_info_get()) {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX,
"Revision:%s\r\n"
"Custom_Model:%s\r\n"
"Module_Type:%s\r\n",
strlen(info_basic.revision_out) > 0 ? info_basic.revision_out: "Unknown",
strlen(info_basic.project_cust) > 0 ? info_basic.project_cust: "Unknown",
band_area_2_str(info_modem.band_area));
} else {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX,
"Revision:%s\r\n"
"Custom_Model:%s\r\n"
"Module_Type:%s\r\n",
"Unknown", "Unknown", "Unknown");
}
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_SYSTIME_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlSUCCESS;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
unsigned int svc_id = 0;
*xid_p = At_handle;
const static int arg2_len_max = 10;
static int arg1 = 0;
printf("MBTK_AT_SYSTIME_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
char time_type[10] = {0};
property_get("persist.mbtk.time_type", time_type, "0");
mbtk_time_type = atoi(time_type);
sprintf(resp_buf, "%s: %d\r\n", command_name_p, mbtk_time_type);
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 2, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(num_parameters > 1) {
const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
static char time_str[MBTK_AT_RESP_LEN_MAX];
int len = 0;
memset(time_str, 0x0, MBTK_AT_RESP_LEN_MAX);
if(!getExtString(parameter_values_p, 1, time_str, cmd_len_max, &len, ""))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
LOG("Get CMD Fail.");
break;
}
if(strlen(time_str) > 0)
{
ret = metis_strptime(time_str);
}
}
mbtk_time_type = arg1;
char type_str[10] = {0};
sprintf(type_str, "%d", mbtk_time_type);
property_set("persist.mbtk.time_type", type_str);
if(ret < 0)
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
}
else
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MTESTF_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlSUCCESS;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
unsigned int svc_id = 0;
*xid_p = At_handle;
const static int arg2_len_max = 10;
static int arg1 = 0;
static char arg2[MBTK_AT_RESP_LEN_MAX];
LOG("MBTK_AT_MTESTF_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
sprintf(resp_buf, "%s : %d,\"%s\"\r\n", command_name_p, arg1, arg2);
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
int len = 0;
memset(arg2, 0x0, MBTK_AT_RESP_LEN_MAX);
if(!getExtString(parameter_values_p, 1, arg2, arg2_len_max, &len, "test"))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
break;
}
case TEL_EXT_TEST_CMD :
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "+MTESTF=(0,1),\"\"");
break;
}
case TEL_EXT_ACTION_CMD :
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, "ACTION_OK");
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MSHELL_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
shell_at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = shell_at_handle;
LOG("MBTK_AT_MSHELL_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD :
{
const static int cmd_len_max = MBTK_AT_RESP_LEN_MAX;
static char cmd[MBTK_AT_RESP_LEN_MAX];
int len = 0;
memset(cmd, 0x0, MBTK_AT_RESP_LEN_MAX);
if(!getExtString(parameter_values_p, 0, cmd, cmd_len_max, &len, ""))
{
ret = ATRESP(shell_at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
LOG("Get CMD Fail.");
break;
}
//if(strlen(cmd) > 0 && mbtk_cmd_line_ex(cmd, shell_cb_func))
if(strlen(cmd) > 0 && MBTK_FUNC(mbtk_cmd_line_ex)(cmd, shell_cb_func))
{
ret = ATRESP(shell_at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
else
{
LOG("CMD length error.");
break;
}
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_ISLKVRSCAN_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("MBTK_AT_ISLKVRSCAN_PROCESS enter with command_op [%s]", op2str(op));
#ifndef MBTK_BUILD_TIME
#define MBTK_BUILD_TIME "Unknown"
#endif
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
if(!dev_info_get()) {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Version: %s\r\nBuild time: %s\r\n",
strlen(info_basic.revision_out) > 0 ? info_basic.revision_out: "Unknown",
strlen(info_basic.build_time) > 0 ? info_basic.build_time: "Unknown");
} else {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Version: %s\r\nBuild time: %s\r\n",
"Unknown", "Unknown");
}
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_SDTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("%s enter with command_op [%s]", command_name_p, op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
// SDVOLUME:xxxMB
// OK
// /mnt/mmcblk0p1
#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108) || defined(MBTK_PROJECT_L509) || defined(MBTK_PROJECT_L508))
int i =0 ;
uint64 size = 0;
for(i = 0; i < 3; i++)
{
if(i == 0)
{
size = partion_space_get("/sdcard");
}
else if(i == 1)
{
size = partion_space_get("/system/etc/www/webdav/sdcard");
}
else
{
system("mkfs.vfat -F 32 /dev/mmcblk0");
system("mount -t vfat /dev/mmcblk0 /mnt");
size = partion_space_get("/mnt");
}
if(size > 0)
{
LOG("[SDTEST] i = %d, size = %d", i, size);
break;
}
size = 0;
}
#else
uint64 size = partion_space_get("/mnt/mmcblk0p1");
#endif
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
if(size > 0) {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "SDVOLUME:%lldMB\r\n", size);
} else {
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "SDVOLUME:0MB\r\n");
}
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_SPKTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("MBTK_AT_SPKTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
// SDVOLUME:MB
// OK
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
mbtk_at_play(NULL);
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio spk test.\r\nBuild time: %s\r\n",
MBTK_BUILD_TIME);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MICTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("MBTK_AT_MICTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
// SDVOLUME:MB
// OK
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
mbtk_at_rec(NULL);
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio record test.\r\nBuild time: %s\r\n",
MBTK_BUILD_TIME);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_REVTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int arg1 = 0;
static bool loopback_running = FALSE;
LOG("MBTK_AT_REVTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
sprintf(resp_buf, "%s : %d\r\n", command_name_p, arg1);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
if(arg1 == 1)
{
system("ubus call audio_if loopback_enable '{\"param0\":1}'");
}
else
{
system("ubus call audio_if loopback_disable");
}
#else
LOG("MBTK_AT_REVTEST_PROCESS arg1 [%d]", arg1);
mbtk_at_loopback(arg1);
//sprintf(resp_buf, "%s : ,\"%s\"\r\n", command_name_p, "TEL_EXT_SET_CMD");
#endif
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
break;
}
case TEL_EXT_ACTION_CMD :
{
if(!loopback_running) {
#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
system("ubus call audio_if loopback_enable '{\"param0\":1}'");
#else
mbtk_at_loopback(1);
#endif
loopback_running = TRUE;
} else {
#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
system("ubus call audio_if loopback_disable");
#else
mbtk_at_loopback(0);
#endif
loopback_running = FALSE;
}
//snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "Audio loopback test.\r\nBuild time: %s\r\n",
// MBTK_BUILD_TIME);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_GPIOTEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
int gnss_support = 0;
*xid_p = at_handle;
LOG("MBTK_AT_GPIOTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &gnss_support, 0, 1, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
}
case TEL_EXT_ACTION_CMD :
{
if(gpio_test_usable) {
gpio_test_usable = false;
} else { // GPIO test is busy.
ret = ATRESP(at_handle, ATCI_RESULT_CODE_SUPPRESS, 0, NULL);
break;
}
#if 1
int test_result[MAX_GPIO_TEST_NUM];
memset(test_result,0,sizeof(test_result));
int result = mbtk_at_gpio((bool)gnss_support, test_result);
if(result < 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "GPIO TEST FAIL\r\n");
}
else if(result == 0) {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "ALL GPIO TEST PASS\r\n");
}
else
{
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int index;
sprintf(resp_buf, "GPIOTEST Fail %02d PINs:", result);
for(index = 0; index < result &&index < MAX_GPIO_TEST_NUM; index++)
{
sprintf(resp_buf + strlen(resp_buf), "%03d,", test_result[index]);
}
resp_buf[strlen(resp_buf) - 1] = '\r';
resp_buf[strlen(resp_buf)] = '\n';
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
}
#else
int fail_count = gpio_test();
if(fail_count < 0) {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "GPIO TEST FAIL\r\n");
} else if(fail_count == 0){
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "ALL GPIO TEST PASS\r\n");
} else {
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int index;
sprintf(resp_buf, "GPIOTEST Fail %02d PINs:", fail_count);
for(index = 0; index < MBTK_GPIO_NUM; index++)
{
if(!gpio_pins[index].state) {
sprintf(resp_buf + strlen(resp_buf), "%03d,", gpio_pins[index].gpio);
}
}
resp_buf[strlen(resp_buf) - 1] = '\r';
resp_buf[strlen(resp_buf)] = '\n';
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
}
#endif
// Set gpio_test_usable to true after 1s.
#if 0
signal(SIGALRM, gpio_timer_alrm_func);
struct itimerval val;
// Only time
val.it_interval.tv_sec = 0;
val.it_interval.tv_usec = 0;
// Time
val.it_value.tv_sec = 1;
val.it_value.tv_usec = 0;
if (setitimer(ITIMER_REAL, &val, NULL) == -1)
{
LOG("setitimer fail.[errno - %d]",errno);
}
#else
pthread_t gpio_thread_id;
if (pthread_create(&gpio_thread_id, NULL, gpio_thread_func, NULL) != 0)
{
LOG("%s errno: %d (%s)",__func__, errno, strerror(errno));
}
#endif
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_ADCGETV_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int arg1 = 0;
*xid_p = at_handle;
LOG("MBTK_AT_ADCGETV_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
// SDVOLUME:MB
// OK
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "ADC Version: %s\r\nBuild time: %s\r\n",
MBTK_DEVICES_REVISION, MBTK_BUILD_TIME);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
int adc_ret;
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 2, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
adc_ret = mbtk_at_adc(arg1);
LOG("MBTK_AT_ADC_PROCESS adc [%d]", adc_ret);
sprintf(resp_buf, "%s:%d,%d\r\n", command_name_p, arg1, adc_ret);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_RGMIITEST_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("MBTK_AT_RGMIITEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_ACTION_CMD :
{
#if defined(MBTK_PROJECT_T108)
int result = -1;
int rgmii_test_num = 0;
char buf[50] = {0};
static char rgmii_flag = 0;
//mbtk_mdio("eth0", 0, 0x9800, 0xc834);
//mbtk_mdio("eth0", 0, 0x0, 0xa000);
for(rgmii_test_num = 0; rgmii_test_num < 3; rgmii_test_num++)
{
if(!rgmii_flag)
{
system("/bin/mbtk_mdio eth0 0x9800 0xc834");
system("/bin/mbtk_mdio eth0 0x0 0xa000");
}
result = mbtk_rgmii_loopback();
if(result < 0)
{
//
}
else
{
memcpy(buf, "+RGMIITEST: phy loopback ok", strlen("+RGMIITEST: phy loopback ok"));
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, buf);
rgmii_flag = 1;
break;
}
}
if(result < 0)
{
memcpy(buf, "+RGMIITEST: phy loopback fail", strlen("+RGMIITEST: phy loopback fail"));
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, buf);
}
break;
#endif
}
default:
{
ret = ATRESP( at_handle, ATCI_RESULT_CODE_CME_ERROR, CME_OPERATION_NOT_SUPPORTED, NULL);
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MGPSC_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int arg1 = 0;
*xid_p = at_handle;
LOG("MBTK_AT_MGPSC_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD :
{
int gnss_ret;
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 11, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
#if 1
if (arg1 == 5 || arg1 == 1 || arg1 ==0)
{
if (1 == arg1)
{
gnss_ret = mbtk_mgpsc_set(arg1);
if (gnss_ret < 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "+GPS: init fail.\r\n");
}
else
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "+GPS: init success.\r\n");
}
}
else if (arg1 == 5)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
else
{
gnss_ret = mbtk_mgpsc_set(arg1);
if (gnss_ret < 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, "+GPS: deinit fail.\r\n");
}
else
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, "+GPS: deinit success.\r\n");
} }
}
else
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
#else
if(1 == arg1 || 11 == arg1 || 10 == arg1 || 9 == arg1)
gnss_ret = MBTK_FUNC(mbtk_at_gnss)(arg1, at_gnss_handler_function);
else if (6 == arg1)
gnss_ret = at_gnss_firmware_update();
else
gnss_ret = MBTK_FUNC(mbtk_at_gnss)(arg1, NULL);
LOG("%s gnss [%d]", __FUNCTION__, gnss_ret);
sprintf(resp_buf, "%s:%d,%d\r\n", command_name_p, arg1, gnss_ret);
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
#endif
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_CGNETLED_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
LOG("MBTK_AT_CGNETLED_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD :
{
int led_switch;
if(!getExtValue(parameter_values_p, 0, &led_switch, 0, 1, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(led_switch == 0 || led_switch == 1) {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_SYSSLEEP_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
TelAtParserID origParserId = *(TelAtParserID *)arg_p;
LOG("MBTK_AT_SYSSLEEP_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD:
case TEL_EXT_ACTION_CMD:
{
// [ -e /sys/class/devfreq/devfreq-ddr/polling_interval ] && {
// echo 50 > /sys/class/devfreq/devfreq-ddr/polling_interval
// }
// [ -e /sys/power/autosleep ] && {
// echo booting 8000000000 > /sys/power/wake_lock
// echo mem > /sys/power/autosleep
// }
//close GPS set gpio 21/118: out / 0
int result = -1;
result = mbtk_system_sleep();
if(result != 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
}
else
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
#if 0
int ubus_ret = 0;
ubus_ret = invoke_reply_data_cb(origParserId, "gps", "gnss_deinit", NULL, (ubus_data_handler_t *)gps_usr_callback_hdl, &at_handle, 4000);
if(ubus_ret < 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_SUPPRESS, 0, "BUSY");
break;
}
else if(ubus_ret > 0)
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
#ifdef MBTK_PROJECT_L508
system("echo 0 > /sys/class/gpio/gpio119/value");
#else
#ifdef MBTK_PROJECT_PN1803
system("echo 0 > /sys/class/gpio/gpio119/value");
#else
#ifdef MBTK_PROJECT_L509
system("echo 0 > /sys/class/gpio/gpio120/value");
#endif
#endif
#endif
#ifdef MBTK_PROJECT_L508_X6
//close Ldo6
system("i2cset -y -f 2 0x31 0x18 0x0f");
//GPS_WAKE_HOST to GPIO
system("hwacc w 0xd401e198 0x1040");
//HOST_WAKE_GPS to GPIO
//system("hwacc w 0xd401e0c0 0x1040");
//gpio34 to GPIO
#if 1
system("hwacc w 0xd401e164 0x1040");
system("hwacc w 0xd401e166 0x1040");
system("hwacc w 0xd401e1b4 0x1040");
system("hwacc w 0xd401e2ec 0xa441");
system("hwacc w 0xd401e2f0 0xa441");
system("hwacc w 0xd401e2f4 0xa441");
system("hwacc w 0xd401e2f8 0xa441");
system("hwacc w 0xd401e2fc 0xa441");
system("hwacc w 0xd401e300 0xa441");
if(one_gpio_export(117, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(117, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(119, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(119, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(127, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(127, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(34, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(34, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(33, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(33, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(54, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(54, 0))
{
LOG("GPIO SET ERROR.");
}
#endif
#endif
#ifdef MBTK_PROJECT_T108
#else
if(one_gpio_export(21, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(21, 0))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(118, 2))
{
LOG("GPIO SET ERROR.");
}
if(one_gpio_export(118, 0))
{
LOG("GPIO SET ERROR.");
}
#endif
// echo off > /sys/devices/mbtk-dev-op.10/gps_power && echo mem > /sys/power/autosleep
// echo 1 > /sys/devices/asr-rfkill.0/pwr_ctrl && sleep 2 && echo 0 > /sys/devices/asr-rfkill.0/pwr_ctrl
if(!access("/sys/power/autosleep", W_OK))
system("echo mem > /sys/power/autosleep");
else
LOG("/sys/power/autosleep can not write.");
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
#endif
break;
}
default:
{
break;
}
}
return ret;
}
static int port_config(mbtk_port_type_enum type, mbtk_port_mode_enum mode) {
char type_buff[32] = {0};
char mode_buff[32] = {0};
switch(type)
{
case MBTK_PORT_TYPE_UART1:
strcpy(type_buff, "persist.mbtk.dev_ttyS1");
break;
case MBTK_PORT_TYPE_USB1:
strcpy(type_buff, "persist.mbtk.dev_ttyGS0");
break;
case MBTK_PORT_TYPE_USB2:
strcpy(type_buff, "persist.mbtk.dev_ttymodem0");
break;
default:
return -1;
}
switch(mode)
{
case MBTK_PORT_MODE_AT:
strcpy(mode_buff, "at");
break;
case MBTK_PORT_MODE_ADB:
strcpy(mode_buff, "adb");
break;
case MBTK_PORT_MODE_CUSTOM:
strcpy(mode_buff, "custom");
break;
default:
return -1;
}
return property_set(type_buff, mode_buff);
}
utlReturnCode_T MBTK_AT_MPORTCFG_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = at_handle;
char resp_buf[1024] = {0};
LOG("MBTK_AT_MPORTCFG_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD:
{
int arg;
if(!getExtValue(parameter_values_p, 0, &arg, 0, 2, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
mbtk_port_type_enum type = (mbtk_port_type_enum)arg;
if(!getExtValue(parameter_values_p, 1, &arg, 0, 2, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
mbtk_port_mode_enum mode = (mbtk_port_mode_enum)arg;
if(port_config(type, mode)) {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
} else {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
case TEL_EXT_GET_CMD :
{
int len = 0;
char port_config[32] = {0};
property_get("persist.mbtk.dev_ttyS1", port_config, "at");
if(!strcmp(port_config, "adb")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_ADB);
} else if(!strcmp(port_config, "custom")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_CUSTOM);
} else {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_UART1, MBTK_PORT_MODE_AT);
}
memset(port_config, 0, 32);
property_get("persist.mbtk.dev_ttyGS0", port_config, "at");
if(!strcmp(port_config, "adb")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_ADB);
} else if(!strcmp(port_config, "custom")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_CUSTOM);
} else {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB1, MBTK_PORT_MODE_AT);
}
memset(port_config, 0, 32);
property_get("persist.mbtk.dev_ttymodem0", port_config, "at");
if(!strcmp(port_config, "adb")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_ADB);
} else if(!strcmp(port_config, "custom")) {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_CUSTOM);
} else {
len += sprintf(resp_buf + len, "%s : %d,%d\r\n", command_name_p, MBTK_PORT_TYPE_USB2, MBTK_PORT_MODE_AT);
}
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MURCECHO_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = At_handle;
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
static int arg1 = 0;
LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
sprintf(resp_buf, "%s : %d\r\n", command_name_p, mbtk_urc_enable);
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
mbtk_urc_enable = (bool)arg1;
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
break;
}
default:
{
break;
}
}
return ret;
}
RETURNCODE_T MBTK_AT_READVER_PROCESS( const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(parameter_values_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
/*
* Put parser index into the variable
*/
RETURNCODE_T rc = INITIAL_RETURN_CODE;
CiReturnCode ret = CIRC_FAIL;
UINT32 atHandle = MAKE_AT_HANDLE(* (TelAtParserID *) arg_p);
*xid_p = atHandle;
// DBGMSG("%s: atHandle = %d.\n", __FUNCTION__, atHandle);
/*
* process operation
*/
switch ( op )
{
case TEL_EXT_ACTION_CMD: /* AT*READVER */
{
char tmpBuf[512];
#if 0
sprintf(tmpBuf, "*READVER: \r\nrelease_version:%s\r\nrelease_time:%s\r\n", SYSTEM_RELEASE_NAME, SYSTEM_RELEASE_CREATION_DATE);
#else
{
char rel_version[128] = {0};
char sdk[64] = {0};
char rel_date[64] = {0};
char dsp_version[128]={0};
char dsp_date[64]={0};
char rf_version[128] = {0};
int num = 0;
char internalRevisionId[400 + 1] = {0};
char buildTimeStr[100 + 1] = {0};
//GetDspFWVersionAndDate(dsp_version1,dsp_date1);
//p_string = GetRFBinFWVersion();
//p_string2 = GetRFBinFWDate();
property_get("dev.cp.rel.revision", rel_version, "NULL");
property_get("dev.cp.dsp.revision", dsp_version, "NULL");
property_get("dev.cp.rf.revision", rf_version, "NULL");
property_get("dev.cp.rel.time", rel_date, "NULL");
property_get("dev.cp.dsp.time", dsp_date, "NULL");
#if 1
if(strncmp(rel_version, "NULL", strlen("NULL")) != 0)
{
char *p1 = NULL;
p1 = strstr(rel_version, "SDK");
if(p1 != NULL)
{
memcpy(sdk, p1, strlen(p1));
p1 = strstr(sdk, "_");
if(p1 != NULL)
{
*p1 = '\0';
}
}
else
{
strcpy(sdk, "NULL");
}
}
else
{
strcpy(sdk, "NULL");
}
#endif
sprintf(tmpBuf, "*READVER: \r\nRelease_Version: %s (SDK %s)\r\nRelease_Time: %s\r\n(DSP: %s %s)\r\n(RF: %s %s)\r\n(HW: %s by %s)\r\n",
rel_version,sdk,rel_date,
dsp_version,dsp_date,
rf_version,"NULL",
"NULL","NULL");
}
#endif
ret = ATRESP( atHandle, ATCI_RESULT_CODE_OK, 0, tmpBuf);
break;
}
default:
ret = ATRESP( atHandle, ATCI_RESULT_CODE_CME_ERROR, CME_OPERATION_NOT_SUPPORTED, NULL );
break;
}
rc = HANDLE_RETURN_VALUE(ret);
return(rc);
}
utlReturnCode_T MBTK_AT_CGDRT_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = At_handle;
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
static int mode = 0;
static int cert = 0;
LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &mode, 0, 139, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(!getExtValue(parameter_values_p, 1, &cert, 0, 1, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(cert) //out
{
ret = one_gpio_export(mode, 2);
}
else //in
{
ret = one_gpio_export(mode, 3);
}
if(ret)
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
}
else
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_CGSETV_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int At_handle = MAKE_AT_HANDLE(sAtp_index);
*xid_p = At_handle;
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
static int mode = 0;
static int cert = 0;
LOG("MBTK_AT_MTEST_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_SET_CMD :
{
if(!getExtValue(parameter_values_p, 0, &mode, 0, 139, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(!getExtValue(parameter_values_p, 1, &cert, 0, 1, 0))
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
if(cert) //hight
{
ret = one_gpio_export(mode, 1);
}
else //low
{
ret = one_gpio_export(mode, 0);
}
if(ret)
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
}
else
{
ret = ATRESP(At_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
default:
{
break;
}
}
return ret;
}
utlReturnCode_T MBTK_AT_MDUMP_PROCESS(const utlAtParameterOp_T op,
const char *command_name_p,
const utlAtParameterValue_P2c parameter_values_p,
const size_t num_parameters,
const char *info_text_p,
unsigned int *xid_p,
void *arg_p)
{
UNUSEDPARAM(command_name_p);
UNUSEDPARAM(num_parameters);
UNUSEDPARAM(info_text_p);
utlReturnCode_T ret = utlFAILED;
TelAtParserID sAtp_index = *(TelAtParserID *)arg_p;
unsigned int at_handle = MAKE_AT_HANDLE(sAtp_index);
char resp_buf[MBTK_AT_RESP_LEN_MAX] = {0};
int arg1 = 0;
*xid_p = at_handle;
LOG("MBTK_AT_MDUMP_PROCESS enter with command_op [%s]", op2str(op));
switch(op)
{
case TEL_EXT_GET_CMD :
{
char dump[10];
memset(dump, 0, 10);
property_get("persist.mbtk.dump", dump, "0");
snprintf(resp_buf, MBTK_AT_RESP_LEN_MAX, "+MDUMP: %d\r\n", atoi(dump));
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, resp_buf);
break;
}
case TEL_EXT_SET_CMD :
{
int adc_ret;
if(!getExtValue(parameter_values_p, 0, &arg1, 0, 1, 0))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
break;
}
char dump[10];
memset(dump, 0, 10);
if(arg1 == 1) {
memcpy(dump, "1", 1);
} else {
memcpy(dump, "0", 1);
}
if(property_set("persist.mbtk.dump", dump))
{
ret = ATRESP(at_handle, ATCI_RESULT_CODE_ERROR, 0, NULL);
} else {
ret = ATRESP(at_handle, ATCI_RESULT_CODE_OK, 0, NULL);
}
break;
}
default:
{
break;
}
}
return ret;
}