platform: mt6762 android 9.0
使用META Tool提供的客制化API SP_META_Customer_Func_r() 添加新的META Command功能,此时Tool仅将相关数据传给手机,手机端软件也需实现具体功能。
1. 客制化API SP_META_Customer_Func_r函数的原型:
我们可以在META Tool(如:SN write工具)源码的如下文件中找到SP_META_Customer_Func_r的定义:
SN_Writer_Tool_src_v1.1752.0\MtkLib\Meta\inc\spmeta.h
META_RESULT __stdcall SP_META_Customer_Func_r(int meta_handle, int ms_timeout, const unsigned char *data_in, const int data_in_len, int type, unsigned char dummy_in, unsigned char *dummy_out,unsigned char *data_out, int *data_out_len);
2. 手机端对应处理函数
void FtModCustomer::exec(Frame *pFrm)
参考路径 myandroid/mediatek/proprietary/hardware/meta/common/src/FtModule.cpp
只能在该 exec 函数内接收来自META Tool的数据,并实现具体的META Command功能,可以根据参数实现多个功能。
3. 客制化API SP_META_Customer_Func_r函数的参数 和 手机端处理函数FtModCustomer::exec的参数 对应情况
A. data_in: 传给手机端的数据,和 手机端处理函数FtModCustomer::exec里面的 pFrm->peerBuf() 对应。
备注:pFrm是FtModCustomer::exec函数的型参,是Frame *类型。
B. type: 没有用到,必须设置为0或1。
C. dummy_in: 传给手机的命令,和 手机端处理函数FtModCustomer::exec里面的 req->cmd.m_u1Dummy 对应。
备注: req的赋值如下:
FT_CUSTOMER_REQ *req = (FT_CUSTOMER_REQ *)pFrm->localBuf();
D. dummy_out: 手机操作状态反馈,和 手机端处理函数FtModCustomer::exec里面的 ft_cnf.result.m_u1dummy 对应;作为操作成功与否的状态标识来用,例如0标识成功,1标识fail,你们可以自行设定
备注:
>>>>注意,判断操作成功与否的时候需要判断这个参数的值,不仅要用函数 SP_META_Customer_Func_r 的返回值。
>>>>ft_cnf的初始化如下:
FT_CUSTOMER_CNF ft_cnf;
memset(&ft_cnf, 0, sizeof(FT_CUSTOMER_CNF));
E. data_out: 手机返回给 PC 的数值,和 手机端处理函数FtModCustomer::exec里面的 peer_buf 对应
备注:
手机端处理函数FtModCustomer::exec调用函数 int WriteDataToPC(void *Local_buf,unsigned short Local_len,void *Peer_buf,unsigned short Peer_len) 将数据返回给PC端,PC端收到该数据后,SP_META_Customer_Func_r 调用结束。
4. 手机端处理函数FtModCustomer::exec传入的参数 和 返回给META Tool数据的结构定义如下:
-
typedef struct
-
{
-
FT_H header;
-
META_CUSTOMER_CMD_TYPE type;
-
META_CUSTOMER_CMD_U cmd;
-
} FT_CUSTOMER_REQ;
-
-
typedef union
-
{
-
unsigned char m_u1Dummy;
-
} META_CUSTOMER_CMD_U;
-
-
typedef struct
-
{
-
FT_H header;
-
META_CUSTOMER_CMD_TYPE type;
-
unsigned char status;
-
META_CUSTOMER_CNF_U result;
-
} FT_CUSTOMER_CNF;
-
-
typedef union
-
{
-
unsigned char m_u1Dummy;
-
} META_CUSTOMER_CNF_U;
手机端处理函数FtModCustomer::exec会对结构体 FT_CUSTOMER_CNF 中某些成员进行赋值,如下:
ft_cnf.header.id = req->header.id + 1;
ft_cnf.header.token = req->header.token;
ft_cnf.type = req->type;
ft_cnf.status = META_SUCCESS;
若需要使用META Tool提供的客制化API SP_META_Customer_Func_r()实现多个功能,可以通过 dummy_in 来区分,对应手机端处理函数FtModCustomer::exec可以按照如下方式处理:
Switch(req->cmd.m_u1Dummy)
{
Case 0:
...
Case 1:
...
}
5. 手机端处理函数FtModCustomer::exec的一个示例
-
mydroid\vendor\mediatek\proprietary\hardware\meta\common\src\FtModule.cpp
-
void FtModCustomer::exec(Frame *pFrm)
-
{
-
CmdTarget::exec(pFrm);
-
-
META_LOG("[Meta][FT] Ft_Customer");
-
-
FT_CUSTOMER_CNF ft_cnf;
-
memset(&ft_cnf, 0, sizeof(FT_CUSTOMER_CNF));
-
FT_CUSTOMER_REQ *req = (FT_CUSTOMER_REQ *)pFrm->localBuf();
-
-
int peer_buff_size = 1;
-
char* peer_buf = NULL;
-
int setResult = -1;
-
-
// Implement custom API logic here. The following is a sample code for testing.
-
ft_cnf.header.id = req->header.id +1;
-
ft_cnf.header.token = req->header.token;
-
ft_cnf.type = req->type;
-
ft_cnf.status = META_SUCCESS;
-
-
-
peer_buf = (char*)malloc(peer_buff_size);
-
memset(peer_buf, 0, peer_buff_size);
-
-
META_LOG("[Meta][FT] setNormalModeTestFlag");
-
setResult = setNormalModeTestFlag(req->cmd.m_u1Dummy);
-
if(0 == setResult)
-
{
-
ft_cnf.status = META_SUCCESS;
-
}
-
else
-
{
-
ft_cnf.status = META_FAILED;
-
}
-
-
META_LOG("[Meta][FT] FT_CUSTOMER_OP successful, OP type is %d!", req->type);
-
-
WriteDataToPC(&ft_cnf, sizeof(ft_cnf), peer_buf, peer_buff_size);
-
free(peer_buf);
-
}
上面示例是MediaTek原生的关于FtModCustomer::exec函数的实现,为了实现新的META command功能,我们可以实现一个函数去替换示例中的setNormalModeTestFlag函数。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26559493/viewspace-3169390/
,如需转载,请注明出处,否则将追究法律责任。