[MTK] Modem 如何客制化AT command
文摘 MediaTek 2020-12-10 阅读:6390[DESCRIPTION]
IMS开启以后,在modem客制化AT command不能再用rmmi_write_to_uart()输出final result(即OK或ERROR),
rmmi_write_to_uart()仅可用于输出intermediate response。Final result与intermediate response的含义举例如下:
AT+ESIMS?
+ESIMS:1 //Intermediate response
OK //Final result
故适用于Featrue Phone如何客制化AT command的FAQ11141,和适用于M2M如何客制化AT command的FAQ15688,已经不适用于Smart Phone,当然本FAQ适用于Smart Phone及Featrue Phone,M2M。
[SOLUTION]
可以采用以下两种方法实现客户化AT command:
(1) 在modem代码custommodemcommonpscustomer_at_command.c中的custom_command_hdlr(),在语句if (strcmp(cmd_name, "EXAMPLE") == 0)中修改EXAMPLE,并添加客制化AT的处理部分,即可实现客制化AT command,如此处客制化的AT command可以是AT+EXAMPLE。另外可以自己添加else if部分,那么就可以客制化多条AT command。代码参考如下:(--注意:对于不同的modem branch,可能路径有所不同,但是文件名都是customer_at_command.c)
if (strcmp(cmd_name, "EXAMPLE") == 0)//AT+EXAMPLE,如客制化AT+XX1,那么用XX1代替EXAMPLE。不过这样只能识别大写AT+XX1这条AT命令,如小写的at+xx1就无法识别走入,可以将逻辑修改为(strcmp(cmd_name, "XX1") == 0) || (strcmp(cmd_name, "xx1") == 0),当然更好的就是在这条语句前,将cmd_name[]中的字母都转变成大写字母,这样大小写字母混写,如AT+xX1也可以走入。
{
/* BEGIN: do the following parsing and correspondent action */
/* */
/* */
/* */
/* END: do the following parsing and correspondent action */
/* generate final result code: "OK" or "ERROR" */
if(KAL_TRUE) // if operation is success
{
rmmi_result_code_fmttr(CUSTOM_RCODE_OK, 0);
}
else if (KAL_FALSE) // if operation is fail
{
rmmi_result_code_fmttr(CUSTOM_RCODE_ERROR, 0xffff);
}
return KAL_TRUE;
}
(2)在custommodemcommonpscustomer_at_command.c中添加客制化命令,代码参考如下:(--注意:对于不同的modem branch,可能路径有所不同,但是文件名都是customer_at_command.c)
①//AT+XX1处理函数,该函数定义可以放在custom_test_func()函数定义后面
custom_rsp_type_enum custom_xx1_hdlr(custom_cmdLine *commandBuffer_p)
{
custom_cmd_mode_enum result;
char buffer[MAX_UART_LEN+1];
result=custom_find_cmd_mode(commandBuffer_p);
switch(result)
{
case CUSTOM_ACTIVE_MODE://AT+XX1
//可以自己添加相应功能
return CUSTOM_RSP_OK;
break;
case CUSTOM_TEST_MODE://AT+XX1=?
//可以自己添加相应功能
//下面两行代码可以添加向UART口输出的数据
//sprintf(buffer,"+XX1: (0-31,99),(0-7,99)");
//rmmi_write_to_uart((kal_uint8*)buffer,strlen(buffer),KAL_TRUE);
return CUSTOM_RSP_OK;
break;
case CUSTOM_READ_MODE://AT+XX1?
//可以自己添加相应功能
return CUSTOM_RSP_OK;
break;
case CUSTOM_SET_OR_EXECUTE_MODE://如AT+XX1=1
//可以自己添加相应功能
//可以新建一个API:ata_get_at_para()来获取AT cmd中的整型参数,如下所示:
int a;a=ata_get_at_para(commandBuffer_p);
/**************************** API demo code如下所示****
kal_uint32 ata_get_at_para(custom_cmdLine * commandBuffer_p)
{
char para_buff[64];
kal_uint8 index = 0;
kal_uint8 para_index = 0;
kal_uint32 para = 0;
index = commandBuffer_p->position + 1;
while ((commandBuffer_p->character[index] != '=' ) && //might be TEST command or EXE command
(commandBuffer_p->character[index] != '?' ) && // might be READ command(commandBuffer_p->character[index] != 13 ) && //carriage return(commandBuffer_p->character[index] != ',' ) &&
index < commandBuffer_p->length)
{
para_buff[para_index++] = commandBuffer_p->character[index++] ;
}
commandBuffer_p->position = index;
para_buff[para_index] = '\0';
para = atoi(para_buff);
return para; //AT CMD中的整型参数
}
***********************************************/
return CUSTOM_RSP_OK;
break;
default:
return CUSTOM_RSP_ERROR;
break;
}
return CUSTOM_RSP_ERROR;
}
②//在custom_cmd_table中添加{"AT+XX1",custom_xx1_hdlr},注意要放在{NULL,NULL}之前
const custom_atcmd custom_cmd_table[ ] =
{
{"AT%CUSTOM",custom_test_func},
......
{"AT+XX1",custom_xx1_hdlr},
{NULL,NULL}
}
补充:
在返回OK或者ERROR之前,如何往AP送所需的字串呢?
如:
AT+XX1=?
+XX1: (0-31,99),(0-7,99)//如何将这段字串送给AP呢?
OK
方法就是之前(2)的case CUSTOM_TEST_MODE:中提到的,下面两行代码可以添加向UART口输出的数据:
sprintf(buffer,"+XX1: (0-31,99),(0-7,99)"); //把要上报给AP的内容,写到buffer里。当然如果要输出,其他变量参数也是可以的,如sprintf(buffer,"+XX1: %d, %s", a, str);
rmmi_write_to_uart((kal_uint8*)buffer,strlen(buffer),KAL_TRUE); //将buffer里的内容送出给AP
如果发现默认没有定义buffer,那么您需要自己先定义buffer,如 kal_uint8 buffer[40];