前言
最近在学习上海山景公司的BP10_128DBG的开发板,因为网上关于BP10开发板的帖子也比较少,在学习的时候也没有太多的参考资料,基本上都是官方的历程。蓝牙放歌这个demo对我来说也比较复杂,特写下此博客进行记录、总结,大家有需要的可以参考。
一:添加的文件、库、头文件路径
Bluetooth文件夹(基本把middleware下bluettoth的东西拿过来)
Inc文件夹就有一些头文件
src文件下就在音频解码播放的基础上添加了一个新的文件(bt_stack_service.c)
添加的头文件引用路径和链接到的.a静态库
二:A2dp_DecoderInit()函数
进入main之后,比较重要的一个函数就是A2dp_DecoderInit(),初始化一个MemHandle来记录音频信息(类似于存在SD卡的音频文件)。
SaveDataToSbcBuffer指定了记录A2dp音频流数据的函数
在SaveDataToSbcBuffer()函数中主要是通过刚才初始化的SBC_MemHandle来调用audio_decoder_initialize()进行音频解码初始化。因为蓝牙播放的数据来源不是存在TF卡或一个文件,而是存放在内存中的,所以audio_decoder_initialize()函数中的第三个参数是IO_TYPE_MEMORY。audio_decoder_initialize()函数传入的第四个参数的功能是指定特定的初始化、解码函数等。
三:BtStackServiceStart()函数
1:SetBtStackState()函数主要是初始化了btManager这个结构体中的stackState成员变量
2:BtStackServiceInit()函数主要是为btStackServiceCt、btStackConfigParams两个指针指向开辟的堆内存。
![](https://i-blog.csdnimg.cn/blog_migrate/b05f78ae387304c998de69abbdcf2f89.png)
两个指针的初始化:
指向的堆内存空间:
3:LoadBtConfigurationParams()函数先将蓝牙相关配置参数从spi-flash读到btStackConfigParams所指向的数组中,然后对btStackConfigParams中的每个成员进行初始化
将spi-flash中关于蓝牙相关的内容读取完之后就进行修改
4:ConfigBtBbParams(&bbParams)和Bt_init((void*)&bbParams)函数主要是对bbParams这一结构体进行初始化
5:SetBtPlatformInterface(&pfiOS, &pfiBtDdb)没有具体的实现函数,注释讲是主机内存相关初始化
6:BtStackServiceEntrance()先是调用了BtStackInit()函数、BtStackInit()函数主要是初始化了BtStackParams这个结构体,而且整个工程最后的while(1)也是在这个函数中。
在调用ConfigBtStackParams函数的时候要特别注意两个点(supportProfiles和a2dpAudioDataFormat),这两个就确定了蓝牙解码支持的协议(蓝牙音频是A2dp)和解码得到的数据格式(PCM)。
supportprofile:
a2dpAudioDataFormat:
最后就是初始化g_playcontrol_app_context、g_playcontrol_profile、g_gap_mode这三个结构体
7:前面的初始化工作结束之后就是蓝牙协议栈工作(如果有播放音频),一个while(1)死循环。
8: A2dp_Decode()函数主要就是音频解码那一套,没有什么蓝牙相关的了,音频也是从DAC0输出。
四:蓝牙内存分配理解
到了这里蓝牙放歌历程基本就结束了,但是我还有一个疑问。就是关于BP10数据手册内存分配章节中蓝牙32K的内存空间是怎么分配的?如何将flash中蓝牙相关内容remap到内存中?
![](https://i-blog.csdnimg.cn/blog_migrate/f582f530bae0943628434349abc425b6.png)
接下来我就简单说一下我的理解,在前面调用ConfigBbParams这个函数初始化bbParams这个结构体的时候我没有注意到一个地方(params->em_start_addr = BB_EM_START_PARAMS)
跳转到BB_EM_START_PARAMS这个宏定义的地方
有比较多敏感的数字,0x2004 8000是蓝牙内存开始的地方,大小刚好也是32K,而且上方有一段官方的注释(ram和MPU_START_ADDR进行了关联)
在bt_ddb_flash.c文件中有比较多关于蓝牙参数配置地址内容的描述
跳转到这些地址宏定义的地方,发现是在flash_config.h文件中定义的
然后我一直想找到官方到底是在工程的哪个地方调用了将flash中的内容remap到sram中,因为官方有把flash的驱动remap到内存这个操作,但是蓝牙的这一操作我一直没有找到(有知道的友友可以在评论区留言)。我最后猜测是在Bt_init函数中实现了这一操作,但是这个函数没有具体的实现(被编译成了.a静态库),我也不知道自己的想法是否正确。
![](https://i-blog.csdnimg.cn/blog_migrate/8d526768ad9bf8b9009ec089244d915f.png)
总结
以上就是我对上海山景BP10_128DBG开发板蓝牙放歌历程的一个理解,非常感谢你能看到这。