QCC514x 蓝牙系列量产必备: ANC双声道PSKey升级工具的实现

 Hi  大家好!
很高兴又与大家见面了,在蓝牙系列量产必备中,上回我们说到:升级ANC双声道的 PSKey 结构!

“QCC514x 蓝牙系列量产必备:升级ANC双声道的 PSKey 结构”

曾经广为传阅与点赞!

这回我给大家讲解“ANC双声道PSKey升级工具的实现”通过C++程序语言实现这个工具


 1、PSkey插曲 

QCC514x 蓝牙系列量与QCC512x,QCC302x 系列的PSKey 结构基本是一样的,
可以参阅 ADK 路径下\adk\docs\mib_keys\qcc514x_qcc304x。PSKey呢,何止千千万,在ADK 中也有相应展现!
在此小编把用到的主要 PSK 分为三类,虽然没有全部包含,但是大部分需要用的已经包含进来啦!
且看

往期回顾:

  • 一、设备信息类

QUALCOMM QCC512x 与QCC302X 蓝牙系列量产必备:设备信息修改"

  • 二、通用MID类

QUALCOMM QCC蓝牙系列量产必备:PSkey 在ADK 中的存储与访问"
" QUALCOMM QCC蓝牙系列量产必备:PSkey 在应用中的存储与访问"

  • 三、Audio ID 类

 “QCC514x 蓝牙系列量产必备:升级ANC双声道的 PSKey 结构”

 大家是不是很熟悉Audio ID 类,上一回刚讲的就是这一类啊,紧接着我们把这类PSKey 读写工具程序实现下,
那就闲言少叙,言归正传

 2、开发环境设置

 
2.1 BlueSuite

QCC514x 与QCC302X一样基于ADK 的蓝牙系列在应用层,可以用BlueSuite3,当前安装的是BlueSuite 3.3.4 ,可以cd C:\Program Files (x86)\QTIL\BlueSuite 3.3.4 运用CMD 命令

cd C:\Program Files (x86)\QTIL\BlueSuite 3.3.4,可以通过里面的可执行程序执行一些命令。

如果量产的话需要运用BlueSuite 库来写量产工具,可以参阅BlueSuite 安装路径下的文档,此处用TestEngine 的库运用C语言程序来修改ANC PSKey 信息

在我们的 Bluesuite 接口中,

要以如下方式:

写人:tePsAudioWrite (iHandle, 0x204100, maxLen, value);

读取:tePsAudioRead(iHandle, 0x204100, valueLen,    

                               value, &readLen);

其中传入的 value 数组,是16位 无符号整型数组,需要由QACT 获取的8位无符号整型数组,
转换成16位 无符号整型数组,当作tePsAudioWrite的参数,就可以在量产的耳机上生效了。

 
图一BlueSuite 3 中TestEngine 接口

2.2 C++开发环境

开发环境:C++(Microsoft Visual Studio)

头文件:TestEngine.h

库文件:TestEngine.lib

运行环境:Windows 系统,TestEngine.dll 相关DLL,为了使得工具能够运行,
可以把TestEngine.dll 相关DLL所在文件夹路径:
C:\Program Files (x86)\QTIL\BlueSuite 3.2.1,设置成Path环境变量,
这样工具程序就可以动态调用DLL相关库运行了。

 
图二 设置成Path环境变量

3、开发流程

3.1 代码展示

打开
Microsoft Visual Studio 集成开发环境,新建 Win32-> console application,输入Project名BT_Info_Mag,选择console application—>Empty project->Finish 确认。
这个过程,我们在视频中会详细讲解,敬请关注!!!

添加BT_Info_Mag.cpp,代码如下:
(源代码文件附在本博文当中,扫描以下二维码注册登录后即可下载)

 

#include "include\\testengine.h"

#include “iostream”
#include“conio.h”

//#include

using namespace std;

 #define _ANC_PSK_READ_    //需要读取的宏定义

#define _ANC_PSK_WRITE_   //需要写入的宏定义

 

#define _LINE_TEMP_  2600

 uint16 StringX_to_UINT8(char* chavalueString,uint8*value);

uint16 OnAddHTFFile(uint8*value,uint32*psid);

 uint16 OnAddHTFFile(uint8*value,uint32*psid)

{

    uint16 len=0;

    FILE * fileHTF_IN=NULL;//fileHTF_IN  区

    fileHTF_IN = fopen("F:\\All_BT\\ANC\\parameters.htf" , "rt");

    if(fileHTF_IN==NULL){

         return 0;

    }

    char arZe[] = "="; 

    char arDest[_LINE_TEMP_]={0};

    char *szGet = NULL; 

    int k;

    int j=0;

    uint8 is_audio_file=0;

    char btCHAR[16];memset(btCHAR,0,16);

    while(fgets(arDest,_LINE_TEMP_,fileHTF_IN)){//fgetws

         char arZet[] = ("\n \t"); //一行中只有这些字符,则忽略掉这一行

         char *szGett = NULL; 

         char arDest0[3];

         memset(arDest0,0,3);

         strncpy(arDest0,arDest,2);//arDest0 复制arDest,调用strtok(arDest0,就不会破坏arDest

         szGett = strtok(arDest0, arZet);

         if (szGett==NULL)

         {

             continue;

         }

         if(szGett[0]==('#')||szGett[0]==('\r')||szGett[0]==('\n')){

             continue;

         }  

         k=0;

         for(szGet = strtok(arDest, arZe); szGet != NULL; szGet = strtok(NULL, arZe),k++){

             if (j==0&&k==1)

             {

                  if((!strncmp(szGet,"audio",5))||(!strncmp(szGet," audio",5)))

                  {//文件时Audio :

                      is_audio_file=1;

                  }

                  else{

                      is_audio_file=0;

                      scanf(szGet, ("%s"), btCHAR);

                  }

             }

             else if(j>0&&k==0){

                  if (is_audio_file==1)

                  {

                      *(psid)=strtol(szGet,NULL, 16);


                  }

                  else{

                      printf("parameters.htf 不是file= Audio !\n");

                  }

             }

             else if(j>0&&k==1){

                  len=StringX_to_UINT8(szGet,value);

             }  

         }

         j++;

    }

    fclose(fileHTF_IN);

    return len;

}

uint16 StringX_to_UINT8(char* chavalueString,uint8*value){

    uint16 maxLen=0;

    uint8 charlen=0;

    char arZe[] = ("\n \t[]");  //char arZe0[] = ",";//  char arZe[] = " \t\n";   

    char *szGet = NULL; 

    int k;

    char *stop1;

    k=0;

    for(szGet = strtok(chavalueString, arZe); szGet != NULL; szGet = strtok(NULL, arZe),k++){

         if (k==0)

         {

             charlen=strlen(szGet);

         }

         if (charlen==2)

         {

             value[k]=strtol(szGet,&stop1, 16);

         }

    }

    maxLen=k;

    if (charlen==4)

    {

         maxLen=k*2;

    }

    return maxLen;

}

int main(int argc, char** argv){

    uint32 iHandle = 0;

    cout << "Trying to connect..." << endl;

    iHandle = openTestEngine(TRB, "1", 0, 5000, 0);

    //iHandle = openTestEngine(USBDBG, "1", 0, 5000, 0);

    if(iHandle != 0)

    {

         int32 success=0;

         cout << "Connected!" << endl;

         char valueString[2000];

         memset(valueString,0,2000);

         uint8 value[1000];

         memset(value,0xff,1000);

         uint8 value1[1000];

         memset(value1,0xff,1000);

         uint8 value3[1000];

         memset(value3,0xff,1000);

         uint16 maxLen;

         uint32 psid_key;

#if defined(_ANC_PSK_READ_)

         psid_key=0x204100;

         success = tePsAudioRead(iHandle, psid_key, 1000, (uint16*)value, &maxLen);

         printf("maxLen:0x%x psid_key:= 0x%x \n",maxLen,psid_key);

         for(int i=0;i<maxLen;i++){

             printf("0x%x " ,value[i]);

         }

         if (value[40]==1)

         {

             printf("\nFFa Enable L\n",psid_key);

         }

         if (value[72]==1)

         {

             printf("FF out Enable L\n");

         }

         if (value[408]==1)

         {

             printf("FFa Enable R\n");

          }

         if (value[40]==1)

         {

             printf("FF out Enable R\n");

         }

 #endif

#if defined(_ANC_PSK_WRITE_)

         maxLen =OnAddHTFFile(value,&psid_key);

         printf("maxLen:0x%x psid_key: 0x%x \n",maxLen,psid_key);

          success = tePsAudioWrite(iHandle, psid_key, maxLen, (uint16*)value);

         if (success == TE_OK)

         {

             printf("PSID:0x%x tePsAudioWrite success \n",psid_key);

          }

#endif

          closeTestEngine(iHandle);

    }

    else

    {

         cout << "Failed to connect" << endl;

    }

    getch();

}

然后把TestEngine.lib 添加进来,就可以编译通过

图三 把TestEngine.lib 添加进来


3.2  运行结果

QCC514x 系列的板子,通过 TRBI200/USB连上PC, 运行应用工具,

蓝牙 ANC PSKey项就可以读写

#define _ANC_PSK_READ_ //需要读取的宏定义打开,可以得到如下运行结果,
读取板子中的 ANC PSKey

 

 #define _ANC_PSK_WRITE_打开,可以得到如下运行结果,
读取板子中的 ANC PSKey



以上是本篇博文的全部内容,如有疑问,
请在博文下方评论留言,或者私信给我!


收到之后会第一时间回复哦,想要了解更多内容,
请多多关注小编与大大通平台,
我们会不断分享最新的热点技术,我们下期见!

技术文档

类型标题档案
软件CPP file

相关视频

QCC514x 蓝牙系列量产必备: ANC双声道PSKey升级工具的实现

QCC514x 蓝牙系列量产必备: ANC双声道PSKey升级工具的实现

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论