打印
[i.MX]

imx6solo wm8960始终没有声音输出

[复制链接]
6531|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eskytan|  楼主 | 2015-4-21 18:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我尝试各种办法,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 CODEC wm8962.0-001a: -19

asoc: failed to instantiate card wm8962-audio: -19

Initialize HDMI-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 CODEC wm8962.0-001a: -22

asoc: failed to instantiate 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 struct snd_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 route HPOUTL->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 generate zero samples (capture)

root@imx6solo /usr/bin$ aplay -l

**** List of PLAYBACK 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,差别其实非常大。

https://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]

Fmt Sample_rate:    [22050](HZ),22khz

Fmt Bytes_p_second: [88200]

Fmt Blocks_align:   [4]

Fmt Sample_length:  [16]



Chunk Type:         [data]

Chunk Length:       [424600]



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



Plug PCM: Rate conversion 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: Direct Stream 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 card 0 '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 signal Interrupt...

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 signal Interrupt...

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

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

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

WM8960 PLL: Unsupported N=3

Failed to start FLL: -22

Failed to set SYSCLK: -22

asoc: machine hw_params failed

Failed to set SYSCLK: -22

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

cm_direct_initialize_slave) unable to install hw params

ALSA lib pcm_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 ($(wildcard sound/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 handle kernel 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)







相关帖子

沙发
598330983| | 2015-4-21 20:43 | 只看该作者
确实有。o的输出,不过我也见过hex的,都是可以自己设定的。

使用特权

评论回复
板凳
FSL_TICS_Rita| | 2015-4-22 11:36 | 只看该作者
楼主你好,我看到你的这个问题在我们的英文论坛上也提交了同样的问题:https://community.freescale.com/thread/353072。请问你这里使用的是哪个版本的BSP?

使用特权

评论回复
地板
eskytan|  楼主 | 2015-4-22 12:03 | 只看该作者
L3.0.101_4.1.1_141016_source,CPU是imx6 solo。

使用特权

评论回复
5
eskytan|  楼主 | 2015-4-22 12:04 | 只看该作者
FSL_TICS_Rita 发表于 2015-4-22 11:36
楼主你好,我看到你的这个问题在我们的英文论坛上也提交了同样的问题:https://community.freescale.com/th ...

是的。提交了同样的问题,同样没有人回复啊。

使用特权

评论回复
6
FSL_TICS_Rita| | 2015-4-22 12:19 | 只看该作者
eskytan 发表于 2015-4-22 12:04
是的。提交了同样的问题,同样没有人回复啊。

关于这个问题我也不是很熟悉,我帮你催一下,请耐心等待哈~~英文论坛上问题处理的话,一般都是48小时内的。

使用特权

评论回复
7
eskytan|  楼主 | 2015-4-22 12:44 | 只看该作者
先验证了i2c,示波器显示有输出,并且测了看device addr也是0x1A。
alsamixer配置也是全部拉高,退出后重新进入,也是对的,可以保存和读出。
i2s data仍然没有,数据线对地电阻也测了,并没有短路。

使用特权

评论回复
8
FSL_TICS_Rita| | 2015-4-22 15:53 | 只看该作者
eskytan 发表于 2015-4-22 12:44
先验证了i2c,示波器显示有输出,并且测了看device addr也是0x1A。
alsamixer配置也是全部拉高,退出后重新 ...

OK。

使用特权

评论回复
9
FSL_TICS_Rita| | 2015-4-22 17:06 | 只看该作者
楼主你好,我们的工程师已经给你回复了,建议你参考我们英文论坛中的帖:
https://community.freescale.com/message/332170#332170
please double check the IOMUX setting that is match with your own hardware design.

使用特权

评论回复
10
eskytan|  楼主 | 2015-4-22 18:18 | 只看该作者
先验证了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_probe successfully。证明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配置不正确。

使用特权

评论回复
11
eskytan|  楼主 | 2015-4-23 16:19 | 只看该作者
iomux setting检查了,都改为MX6DL_ADU_PAD_CTRL了,无济无事!

使用特权

评论回复
12
eskytan|  楼主 | 2015-4-23 18:33 | 只看该作者
我怀疑是软件原因:
在static int imx_ssi_probe(struct platform_device *pdev)中,
        ret = snd_soc_register_dai(&pdev->dev, dai);
        if (ret) {
                dev_err(&pdev->dev, "register DAI failed\n");
                goto failed_register;
        }
而在static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
                                      const struct i2c_device_id *id)中,
        ret = snd_soc_register_codec(&i2c->dev,
                        &soc_codec_dev_wm8960, &wm8960_dai, 0);
Registered DAI 'wm8960-hifi'
Registered DAI 'imx-ssi.1'
设置audio参数时,imx_hifi_hw_params()中调用的是wm8960-hifi的DAI驱动。
现在的问题是SSI的imx_ssi_set_dai_sysclk()或imx_ssi_set_dai_sysclk()都无法调用,我不知道这是否是SSI的BCLK无信号的原因。

使用特权

评论回复
13
FSL_TICS_Rita| | 2015-4-24 14:11 | 只看该作者
eskytan 发表于 2015-4-23 18:33
我怀疑是软件原因:
在static int imx_ssi_probe(struct platform_device *pdev)中,
        ret = snd_soc_regis ...

楼主你好,我们的工程师在英文论坛上给你回复了,请注意查看哈~~

使用特权

评论回复
14
eskytan|  楼主 | 2015-4-24 18:12 | 只看该作者
始终不行啊,代码我都帖上去了。请帮忙看看。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

1

粉丝