引言:
本文只是介绍怎么使用linkit7688开发板上的wm8960的输出喇叭声音和耳机声音,主要是怎么输出喇叭声音,默认的音频驱动是只有耳麦的音频输出而没有喇叭音频输出的。别人指导我,有点成果也给大家参考一下。
感谢huangkj-henan的博客:http://blog.csdn.net/hnhkj/article/details/50930483#reply
相信有玩linkit7688的同学应该都是有搜索到这篇博客的。
1、在操作台中我们使用命令来操作:
madplay xxx.mp3 &
madplay xxx.mp3 -r &
killall -9 madplay
killall -STOP madplay &
killall -CONT madplay &
2、在驱动代码中我们使用system()来调用播放声音;
system("madplay xxx.mp3 &");//利用system函数调用madplay播放器播放*.mp3音乐
system("madplay xxx.mp3 -r &");//循环播放:参数-r
system("killall -9 madplay");//利用system函数调用killall命令将madplay终止掉
system("killall -STOP madplay &");//利用system函数调用killall命令将madplay暂停
system("killall -CONT madplay &");//利用system函数调用killall命令恢复madplay的播放
所以在程序里面直接调用system(“madplay xxx.mp3 &”);就会有声音输出了。
如果用耳麦,直接就有输出,可以听到声音输出。但是喇叭却一直都没有声音输出。把喇叭贴到耳朵上听就会发现有很小的,微弱的声音。这样个人认为基本上就是喇叭的音量太小了。
路径:
.../linux-x-xx-xx/sound/soc/mtk/i2c_wm8960.c
函数
audiohw_set_lineout_vol(int Aout, int vol_l, int vol_r)
这个函数是修改声音的大小的。
Aout=1:设置耳机声音大小
Aout=2:设置喇叭声音大小
vol_l vol_r:范围48-127
追根溯源过,但是没有发现有效的调用,主要是没有发现有设置喇叭声音大小的地方。所以就在初始化里面添加了这个函数
audiohw_set_lineout_vol(2, 126, 126);
这个有个小插曲:
内核模块初始化的时候会打印调试信息,如果你找到这个函数就会发现这个函数是有打印调试信息的,
MSG("audiohw_set_lineout_vol_\n");
所以有打印这个信息,就是有被调用了。不过后面发现还是不能用。还好在内核每一次调用声音的执行函数里面我也调用了一次。然后就有声音从喇叭上输出了。
用户程序里面调用
system("madplay xxx.mp3 &");
串口调试界面就会输出
############## MMAP ##############
等一些相关调试信息。
根据调试信息找到相应文件:
路径:
.../linux-x-xx-xx/sound/soc/mtk/mt76xx_pcm.c
函数
static int mt76xx_pcm_allocate_dma_buffer(struct snd_pcm_substream *substream,
int stream)
我在里面对声音进行了设置,就是
#include "i2c_wm8960.h"
audiohw_set_lineout_vol(2, 126, 126);
理论上初始化调用一遍就应该可以了,但是估计在哪里给复位了或者初始化的时候没有把wm8960设置好,所以在mt76xx_pcm_allocate_dma_buffer函数里设置一下就可以了。
这个应该不是wm8960的正确打开方式,只是一个参考。