android soundrecorder之三 錄音流程及數據流向

轉載請標註原文地址:http://blog.csdn.net/uranus_wm/article/details/12851111

 

前兩篇文章分別介紹了linux alsa結構和android soundrecorder的應用層實現

除了板級的初始過程,其他都是關於類層次關係的一些靜態說明

這章主要介紹下錄音的動態過程,以及數據是如何一步步獲取和保存的

還是先上圖:


這個圖大致介紹了soundrecord的流程,alsa到kernel部分還有個control模塊這裏沒有畫出來

下面一張圖裏面會提到,實際上control模塊還是影響我們代碼量主要的模塊,主要就是mixer和muxer的配置

HAL層以上前面已經說過了,這裏我們關注HAL以下部分:

  1. 應用層點擊錄音按鈕
  2. tinyalsa打開設備文件節點/dev/snd/pcmC0D0c,給出相應的採樣通道,採樣率,一幀數據大小,總buffer大小等
  3. tinyalsa打開設備文件節點/dev/snd/controlC0,設置codec內部相關寄存器,選擇輸入輸出device,配置內部route,即所謂dapm
  4. tinyalsa通過pcmC0D0c觸發錄音開始,dai_link上時鐘開啓,dapm建立後,從main_mic接收的pcm信號就會通過codec內部route發送到AIFADCDAT線上cpu exynos4412這邊AIFDACDAT接收pcm信號數據後,通過移位器將數據保存到I2S的RX_FIFO
  5. RX_FIFO收到數據,觸發DMA控制器開始拷貝數據,DMA(pl330)將RX_FIFO中的數據拷貝到DMA專有的內存緩衝,本例中snd_dma_buffer起始物理地址addr=0x6036_0000
  6. 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

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章