高通Diag命令
1.根据《QualcommDiag Command List V0.8》文档,确定Diag命令的基本构成,不同命令码表示不同的测试功能。
2.使用Qxdm软件发送Diag命令查看手机是否可以正常反馈,保证Diag接口命令接收正常。
第一部分:
在前期将Diag命令移植过来的时候,手机发送命令无法收到信息反馈,比如说最简单的手机充电开启关闭指令,主要原因移植过来的Diag命令没有走通,不同公司都有自己的独有的Diag测试命令,所以移植过来的指令可能还需要自己调整,这份文档主要参考高通标准指令制定,在调试Diag命令时候如果把最基本的充电开启关闭命令调通了,其他命令也就相同了。
通过查看高通文档说明,通过发送以下指令可以完成充电操作:
如何使用Qxdm发送Diag命令?
方法:打开Qxdm软件->选择相关端口 ->选择“CommandOut”模式 ->发送栏输入发送命令。如图所示:
红色箭头指示地方表示需要发送的控制指令0x80 0xFA 0x79 0x00 0x01
需要注意发送格式“Send_data 0x80 0xFA 0x79 0x00 0x01”其中“0X”表示的十六进制数据,不可以省略。
如果发送后如果返回:
“unkowncommand”表示输入框中发送的命令有问题
“SendRawRequest- Failed to parse arguments”表示发送命令没有反馈,命令不通
第二部分:分析代码
这部分只要内容是挑选Diag充电命令来举例说明,相对比较简单。
//结构体数组主要包含“命令码”和“回调函数”
//DIAG_SUBSYS_ID_TCT_CHARGING_ON为命令码,充电命令为0x79
//tct_charging_on_func回调函数,当命令匹配时会到指定的函数执行操作
staticconst diagpkt_user_table_entry_type tct_charging_on_tbl[] =
{
{DIAG_SUBSYS_ID_TCT_CHARGING_ON,DIAG_SUBSYS_ID_TCT_CHARGING_ON, tct_charging_on_func},
};
PACK(void*) tct_charging_on_func(
PACK(void*)req_pkt,
uint16pkt_len
)
{
……省略
/*Allocatethe same length as the request*/
rsp= (rsp_type_tct_charging_on_exec *) diagpkt_subsys_alloc_v2(
DIAG_TCT_FACTORY_COMMON,DIAG_SUBSYS_ID_TCT_CHARGING_ON,
sizeof(rsp_type_tct_charging_on_exec));
if(switcher== 1)
{
//创建一个线程执行充电开启操作
if(pthread_create(&tid,NULL,(void*)&charging_on_thread,NULL)!=0)
{
printf("threadcreate failed\n");
}
}else {
//创建一个线程执行充电关闭操作
if(pthread_create(&tid,NULL,(void*)&charging_off_thread,NULL)!=0)
{
printf("threadcreate failed\n");
}
}
……省略
return(rsp);
}
//充电开启函数
voidcharging_on_thread()
{
//sleep(delay);
system("echo0x01>/sys/kernel/debug/spmi/spmi-0/count");
system("echo0x1347>/sys/kernel/debug/spmi/spmi-0/address");
system("echo0x00>/sys/kernel/debug/spmi/spmi-0/data");
}
//充电关闭函数
voidcharging_off_thread()
{
//sleep(delay);
system("echo0x01>/sys/kernel/debug/spmi/spmi-0/count");
system("echo 0x1347>/sys/kernel/debug/spmi/spmi-0/address");
system("echo0x01>/sys/kernel/debug/spmi/spmi-0/data");
}
//充电Diag注册函数,在初始化的时候会调用这部分函数
//DIAG_SUBSYS_CMD_VER_2_F是主命令码:0xFA
//DIAG_TCT_FACTORY_COMMON是次级命令:0x79
voidtct_charging_on_register()
{
DIAGPKT_DISPATCH_TABLE_REGISTER_V2_DELAY(DIAG_SUBSYS_CMD_VER_2_F,
DIAG_TCT_FACTORY_COMMON,tct_charging_on_tbl);
}
具体命令是如何组成的需要深入理解的话,请查看命令注册函数结构体。但是通过上面的命令格式可以发现只要在注册命令遵循一定规律就可以实现Diag命令的注册和响应。通过上面的描述,如果添加一个Diag命令只需要根据接收命令的格式要求,修改对应的DIAG_TCT_FACTORY_COMMON,DIAG_SUBSYS_ID_TCT_CHARGING_ON等这些宏就可以了,对于命令所实现的功能需要在回调函数tct_charging_on_func内完成。
第三部分:移植
diag命令的添加都在/vendor/XXX文件夹/source/system/diag目录下
这个目录存放了Diag相关的命令,每个文件包含命令的注册函数,处理函数。每一个公司都有自己的存放目录,根据情况而定
第四部分:问题与处理方法
1.使用Qxdm发送Diag命令时候无法得到信息反馈?
答:首先adbshell进入到手机系统,查看后台进程是否正在运行,如下所示:
root@gflip2:/# ps | grep "tct"
root 257 1 6464 1088 ffffffff b6ed2520 S /system/bin/tctd
root 287 1 4516 1076 ffffffff b6f23520 S/system/bin/tct_diag
root@gflip2:/#
后台进程在运行正常的情况下,查看使用Qxdm发送的命令格式是否有问题,如果是“SendRawRequest- Failed to parsearguments”说明Diag程序无法处理你发送的命令,有可能后台相应的代码没有编译进去,你需要修改当前目录下的Makefile文件,也有可能添加Diag命令没有被注册。
2.后台守护进程无法运行?
答:在system/core/rootdir/下,修改init.rc实现开启自动运行。