在上篇博客中抛出了一个有待解决的问题,简单描述一下就是:音频输出通道是HDMI时,wav和mp3格式的音频文件都可以播放并且有声音输出,但是切换到speaker通道输出时,wav格式的音频文件有声音输出,mp3格式的音频文件居然没有声音输出。为了找到产生问题的原因和解决方法,接下来将对音频的处理代码进行跟踪。
资料是查问题很好的帮手,首先看一下硬件手册关于音频的部分。
![这里写图片描述](https://img-blog.csdn.net/20170908112241490?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc19qYXNvbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(实在是不好意思,用MarkDown插入图片,插入的总是路径,就是不显示图片,找了几个解决方法,换了几个浏览器登录也不可以,切换到html编辑后,原内容不会复制过去,后面找到办法再添加图片。)
这里在APQ8016中内置了MIPI转DSI的4线接口用来支持HDMI的输出,并且添加了一个DSI转HDMI的芯片-ADV7533,我们可以通过i2c3来控制这个芯片。那么音频是如何输出的呢,这里有个i2s2接口是用来支持音频输出的。
既然图在这了,就顺便说一下高速接口和HDMI的切换,这里有个复用设备-FSA644UCX,它的作用就是对通道进行切换,但是高速接口和HDMI是不能同时工作的。这里有个GPIO_32控制的“DSI_SW_SEL_APQ”,当它为“0”时,通过HDMI输出,当它为“1”时,通过高速接口输出。
接下来看一下相关代码,在kernel/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi里面:
i2c@78b8000 { /* BLSP1 QUP4 */
/* DSI_TO_HDMI I2C configuration */
adv7533@39 {
compatible = "adv7533";
reg = <0x39>;
adv7533,video-mode = <3>; /* 3 = 1080p */
adv7533,main-addr = <0x39>;
adv7533,cec-dsi-addr = <0x3C>;
adv7533,audio = <1>;
pinctrl-names = "pmx_adv7533_active","pmx_adv7533_suspend";
pinctrl-0 = <&adv7533_int_active &adv7533_hpd_int_active &adv7533_switch_active>;
pinctrl-1 = <&adv7533_int_suspend &adv7533_hpd_int_suspend &adv7533_switch_suspend>;
adv7533,irq-gpio = <&msm_gpio 31 0x2002>;
adv7533,hpd-irq-gpio = <&msm_gpio 20 0x2003>;
adv7533,switch-gpio = <&msm_gpio 32 0x0>;
};
};
我们可以看到上面描述的控制。音频输出控制:adv7533,audio = <1>;
高速接口输出和HDMI输出切换控制:adv7533,switch-gpio = <&msm_gpio 32 0x0>;
我在代码里将音频输出禁用:adv7533,audio = <0>;
然后重新编译并烧写boot.img,播放一段音频试了试,发现wav和mp3格式的音频文件都有声音输出,而且声音的输出通道也不是HDMI,是按照硬件原理图自己连接的speaker。这个修改相对于上篇博客中写的修改方法要好的多,即简单又不存在播放mp3音频文件没声音的问题
到此上篇博客中的问题三也被解决了,至于这个问题出现的原因,将会继续跟踪查找。