我尝试各种办法,wm8960始终不能得到声音输出。调试过程如下:

首先,打开电源使能脚:

ret=gpio_request(SABRESD_CODEC_PWR_EN,"audio_pwr_en");

if (!ret){

printk("Turn on audio(wm8962)power!(1:enable)\n");

gpio_direction_output(SABRESD_CODEC_PWR_EN,1);         // 0:enable, 1:disable

gpio_free(SABRESD_CODEC_PWR_EN);

}

串口打印如下出错信息:

wm8962 0-001a: Failed to get supply 'SPKVDD1':-19

wm8962 0-001a: Failed to request supplies: -19

wm8962 0-001a: asoc: failed to probe CODECwm8962.0-001a: -19

asoc: failed toinstantiate card wm8962-audio: -19

InitializeHDMI-audio failed. Load HDMI-video first!

ALSA device list:

No soundcards found.

把imx6q_init_audio();后移几行,上面的错误就没有了。但出现下面错误 :

wm8962 0-001a: Device is not a WM8962, ID 0 !=6243

wm8962 0-001a: asoc: failed to probe CODECwm8962.0-001a: -22

asoc: failed toinstantiate card wm8962-audio: -22

把sound/soc/codec/下面的wm8962.c改用wm8960.c(修改Kconfig和Makefile)。

wm8960_i2c_probe不调用。原因是:

.driver = {

.name = "wm8960",

而   {

I2C_BOARD_INFO("wm8962", 0x1a),

.platform_data =&wm8962_config_data,

},

linux driver是根据name来匹配的,如果匹配就调用。

登记了snd_soc_register_codec后,codec的probe也不调用。

原因是下面这个snd_dai_driver的name要一致才能调用。

static struct snd_soc_dai_driver wm8960_dai = {

.name = "wm8960",

static structsnd_soc_dai_link imx_dai[] = {

{

.name = "HiFi",

.stream_name = "HiFi",

.codec_dai_name       = "wm8960",

调用后显示:

wm8960 0-001a: wm8960 probed success!

wm8960 0-001a: Failed to add routeHPOUTL->Headphone Jack

asoc: wm8960<-> imx-ssi.1 mapping ok

input:wm8960-audio DMIC as /devices/platform/soc-audio.5/sound/card0/input1

input:wm8960-audio Ext Spk as /devices/platform/soc-audio.5/sound/card0/input2

ALSA device list:

#0: wm8960-audio

root@imx6solo ~$find / -name *wm8960*

/sys/devices/platform/imx-wm8960.0

/sys/bus/platform/devices/imx-wm8960.0

/sys/bus/platform/drivers/imx-wm8960

/sys/bus/platform/drivers/imx-wm8960/imx-wm8960.0

/sys/bus/i2c/drivers/wm8960

/proc/asound/wm8960audio

root@imx6solo ~$

问题是/dev/下面并没有增加设备,无法使用/dev/pcm。

root@imx6solo/usr/bin$ aplay -L

null

Discard all samples (playback) or generatezero samples (capture)

root@imx6solo/usr/bin$ aplay -l

**** List ofPLAYBACK Hardware Devices ****

card 0:wm8960audio [wm8960-audio], device 0: HiFi wm8960-0 []

Subdevices: 1/1

Subdevice #0: subdevice #0

root@imx6solo/usr/bin$

现在应该是试试ALSA驱动程序是不是真能用的时候了. 接者就是使用它.

查看声卡是否存在:

root@imx6solo ~$cat /proc/asound/cards

0 [wm8960audio    ]: wm8960-audio - wm8960-audio

wm8960-audio

ALSA 驱动程序在 /dev/snd/ 目录下有自己的驱动程序。

root@imx6solo ~$ ls /dev/snd/

controlC0 pcmC0D0c   pcmC0D0p  timer

http://www.alsa-project.org/main/index.php/Download上面下载alsa tester包括alsa-lib,alsa-utils。

编译:./gitcompile CC=arm-linux-gcc --host=arm-linux

现在进化到configure都从网络上临时下载的地步了,我有点out了。

编译alsa-utils总是过不去。重新下载alsaplayer。

./configure--host=arm-linux CC=arm-linux-gcc --disable-oggvorbis

然后make.

对比了wm8960.c/wm8962.c,imx-wm8960.c/imx-wm8962.c,差别其实非常大。

http://bbs.21ic.com/forum.php?mod=viewthread&tid=869393,从这个链接地址可以下载imx-wm8960.c。

重新配置linux kernel,设备/dev/dsp和/dev/mixer出来,这是OSS接口的要求。

root@imx6solo/test/audio$ ./wavplay test.wav

-------------------------------------------------------------------->

File Magic:         [RIFF]

File Length:        [424636]

File Type:          [WAVE]

Fmt Magic:          [fmt ]

Fmt Size:           [16]

Fmt Format:         [PCM]

Fmt Channels:       [2]

FmtSample_rate:    [22050](HZ),22khz

FmtBytes_p_second: [88200]

FmtBlocks_align:   [4]

FmtSample_length:  [16]

Chunk Type:         [data]

Chunk Length:       [424600]

<--------------------------------------------------------------------

Plug PCM: Rateconversion PCM (44100, sformat=S16_LE)

Converter:linear-interpolation

Protocol version:10002

Its setup is:

stream      : PLAYBACK

access      : RW_INTERLEAVED

format      : S16_LE

subformat   : STD

channels    : 2

rate        : 22050

exact rate  : 22050 (22050/1)

msbits      : 16

buffer_size : 8192

period_size : 256

period_time : 11609

tstamp_mode : NONE

period_step : 1

avail_min   : 256

period_event : 0

start_threshold  : 1

stop_threshold   : 8192

silence_threshold: 0

silence_size : 0

boundary    : 536870912

Slave: DirectStream Mixing PCM

Its setup is:

stream      : PLAYBACK

access      : MMAP_INTERLEAVED

format      : S16_LE

subformat   : STD

channels    : 2

rate        : 44100         //44khz

exact rate  : 44100 (44100/1)

msbits      : 16

buffer_size : 16384

period_size : 512

period_time : 11609

tstamp_mode : NONE

period_step : 1

avail_min   : 512

period_event : 0

start_threshold  : 2

stop_threshold   : 16384

silence_threshold: 0

silence_size : 0

boundary    : 1073741824

Hardware PCM card0 'wm8960-audio' device 0 subdevice 0

Its setup is:

stream      : PLAYBACK

access      : MMAP_INTERLEAVED

format      : S16_LE

subformat   : STD

channels    : 2

rate        : 44100         //44khz

exact rate  : 44100 (44100/1)

msbits      : 16

buffer_size : 16384

period_size : 512

period_time : 11609

tstamp_mode : ENABLE

period_step : 1

avail_min   : 512

period_event : 0

start_threshold  : 1

stop_threshold   : 1073741824

silence_threshold: 0

silence_size : 1073741824

boundary    : 1073741824

appl_ptr    : 0

hw_ptr      : 0

root@imx6solo/test/audio$ aplay test.wav

Playing WAVE'test.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Stereo

Aborted by signalInterrupt...

root@imx6solo/test/audio$

仍然是没有声音输出!!

换了一个44khz采集率的wav文件,仍然没有声音输出!

root@imx6solo/test/audio$ aplay xihuanni.wav

Playing WAVE'xihuanni.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

Aborted by signalInterrupt...

再次检查了pin mux config,是正确的。但就是没有任何audio输出!

如果直接用imx-wm8962.c,则有许多出错信息,如下:

root@imx6solo/test/audio$ aplay xihuanni.wav

WM8960 PLL:Unsupported N=3

Failed to startFLL: -22

Failed to setSYSCLK: -22

asoc: machinehw_params failed

Failed to setSYSCLK: -22

ALSA libpcm_direct.c:980:(snd1_pFailed to set SYSCLK: -22

cm_direct_initialize_slave)unable to install hw params

ALSA libpcm_dmix.c:1030:(snd_pcm_dmix_open) unable to initialize slave

aplay: main:660:audio open error: Invalid argument

所以,要用imx-wm8962.c来修改的话,还有点麻烦,不会很容易。

网上找了一个人交流,他用的是imx-wm8960.module,就是编译出来的.o

ifneq ($(wildcardsound/soc/imx/imx-wm8960.c),)

snd-soc-imx-wm8960-objs:= imx-wm8960.c

else

snd-soc-imx-wm8960-objs:= imx-wm8960.module

endif

我这样修改后,运行导致crash。

register wm8960 I2C driver success!

Unable to handlekernel paging request at virtual address f8f2fe18

pgd = 80004000

[f8f2fe18] *pgd=1bce9811, *pte=00000000,*ppte=00000000

Internal error:Oops: 807 [#1] PREEMPT

Modules linked in:

CPU: 0    Not tainted (3.0.101-2790-gc248ed7 #274)

先验证了i2c,示波器显示有输出,并且测了看device addr也是0x1A。

alsamixer配置也是全部拉高,退出后重新进入,也是对的,可以保存和读出。

i2s data仍然没有,数据线对地电阻也测了,并没有短路。

仔细查了linux代码,没有i2s部分,应该是改成SSI了。

ssi有两个,一个是在driver/mxc/ssi.c,这个是以前的。

现在是sound/soc/imx/imx-ssi.c。

imx6q_add_imx_ssi(1,&mx6_sabresd_ssi_pdata); 注册为platform device。

加了一句打印:

imx_ssi_probesuccessfully。证明probe是被调用了的。

root@imx6solo/test/audio$ aplay xihuanni.wav

snd_pcm_dmix_open()

snd1_pcm_hw_open_fd()

snd_pcm_plug_open()

Playing WAVE'xihuanni.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

snd_pcm_mmap_writei

然后挂起,ssi接口无输出,应该是mixer配置不正确。

最终查明原因,是没有正确初始化wm8960导致的。
在imx-wm8960.c的
static int imx_hifi_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)函数中增加:
...
wm8960_vendor_set(codec_dai);
...

/* based on the result of dump */
void wm8960_vendor_set(struct snd_soc_dai *codec_dai)
{
struct snd_soc_codec *codec = codec_dai->codec;

snd_soc_write(codec, 0x19, 0xc0); /* power1, ok*/
snd_soc_write(codec, 0x1a, 0x199); /* power2, ok*/

snd_soc_write(codec, 0x31, 0xf7); /* classd1 : enable L&R, ok */
snd_soc_write(codec, 0x33, 0x11b); /* classd3 : volume max, ok */

snd_soc_write(codec, 0x28, 0x179); /* ok */
snd_soc_write(codec, 0x29, 0x179); /* ok */

snd_soc_write(codec, 0x22, 0x100); /* dac to mixer, ok */
snd_soc_write(codec, 0x25, 0x100); /* dac to mixer, ok */

snd_soc_write(codec, 0x2f, 0x0c); /* left & right output mixer enable, ok */
snd_soc_write(codec, 0x05, 0x00); /* ok */
}

imx6solo wm8960始终没有声音输出的更多相关文章

  1. [已解决]Windows10 系统下HDMI 显示器 没有声音输出的奇怪问题

    今天想用一下显示器自带的喇叭,忽然发现声音输出选项里HDMI的声音设备没了.之前开始使用这台显示器的时是用过一段时间的. 百度了一番,没发现什么线索.后来去谷歌找到这么一段文字: I'm not su ...

  2. Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理

    在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...

  3. KDE声音服务器 arts

    KDE声音服务器 arts arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软 ...

  4. swift AVAudioPlayer播放音频时声音太小

    设置下声音输出的扬声器就行了 代码如下 do { try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionP ...

  5. 树莓派.系统.修改声音输出通道(auto,hdmi,耳机接口)

    树莓派平时通过耳机接口一直在正常使用 有一天外接了一个HDMI的屏幕, 结果耳机接口连着的音箱突然就没声音了,在网上查了资料,发现原来树莓派声音输出有3种模式 记录如下: 在命令行终端上输入下面命令将 ...

  6. 第十八篇 ANDROID的声音管理系统及服务

     声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置 ...

  7. 更改电脑名称后, Cnario无法播放画面和声音, 开机后停留在桌面, Cnario Player软件界面的停止按钮为蓝色可选状态

    症状描述 Cnario Player正常工作期间, 更改了电脑的Windows系统计算机名称(不是登录Windows的用户名), 重启后, 新计算机名生效. 此时Cnario自动启动, 但没有进入播放 ...

  8. ubuntu16耳机没声音解决

    装完ubuntu16后又装了英伟达的显卡驱动,安装了网易云音乐后,突然发现电脑没声音,使用了如下方法解决 首先用在终端输入如下命令,下载pulseaudio音量控制软件 sudo apt instal ...

  9. ubuntu 18.04 64bit没有声音如何解决

    一.背景 1.1 笔者的机器有两张声卡,使用aplay -l可以列举出来,一张是内置声卡,另一张是显卡自带的声卡,说明声卡驱动是ok的 1.2 笔者是在浏览器中播放视频无声音 二.尝试 2.1 尝试使 ...

随机推荐

  1. mysql explain22222 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. .使用explain语句去查看分析结果 如explain ...

  2. plsql programming 08 字符串

    一般, char 和 nchar 类型很少使用. 建议使用 varchar2 和 nvarchar2, 其中( n 开头的是国家字符集, 没有n开头的是数据库字符集 ) 一般也不怎么使用国家字符集 v ...

  3. Java基础01 从HelloWorld到面向对象(转载)

    Java是完全面向对象的语言.Java通过虚拟机的运行机制,实现“跨平台”的理念. "Hello World!" public class HelloWorld{    publi ...

  4. Tomcat运行流程

    Connector介绍 1.1 Connector的种类 Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类: Http Conn ...

  5. 第一百九十八节,jQuery EasyUI,ProgressBar(进度条)组件

    jQuery EasyUI,ProgressBar(进度条)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 ProgressBar(进度条) ...

  6. 基于python的七种经典排序算法(转)

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性:经过某种排序后,如果两个 ...

  7. git branch merge到master

    使用merge可以合并多个历史记录的流程. 如下图所示,bugfix分支是从master分支分叉出来的. 合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合 ...

  8. windows 32位以及64位的inline hook

    Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...

  9. Core Services层

    本文转载至 http://jingyan.baidu.com/article/cdddd41c57360853cb00e124.html Core Services层是系统很多部分的基础部分,也许应用 ...

  10. resize和reserve

    resize改变的实际的大小,reserve是容量即capacity 如果先指定capacity的大小,可以防止内存的重新分配,我感觉在分配实际的内存的时候会餐口capacity的大小,如果事先指定容 ...