[MTK] Modem 如何客制化AT command

文摘 MediaTek 2020-12-10 阅读:5234

[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];

0条评论

© 2024 芯缘异码. Powered by Typecho