上图是全志H6 audio hub的示意图,图中可以看到audio hub本身也是一个声卡,他用来连接了CPU的APB数据总线和音频数据接口,H6中的所有音频数据接口全部是通过ahub来传递给CPU中去的。这样做的目的是为了方便音频输入和输出的以及混音。典型的就是应用在卡拉OK场景中。
详细的芯片说明可以参考官方的文档
《H6 音频模块说明书.pdf》
《Allwinner_H6_User_Manual_V1.0.pdf》
声卡的管理通过tinymix工具来管理
audio hub声卡默认是0声卡可以通过命令行tinymix -D 0来查看声卡的状态
我们可以通过tinymix来配置ahub的音频路径
其中5-17用于表示rxif连接的txif,可以配置的值如下
比如配置APB0->I2S0播放
使用命令tinymix 13 4
配置路径的代码在SDK的audio_hw.c中进行配置
音频框架使用的是ASOC框架
在源文件中可以看到使用的
pcm_open
pcm_prepare
pcm_read
pcm_close
这些API来操作声卡的
比如我们获取I2S0对应声卡的PCM数据
pcm_open打开I2S0对应的声卡
pcm_open打开audio hub声卡
I2S0 pcm_prepare
ahub pcm_prepare
配置音频通路
最后在in_read里面进行pcm_read读取音频数据
原始SDK中只能同时打开1个声卡,比如使用I2S0的时候就会只切到了I2S0
其实APB总线这端有3个端点,也就是APBIF0 APBIF1 APBIF2
我们可以把I2S0接到APBIF0 同时把I2S3接到APBIF1这样两个声卡的数据就都进入到APB总线上了。
通路配置好后好需要在audio_hw中添加代码来实现
pcm_open的时候第二个参数也就是端口号,对应了你打开了那个APBIF端点
这时候需要在start_input_stream的时候同时打开audio hub的APBIF0和APBIF1端点。也就是第二个参数要分别传0和1,并新加一个pcm指针来接收返回句柄
in->pcm = pcm_open(adev->cardMIX, 0, PCM_IN, &in->config);
in->i2s3_pcm = pcm_open(adev->cardMIX, 1, PCM_IN, &in->config);
这样在in_read里面在从这两个句柄里读数据就可以实现同时打开多个声卡了