ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 如何使用META Tool客制化API增加新的META Command功能

如何使用META Tool客制化API增加新的META Command功能

Linux操作系统 作者:why_how123 时间:2019-08-09 09:42:39 0 删除 编辑
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数据的结构定义如下:
  1. typedef struct
  2. {
  3.  FT_H header;
  4.  META_CUSTOMER_CMD_TYPE type;
  5.  META_CUSTOMER_CMD_U cmd;
  6. } FT_CUSTOMER_REQ;

  7. typedef union
  8. {
  9.  unsigned char m_u1Dummy;
  10. } META_CUSTOMER_CMD_U;

  11. typedef struct
  12. {
  13.  FT_H header;
  14.  META_CUSTOMER_CMD_TYPE type;
  15.  unsigned char status;
  16.  META_CUSTOMER_CNF_U result;
  17. } FT_CUSTOMER_CNF;

  18. typedef union
  19. {
  20.  unsigned char m_u1Dummy;
  21. } 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的一个示例

点击(此处)折叠或打开

  1. mydroid\vendor\mediatek\proprietary\hardware\meta\common\src\FtModule.cpp
  2. void FtModCustomer::exec(Frame *pFrm)
  3. {
  4.     CmdTarget::exec(pFrm);

  5.     META_LOG("[Meta][FT] Ft_Customer");

  6.     FT_CUSTOMER_CNF ft_cnf;
  7.     memset(&ft_cnf, 0, sizeof(FT_CUSTOMER_CNF));
  8.     FT_CUSTOMER_REQ *req = (FT_CUSTOMER_REQ *)pFrm->localBuf();
  9.     
  10.     int peer_buff_size = 1;
  11.     char* peer_buf = NULL;
  12.     int setResult = -1;
  13.     
  14.     // Implement custom API logic here. The following is a sample code for testing.
  15.     ft_cnf.header.id = req->header.id +1;
  16.     ft_cnf.header.token = req->header.token;
  17.     ft_cnf.type = req->type;
  18.     ft_cnf.status = META_SUCCESS;


  19.     peer_buf = (char*)malloc(peer_buff_size);
  20.     memset(peer_buf, 0, peer_buff_size);

  21.     META_LOG("[Meta][FT] setNormalModeTestFlag");
  22.     setResult = setNormalModeTestFlag(req->cmd.m_u1Dummy);
  23.     if(0 == setResult)
  24.     {
  25.         ft_cnf.status = META_SUCCESS;
  26.     }
  27.     else
  28.     {
  29.      ft_cnf.status = META_FAILED;
  30.     }

  31.     META_LOG("[Meta][FT] FT_CUSTOMER_OP successful, OP type is %d!", req->type);
  32.     
  33.     WriteDataToPC(&ft_cnf, sizeof(ft_cnf), peer_buf, peer_buff_size);
  34.     free(peer_buf);
  35. }
上面示例是MediaTek原生的关于FtModCustomer::exec函数的实现,为了实现新的META command功能,我们可以实现一个函数去替换示例中的setNormalModeTestFlag函数。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26559493/viewspace-3169390/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2019-05-08

  • 博文量
    1
  • 访问量
    5