Hi 大家好!
很高兴又与大家见面了,在蓝牙系列量产必备中,上回我们说到:升级ANC双声道的 PSKey 结构!
“QCC514x 蓝牙系列量产必备:升级ANC双声道的 PSKey 结构”
曾经广为传阅与点赞!
这回我给大家讲解“ANC双声道PSKey升级工具的实现”通过C++程序语言实现这个工具
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
以上是本篇博文的全部内容,如有疑问,
请在博文下方评论留言,或者私信给我!
收到之后会第一时间回复哦,想要了解更多内容,
请多多关注小编与大大通平台,
我们会不断分享最新的热点技术,我们下期见!
评论