前两篇文章分别介绍了linux alsa结构和android soundrecorder的应用层实现
除了板级的初始过程,其他都是关于类层次关系的一些静态说明
这章主要介绍下录音的动态过程,以及数据是如何一步步获取和保存的
还是先上图:
这个图大致介绍了soundrecord的流程,alsa到kernel部分还有个control模块这里没有画出来
下面一张图里面会提到,实际上control模块还是影响我们代码量主要的模块,主要就是mixer和muxer的配置
HAL层以上前面已经说过了,这里我们关注HAL以下部分:
- 应用层点击录音按钮
- tinyalsa打开设备文件节点/dev/snd/pcmC0D0c,给出相应的采样通道,采样率,一帧数据大小,总buffer大小等
- tinyalsa打开设备文件节点/dev/snd/controlC0,设置codec内部相关寄存器,选择输入输出device,配置内部route,即所谓dapm
- tinyalsa通过pcmC0D0c触发录音开始,dai_link上时钟开启,dapm建立后,从main_mic接收的pcm信号就会通过codec内部route发送到AIFADCDAT线上cpu exynos4412这边AIFDACDAT接收pcm信号数据后,通过移位器将数据保存到I2S的RX_FIFO
- RX_FIFO收到数据,触发DMA控制器开始拷贝数据,DMA(pl330)将RX_FIFO中的数据拷贝到DMA专有的内存缓冲,本例中snd_dma_buffer起始物理地址addr=0x6036_0000
- tinyalsa通过ioctl向设备节点/dev/snd/pcmC0D0c发起读数据请求,snd_pcm会将dma缓冲buffer中的数据拷贝到tinyalsa传入的用户buffer中
下面这张顺序图详细记录了soundrecorder开启录音之后alsa的交互流程:
这里我要提到的是在snd_pcm_open之后,有很大一段代码是做constraint检查
最开始我在调试的时候这个constraint检查一直不过,也就是上面的1.1节点,然后后面的过程没法进行下去
snd_pcm_open()时增加了一大推rule;这些rule的作用其实就是检查tinyalsa指定的config对于当前dai_link是否支持
- int snd_pcm_hw_constraints_init(struct snd_pcm_substream *substream)
- {
- struct snd_pcm_runtime *runtime = substream->runtime;
- struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
- int k, err;
- for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) {
- snd_mask_any(constrs_mask(constrs, k));
- }
- for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) {
- snd_interval_any(constrs_interval(constrs, k));
- }
- snd_interval_setinteger(constrs_interval(constrs, SNDRV_PCM_HW_PARAM_CHANNELS));
- snd_interval_setinteger(constrs_interval(constrs, SNDRV_PCM_HW_PARAM_BUFFER_SIZE));
- snd_interval_setinteger(constrs_interval(constrs, SNDRV_PCM_HW_PARAM_BUFFER_BYTES));
- snd_interval_setinteger(constrs_interval(constrs, SNDRV_PCM_HW_PARAM_SAMPLE_BITS));
- snd_interval_setinteger(constrs_interval(constrs, SNDRV_PCM_HW_PARAM_FRAME_BITS));
- err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
- snd_pcm_hw_rule_format, NULL,
- SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1);
- if (err < 0)
- return err;
- err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
- snd_pcm_hw_rule_sample_bits, NULL,
- SNDRV_PCM_HW_PARAM_FORMAT,
- SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1);
- if (err < 0)
- return err;
- err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
- snd_pcm_hw_rule_div, NULL,
- SNDRV_PCM_HW_PARAM_FRAME_BITS, SNDRV_PCM_HW_PARAM_CHANNELS, -1);
- if (err < 0)
- return err;
- err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FRAME_BITS,
- snd_pcm_hw_rule_mul, NULL,
- SNDRV_PCM_HW_PARAM_SAMPLE_BITS, SNDRV_PCM_HW_PARAM_CHANNELS, -1);
- .......
- }
其过程是这样的:
首先snd_pcm_hardware会声明自己支持的通道数,格式等,buffer_bytes_max是buffer总大小,其他值我也没有详细研究
基本按照linux原生拷贝,没有修改
- static const struct snd_pcm_hardware dma_hardware = {
- .info = SNDRV_PCM_INFO_INTERLEAVED |
- SNDRV_PCM_INFO_BLOCK_TRANSFER |
- SNDRV_PCM_INFO_MMAP |
- SNDRV_PCM_INFO_MMAP_VALID |
- SNDRV_PCM_INFO_PAUSE |
- SNDRV_PCM_INFO_RESUME,
- .formats = SNDRV_PCM_FMTBIT_S16_LE |
- SNDRV_PCM_FMTBIT_U16_LE |
- SNDRV_PCM_FMTBIT_U8 |
- SNDRV_PCM_FMTBIT_S8,
- .channels_min = 1,
- .channels_max = 2,
- .buffer_bytes_max = 128*1024,
- .period_bytes_min = PAGE_SIZE,
- .period_bytes_max = PAGE_SIZE*2,
- .periods_min = 2,
- .periods_max = 128,
- .fifo_size = 32,
- };
codec_dai这边声明如下:
- static struct snd_soc_dai_driver wm8994_dai[] = {
- {
- .name = "wm8994-aif1",
- .id = 1,
- .playback = {
- .stream_name = "AIF1 Playback",
- .channels_min = 1,
- .channels_max = 2,
- .rates = WM8994_RATES,
- .formats = WM8994_FORMATS,
- },
- .capture = {
- .stream_name = "AIF1 Capture",
- .channels_min = 1,
- .channels_max = 2,
- .rates = WM8994_RATES,
- .formats = WM8994_FORMATS,
- },
- .ops = &wm8994_aif1_dai_ops,
- },
- };
cpu_dai这边声明如下:
- struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec)
- {
- struct i2s_dai *i2s;
- i2s = kzalloc(sizeof(struct i2s_dai), GFP_KERNEL);
- i2s->pdev = pdev;
- i2s->pri_dai = NULL;
- i2s->sec_dai = NULL;
- i2s->i2s_dai_drv.symmetric_rates = 1;
- i2s->i2s_dai_drv.probe = samsung_i2s_dai_probe;
- i2s->i2s_dai_drv.remove = samsung_i2s_dai_remove;
- i2s->i2s_dai_drv.ops = &samsung_i2s_dai_ops;
- i2s->i2s_dai_drv.suspend = i2s_suspend;
- i2s->i2s_dai_drv.resume = i2s_resume;
- i2s->i2s_dai_drv.playback.channels_min = 2;
- i2s->i2s_dai_drv.playback.channels_max = 2;
- i2s->i2s_dai_drv.playback.rates = SAMSUNG_I2S_RATES;
- i2s->i2s_dai_drv.playback.formats = SAMSUNG_I2S_FMTS;
- if (!sec) {
- i2s->i2s_dai_drv.capture.channels_min = 1;
- i2s->i2s_dai_drv.capture.channels_max = 2;
- i2s->i2s_dai_drv.capture.rates = SAMSUNG_I2S_RATES;
- i2s->i2s_dai_drv.capture.formats = SAMSUNG_I2S_FMTS;
- } else { /* Create a new platform_device for Secondary */
- i2s->pdev = platform_device_register_resndata(NULL,
- pdev->name, pdev->id + SAMSUNG_I2S_SECOFF,
- NULL, 0, NULL, 0);
- if (IS_ERR(i2s->pdev)) {
- kfree(i2s);
- return NULL;
- }
- }
- /* Pre-assign snd_soc_dai_set_drvdata */
- dev_set_drvdata(&i2s->pdev->dev, i2s);
- return i2s;
- }
snd_pcm_open()的时候会先将snd_pcm_hardware的声明与cpu_dai声明做交集,然后在于codec_dai作交集
这个交集就是所选择dai_link的支持的pcm数据格式范围
最后tinyalsa会把用户选择的媒体格式数据pcm_config传下来,如下:
- struct pcm_config config = {
- channels : mChannelCount,
- rate : AUDIO_HW_IN_SAMPLERATE,
- period_size : AUDIO_HW_IN_PERIOD_SZ,
- period_count : AUDIO_HW_IN_PERIOD_CNT,
- format : PCM_FORMAT_S16_LE,
- start_threshold : 0,
- stop_threshold : 0,
- silence_threshold : 0,
- };
而先前说的那些rule就是检查用户请求的pcm_config是否在那个交集范围之内,不在说明格式不支持
如果我们确信格式支持,但是constraint检查不过,不用去看那些rule,直接查找我上面说的几个声明好了,肯定有某项不在交集范围之内
最后贴一段record开始之后的printk打印log,方便录音过程的理解:
- [ 92.487014] wm8994-snd_pcm_capture_open
- [ 92.491048] wm8994-snd_pcm_open
- [ 92.494080] wm8994-snd_pcm_hw_rule_add
- [ 92.497903] wm8994-snd_pcm_hw_rule_add
- [ 92.501719] wm8994-snd_pcm_hw_rule_add
- [ 92.505538] wm8994-snd_pcm_hw_rule_add
- [ 92.509346] wm8994-snd_pcm_hw_rule_add
- [ 92.513176] wm8994-snd_pcm_hw_rule_add
- [ 92.516996] wm8994-snd_pcm_hw_rule_add
- [ 92.520868] wm8994-snd_pcm_hw_rule_add
- [ 92.524622] wm8994-snd_pcm_hw_rule_add
- [ 92.528455] wm8994-snd_pcm_hw_rule_add
- [ 92.532273] wm8994-snd_pcm_hw_rule_add
- [ 92.536091] wm8994-snd_pcm_hw_rule_add
- [ 92.539899] wm8994-snd_pcm_hw_rule_add
- [ 92.543730] wm8994-snd_pcm_hw_rule_add
- [ 92.547549] wm8994-snd_pcm_hw_rule_add
- [ 92.551397] wm8994-snd_pcm_hw_rule_add
- [ 92.555219] wm8994-snd_pcm_hw_rule_add
- [ 92.558996] wm8994-snd_pcm_hw_rule_add
- [ 92.562829] wm8994-snd_pcm_hw_rule_add
- [ 92.566646] wm8994-snd_pcm_hw_rule_add
- [ 92.570469] Entered dma_open
- [ 92.573325] WM8994 AIF1: Symmetry forces 44100Hz rate
- [ 92.578452] wm8994-snd_interval_refine
- [ 92.582271] wm8994-snd_interval_refine
- [ 92.586089] wm8994-snd_interval_refine
- [ 92.589896] wm8994-snd_interval_refine
- [ 92.593873] wm8994-snd_interval_refine
- [ 92.597546] wm8994-snd_interval_refine
- [ 92.601366] wm8994-snd_pcm_hw_rule_add
- [ 92.605184] wm8994-snd_pcm_hw_rule_add
- [ 92.608998] wm8994-snd_pcm_capture_ioctl
- [ 92.613002] wm8994-snd_pcm_lib_ioctl cmd 0x1
- [ 92.617252] wm8994-snd_pcm_capture_ioctl
- [ 92.621296] wm8994-snd_interval_refine
- [ 92.625064] wm8994-snd_interval_refine
- [ 92.628870] wm8994-snd_interval_refine
- [ 92.632701] wm8994-snd_interval_refine
- .........................................
- [ 92.766374] wm8994-snd_interval_refine
- [ 92.770192] wm8994-snd_interval_refine
- [ 92.774000] wm8994-snd_interval_refine
- [ 92.777831] wm8994-snd_interval_refine
- [ 92.781651] wm8994-snd_pcm_lib_ioctl cmd 0x4
- [ 92.785906] wm8994-snd_interval_refine
- [ 92.789711] wm8994-snd_interval_refine
- [ 92.793736] wm8994-snd_interval_refine
- [ 92.797361] wm8994-snd_interval_refine
- [ 92.801180] wm8994-snd_interval_refine
- [ 92.804987] wm8994-snd_interval_refine
- [ 92.808819] wm8994-snd_interval_refine
- [ 92.812638] wm8994-snd_interval_refine
- [ 92.816456] wm8994-snd_interval_refine
- [ 92.820320] wm8994-snd_interval_refine
- [ 92.824084] wm8994-snd_interval_refine
- [ 92.827917] wm8994-snd_interval_refine
- [ 92.831735] wm8994-snd_interval_refine
- [ 92.835553] wm8994-snd_interval_refine
- [ 92.839361] wm8994-snd_interval_refine
- [ 92.843191] wm8994-snd_interval_refine
- [ 92.847011] wm8994-snd_interval_refine
- [ 92.850857] wm8994-snd_interval_refine
- [ 92.854638] wm8994-snd_pcm_lib_ioctl cmd 0x4
- [ 92.858932] wm8994-snd_interval_refine
- [ 92.862725] wm8994-snd_pcm_lib_ioctl cmd 0x4
- [ 92.866977] wm8994-soc_pcm_hw_params
- [ 92.870621] wm8994-smdk_hw_params
- [ 92.873995] [zsb] wm8994_set_dai_fmt: id : 1
- [ 92.878262] wm8994-codec wm8994-codec: read 300 => 2010
- [ 92.883470] wm8994-codec wm8994-codec: read 302 => 4000
- [ 92.888676] wm8994-i2s_set_fmt
- [ 92.891945] [zsb] wm8994_set_fll
- [ 92.895003] wm8994-codec wm8994-codec: read 200 => 10
- [ 92.900050] wm8994-codec wm8994-codec: read 204 => 0
- [ 92.904982] [zsb] wm8994_set_dai_sysclk
- [ 92.908815] wm8994-codec wm8994-codec: AIF1 using FLL1
- [ 92.913934] [zsb] configure_clock
- [ 92.917233] [zsb] configure_aif_clock aif : 0, sysclk : 3
- [ 92.922664] wm8994-codec wm8994-codec: read 200 => 10
- [ 92.927652] [zsb] configure_aif_clock aif : 1, sysclk : 0
- [ 92.933033] wm8994-codec wm8994-codec: read 208 => 0
- [ 92.937979] [zsb] wm8994_hw_params
- [ 92.941365] wm8994-codec wm8994-codec: Sample rate is 44100Hz
- [ 92.947094] wm8994-codec wm8994-codec: AIF1CLK is 11289600Hz, target BCLK 1411200Hz
- [ 92.954760] wm8994-codec wm8994-codec: read 300 => 2010
- [ 92.959974] wm8994-codec wm8994-codec: Selected AIF1CLK/fs = 256
- [ 92.965933] wm8994-codec wm8994-codec: Using BCLK_DIV 80 for actual BCLK 1411200Hz
- [ 92.973482] wm8994-codec wm8994-codec: Using LRCLK rate 32 for actual LRCLK 44100Hz
- [ 92.981123] wm8994-codec wm8994-codec: read 300 => 2010
- [ 92.986327] wm8994-codec wm8994-codec: read 301 => 4000
- [ 92.991715] wm8994-codec wm8994-codec: read 303 => 70
- [ 92.996570] wm8994-codec wm8994-codec: read 305 => 20
- [ 93.001604] wm8994-codec wm8994-codec: read 210 => 73
- [ 93.006639] wm8994-i2s_hw_params
- [ 93.009925] Entered dma_hw_params
- [ 93.013236] params e00eadc0, client e00eadc0, channel 15
- [ 93.018596] snd_pcm_set_runtime_buffer dma_area 0xffd60000 dma_addr 0x60600000
- [ 93.025870] DmaAddr=@60600000 Total=8192bytes PrdSz=2 #Prds=4096 dma_area=0xffd60000
- [ 93.033556] wm8994-snd_pcm_capture_ioctl
- [ 93.037539] wm8994-snd_pcm_sw_params_user
- [ 93.041639] wm8994-snd_pcm_mmap
- [ 93.044835] wm8994-snd_pcm_capture_ioctl
- [ 93.048869] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.052781] wm8994-codec wm8994-codec: read 28 => 30
- [ 93.057680] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.061630] wm8994-codec wm8994-codec: read 28 => 30
- [ 93.066553] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.070446] wm8994-codec wm8994-codec: read 28 => 30
- [ 93.075385] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.079283] wm8994-codec wm8994-codec: read 28 => 30
- [ 93.084246] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.088148] wm8994-codec wm8994-codec: read 18 => 10c
- [ 93.093324] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.097086] wm8994-codec wm8994-codec: read 18 => 10c
- [ 93.102126] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.106028] wm8994-codec wm8994-codec: read 18 => 10c
- [ 93.111059] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.114954] wm8994-codec wm8994-codec: read 18 => 10c
- [ 93.120079] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.123901] wm8994-codec wm8994-codec: read 29 => 30
- [ 93.128856] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.132764] wm8994-codec wm8994-codec: read 29 => 30
- [ 93.137716] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.141616] wm8994-codec wm8994-codec: read 29 => 30
- [ 93.146561] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.150496] wm8994-codec wm8994-codec: read 29 => 30
- [ 93.155429] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.159312] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.163271] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.167138] wm8994-codec wm8994-codec: read 300 => 2010
- [ 93.172341] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.176249] wm8994-codec wm8994-codec: read 300 => 2010
- [ 93.181464] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.185363] wm8994-codec wm8994-codec: read 300 => 2010
- [ 93.190755] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.194464] wm8994-codec wm8994-codec: read 300 => 2010
- [ 93.199691] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.203591] wm8994-codec wm8994-codec: read 400 => 1ee
- [ 93.208710] wm8994-codec wm8994-codec: read 401 => 1ee
- [ 93.213831] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.217738] wm8994-codec wm8994-codec: read 400 => 1ee
- [ 93.222903] wm8994-codec wm8994-codec: read 401 => 1ee
- [ 93.227981] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.231888] wm8994-codec wm8994-codec: read 400 => 1ee
- [ 93.237007] wm8994-codec wm8994-codec: read 401 => 1ee
- [ 93.242130] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.246036] wm8994-codec wm8994-codec: read 400 => 1ee
- [ 93.251182] wm8994-codec wm8994-codec: read 401 => 1ee
- [ 93.256291] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.260188] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.265246] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.269114] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.274159] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.279204] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.283101] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.288132] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.292182] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.297073] wm8994-codec wm8994-codec: read 440 => 9b
- [ 93.302121] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.306020] wm8994-codec wm8994-codec: read 606 => 2
- [ 93.310961] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.314858] wm8994-codec wm8994-codec: read 606 => 2
- [ 93.319828] snd_ctl_ioctl-cmd=0xc2c85512
- [ 93.323772] wm8994-codec wm8994-codec: read 607 => 2
- [ 93.328669] snd_ctl_ioctl-cmd=0xc2c85513
- [ 93.332578] wm8994-codec wm8994-codec: read 607 => 2
- [ 93.337562] wm8994-snd_pcm_capture_ioctl
- [ 93.341519] wm8994-soc_pcm_prepare
- [ 93.344975] Entered dma_prepare addr=0x03830014,size=2,start=0x60600000
- [ 93.351617] Entered dma_enqueue
- [ 93.354694] dma_enqueue: loaded 0, limit 2
- [ 93.358920] wm8994-codec wm8994-codec: read 208 => 0
- [ 93.364156] [zsb] wm8994_set_bias_level: 2
- [ 93.367849] wm8994-codec wm8994-codec: read 1 => 35
- [ 93.372676] wm8994-codec wm8994-codec: write 1 = 33
- [ 93.377537] wm8994-codec wm8994-codec: 0x0001 <- 0x0033
- [ 93.382920] [zsb] aif1clk_ev
- [ 93.385613] wm8994-codec wm8994-codec: read 208 => 0
- [ 93.390744] wm8994-codec wm8994-codec: write 208 = a
- [ 93.395503] wm8994-codec wm8994-codec: 0x0208 <- 0x000a
- [ 93.400884] wm8994-codec wm8994-codec: read 4 => 0
- [ 93.405486] wm8994-codec wm8994-codec: write 4 = 200
- [ 93.410433] wm8994-codec wm8994-codec: 0x0004 <- 0x0200
- [ 93.415810] wm8994-codec wm8994-codec: read 200 => 10
- [ 93.420680] wm8994-codec wm8994-codec: write 200 = 11
- [ 93.425763] wm8994-codec wm8994-codec: 0x0200 <- 0x0011
- [ 93.431090] wm8994-codec wm8994-codec: read 5 => 3
- [ 93.435917] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.440640] wm8994-codec wm8994-codec: read 5 => 3
- [ 93.445615] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.450366] wm8994-codec wm8994-codec: read 5 => 3
- [ 93.455367] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.460148] wm8994-codec wm8994-codec: read 4 => 200
- [ 93.465032] wm8994-codec wm8994-codec: write 4 = 202
- [ 93.470026] wm8994-codec wm8994-codec: 0x0004 <- 0x0202
- [ 93.475346] wm8994-codec wm8994-codec: read 2 => 6000
- [ 93.480221] wm8994-codec wm8994-codec: write 2 = 6240
- [ 93.485254] wm8994-codec wm8994-codec: 0x0002 <- 0x6240
- [ 93.490784] [zsb] late_disable_ev
- [ 93.493950] wm8994-codec wm8994-codec: read 212 => 0
- [ 93.498709] wm8994-codec wm8994-codec: SRC status: 0
- [ 93.503678] [zsb] wm8994_set_bias_level: 3
- [ 93.507737] wm8994-codec wm8994-codec: read 1 => 33
- [ 93.512604] [zsb] wm8994_aif_mute id:1 mute:0
- [ 93.516938] wm8994-codec wm8994-codec: read 420 => 200
- [ 93.522114] wm8994-codec wm8994-codec: write 420 = 0
- [ 93.527007] wm8994-codec wm8994-codec: 0x0420 <- 0x0000
- [ 93.532384] wm8994-snd_pcm_lib_ioctl cmd 0x0
- [ 93.536476] wm8994-soc_pcm_prepare
- [ 93.539927] Entered idma_prepare start=0x02058000
- [ 93.544706] wm8994-codec wm8994-codec: read 208 => a
- [ 93.549899] wm8994-snd_pcm_capture_ioctl
- [ 93.553568] wm8994-soc_pcm_trigger
- [ 93.557025] Entered dma_trigger
- [ 93.560163] wm8994-i2s_trigger cmd=1 capture=1,i2s->addr=0xefc9e000
- [ 93.566409] wm8994-i2s_trigger I2SCON=0x8050ce53,I2SMOD=0xd0001900,I2SRXD=0x00000000
- [ 93.574202] wm8994-snd_pcm_capture_ioctl
- [ 93.578131] wm8994-snd_pcm_lib_read
- [ 93.580051] wm8994-codec wm8994-codec: read 1 => 33
- [ 93.580058] wm8994-codec wm8994-codec: write 1 = 333
- [ 93.580064] wm8994-codec wm8994-codec: 0x0001 <- 0x0333
- [ 93.596921] wm8994-snd_pcm_lib_read_transfer
- [ 93.601079] wm8994-snd_pcm_lib_read_transfer
- [ 93.605401] wm8994-codec wm8994-codec: read 60 => 0
- [ 93.605405] wm8994-snd_pcm_lib_read_transfer
- [ 93.605417] wm8994-snd_pcm_lib_read_transfer
- [ 93.612894] wm8994-snd_pcm_lib_read_transfer
- [ 93.613112] wm8994-snd_pcm_capture_ioctl
- [ 93.613117] wm8994-snd_pcm_lib_read
- [ 93.613126] wm8994-snd_pcm_lib_read_transfer
- [ 93.635181] wm8994-codec wm8994-codec: write 60 = 22
- [ 93.640111] wm8994-codec wm8994-codec: 0x0060 <- 0x0022
- [ 93.645496] wm8994-codec wm8994-codec: read 4c => 1f25
- [ 93.650440] wm8994-codec wm8994-codec: read 208 => a
- [ 93.655399] wm8994-codec wm8994-codec: write 208 = 1a
- [ 93.659331] wm8994-snd_pcm_lib_read_transfer
- [ 93.659624] wm8994-snd_pcm_release
- [ 93.659632] wm8994-soc_pcm_trigger
- [ 93.659636] Entered dma_trigger
- [ 93.659655] wm8994-i2s_trigger cmd=0 capture=1,i2s->addr=0xefc9e000
- [ 93.681094] wm8994-codec wm8994-codec: 0x0208 <- 0x001a
- [ 93.686451] wm8994-codec wm8994-codec: read 5 => 3
- [ 93.691059] wm8994-codec wm8994-codec: write 5 = 303
- [ 93.696020] wm8994-codec wm8994-codec: 0x0005 <- 0x0303
- [ 93.701376] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.706387] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.711110] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.716260] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.721006] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.726155] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.730915] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.736057] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.740796] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.745966] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.750691] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.755839] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.760586] [zsb] dac_ev
- [ 93.763090] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.768062] [zsb] dac_ev
- [ 93.770568] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.775517] wm8994-codec wm8994-codec: read 3 => 0
- [ 93.780302] wm8994-codec wm8994-codec: write 3 = 300
- [ 93.785238] wm8994-codec wm8994-codec: 0x0003 <- 0x0300
- [ 93.790670] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.795604] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.800341] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.805516] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.810237] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.815388] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.820133] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.825279] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.830040] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.835171] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.839908] wm8994-codec wm8994-codec: read 5 => 303
- [ 93.845098] wm8994-codec wm8994-codec: read 900 => 0
- [ 93.849805] wm8994-codec wm8994-codec: read 60 => 22
- [ 93.854764] wm8994-codec wm8994-codec: read 4c => 1f25
- [ 93.859898] wm8994-codec wm8994-codec: write 4c = 9f25
- [ 93.865022] wm8994-codec wm8994-codec: 0x004c <- 0x9f25
- [ 93.880031] wm8994-codec wm8994-codec: read 1 => 333
- [ 93.880107] wm8994-codec wm8994-codec: write 60 = 22
- [ 93.884320] wm8994-codec wm8994-codec: 0x0060 <- 0x0022
- [ 93.889679] wm8994-codec wm8994-codec: read 55 => 401
- [ 93.894568] wm8994-codec wm8994-codec: Using cached DC servo offset fbfb
- [ 93.901237] wm8994-codec wm8994-codec: write 57 = fbfb
- [ 93.906371] wm8994-codec wm8994-codec: 0x0057 <- 0xfbfb
- [ 93.911725] wm8994-codec wm8994-codec: write 54 = f
- [ 93.916440] wm8994-codec wm8994-codec: 0x0054 <- 0x000f
- [ 93.921793] wm8994-codec wm8994-codec: Waiting for DC servo...
- [ 93.935231] wm8994-codec wm8994-codec: read 54 => 3
- [ 93.935305] wm8994-codec wm8994-codec: DC servo: 3
- [ 93.939255] wm8994-codec wm8994-codec: write 60 = ee
- [ 93.944195] wm8994-codec wm8994-codec: 0x0060 <- 0x00ee
- [ 93.949574] wm8994-codec wm8994-codec: read 1 => 333
- [ 93.954350] wm8994-codec wm8994-codec: write 1 = 3333
- [ 93.959384] wm8994-codec wm8994-codec: 0x0001 <- 0x3333
- [ 93.964761] [zsb] late_disable_ev
- [ 93.968099] wm8994-codec wm8994-codec: read 212 => 0
- [ 93.972837] wm8994-codec wm8994-codec: SRC status: 0
- [ 93.977820] [zsb] wm8994_aif_mute id:1 mute:0
- [ 93.982127] wm8994-codec wm8994-codec: read 420 => 0
- [ 93.987075] wm8994-snd_pcm_lib_ioctl cmd 0x0
- [ 93.987082] Entered dma_hw_free
- [ 93.987106] Entered dma_close
- [ 93.987193] wm8994-codec wm8994-codec: read 208 => 1a
- [ 93.987549] wm8994-codec wm8994-codec: read 2 => 6240
- [ 93.987555] wm8994-codec wm8994-codec: write 2 = 6000
- [ 93.987561] wm8994-codec wm8994-codec: 0x0002 <- 0x6000
- [ 93.987725] wm8994-codec wm8994-codec: read 4 => 202
- [ 93.987730] wm8994-codec wm8994-codec: write 4 = 200
- [ 93.987736] wm8994-codec wm8994-codec: 0x0004 <- 0x0200
- [ 93.987897] wm8994-codec wm8994-codec: read 4 => 200
- [ 93.987903] wm8994-codec wm8994-codec: write 4 = 0
- [ 93.987909] wm8994-codec wm8994-codec: 0x0004 <- 0x0000
- [ 93.988066] [zsb] late_disable_ev
- [ 93.988272] wm8994-codec wm8994-codec: read 212 => 0
- [ 93.988277] wm8994-codec wm8994-codec: SRC status: 0
- [ 94.060961] wm8994-snd_pcm_lib_write
- [ 94.064577] wm8994-snd_pcm_lib_write_transfer
- [ 94.069362] wm8994-snd_pcm_lib_write
- [ 94.072766] wm8994-snd_pcm_lib_write_transfer
- [ 94.077304] wm8994-soc_pcm_trigger
- [ 94.080552] Entered idma_trigger
- [ 94.083772] wm8994-i2s_trigger cmd=1 capture=0,i2s->addr=0xefcb2000
- [ 94.090270] wm8994-snd_pcm_lib_write
- [ 94.093658] wm8994-snd_pcm_lib_write_transfer
- [ 94.098399] wm8994-snd_pcm_lib_write
- [ 94.102092] wm8994-snd_pcm_lib_write_transfer
- [ 94.129519] wm8994-snd_pcm_lib_write
- [ 94.129583] wm8994-snd_pcm_lib_write_transfer
- [ 94.132253] wm8994-snd_pcm_lib_write_transfer
- [ 94.136440] wm8994-snd_pcm_lib_write_transfer
- ................................................
- [ 97.091836] wm8994-snd_pcm_lib_write
- [ 97.091894] wm8994-snd_pcm_lib_write_transfer
- [ 97.094403] wm8994-snd_pcm_lib_write_transfer
- [ 97.098725] wm8994-snd_pcm_lib_write_transfer
- [ 97.103158] wm8994-snd_pcm_lib_write_transfer
- [ 97.107587] wm8994-snd_pcm_lib_write_transfer
- [ 97.112147] wm8994-snd_pcm_release
- [ 97.115472] wm8994-soc_pcm_trigger
- [ 97.118926] Entered idma_trigger
- [ 97.122141] wm8994-i2s_trigger cmd=0 capture=0,i2s->addr=0xefcb2000
- [ 97.128414] Entered idma_hw_free
- [ 97.131611] [zsb] wm8994_aif_mute id:1 mute:1
- [ 97.135962] wm8994-codec wm8994-codec: read 420 => 0
- [ 97.140897] wm8994-codec wm8994-codec: write 420 = 200
- [ 97.146020] wm8994-codec wm8994-codec: 0x0420 <- 0x0200
- [ 97.151405] Entered idma_close, prtd = d7cf9f40