久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Android音频(4)——音频驱动实战

發布時間:2023/12/25 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android音频(4)——音频驱动实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、應用測試工具的使用

1.在external/tinyalsa下有以C語言實現的alsa的測試程序,編譯后生成tinypcminfo tinyplay tinycap tinymix 四個elf格式的測試工具

(1) tinypcminfo :獲取PCM In和PCM

# tinypcminfo -D /dev/snd/controlC0

# tinypcminfo -D /dev/snd/pcmC0D0p           
Info for card 0, device 0:

PCM out:
      Access:   0x000009
   Format[0]:   0x000044
   Format[1]:   00000000
 Format Name:   S16_LE, S24_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=48000Hz
    Channels:   min=2           max=2
 Sample bits:   min=16          max=32
 Period size:   min=512         max=8192
Period count:   min=2           max=64

PCM in:
      Access:   0x000009
   Format[0]:   0x000044
   Format[1]:   00000000
 Format Name:   S16_LE, S24_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=48000Hz
    Channels:   min=1           max=2
 Sample bits:   min=16          max=32
 Period size:   min=512         max=16384
Period count:   min=2           max=128

View Code

(2) tinymix :通過/dev/snd/controlC0節點設置獲取控制信息,進行控件的設置。比如設置鏈路,音量調節等。

# tinymix
Mixer name: 'S3C2440_UDA1341'
Number of controls: 50
ctl     type    num     name                                     value
0       INT     2       Capture Volume                           51 51
1       INT     2       Capture Volume ZC Switch                 0 0
2       BOOL    2       Capture Switch                           Off On
3       INT     2       Playback Volume                          255 255
4       INT     2       Headphone Playback Volume                121 121
5       BOOL    2       Headphone Playback ZC Switch             Off Off
6       INT     2       Speaker Playback Volume                  121 121
7       BOOL    2       Speaker Playback ZC Switch               Off Off
....

View Code

# tinymix    打印出所有的snd_kcontrol項
可以通過名字操作:
# ./tinymix "Capture Volume"         //單獲取這項的值        
Capture Volume: 51 51 (range 0->63)
# ./tinymix "Capture Volume" 10     //單設置這項的值為10      
# ./tinymix "Capture Volume"                     
Capture Volume: 10 10 (range 0->63)

也可以通過序號操作:
# ./tinymix 0                                    
Capture Volume: 10 10 (range 0->63)
# ./tinymix 0 20                                 
# ./tinymix 0                                    
Capture Volume: 20 20 (range 0->63)

驅動中對應的file_operations是:struct file_operations snd_ctl_f_ops

(3) tinycap : 使用/dev/snd/pcmC0D0c錄音
# tinycap a.wav
const struct file_operations snd_pcm_f_ops[1]

(4) tinyplay : 使用/dev/snd/pcmC0D0p播放聲音
# tinyplay a.wav

const struct file_operations snd_pcm_f_ops[0]

二、內核導出信息

1.devtmpfs信息(設備節點)

shell@tiny4412:/system # ls /dev/snd/ -l                                       
total 0
crw-rw----    1 1000     1005      116,   0 Jan  1 12:00 controlC0
crw-rw----    1 1000     1005      116,  24 Jan  1 12:00 pcmC0D0c
crw-rw----    1 1000     1005      116,  16 Jan  1 12:00 pcmC0D0p
crw-rw----    1 1000     1005      116,  25 Jan  1 12:00 pcmC0D1c
crw-rw----    1 1000     1005      116,  17 Jan  1 12:00 pcmC0D1p
crw-rw----    1 1000     1005      116,  33 Jan  1 12:00 timer

controlC0: 起控制作用,C0表示Card0
pcmC0D0c: Card 0,Device 0 capture,用來錄音。
pcmC0D0p: Card 0,Device 0 playback,用來錄音。
pcmC0D1c: Card 0,Device 1 capture,用來錄音。
pcmC0D1p: Card 0,Device 1 playback,用來錄音。
timer: 很少使用,暫時不用管。

pcmC0D1c/pcmC0D1p是一個輔助的備份的音頻設備,先不管。

ALSA框架中一個聲卡可以有多個邏輯Device,上面的pcmC0D0X和pcmC0D1X就是兩個邏輯設備,一個Device又有播放、錄音通道。

2.procfs文件信息

shell@tiny4412:/system # ls /proc/asound/                                      
card0     cards     devices   hwdep     pcm       timers    tiny4412  version

3.sysfs文件信息

/sys/class/sound/
有聲卡的id,number,pcm_class等信息

4.debugfs文件信息

/sys/kernel/debug/asoc/
導出信息包括:
① Codec各個組件的dapm信息TINY4412_UDA8960/wm8960-codec.0-001a/dapm下的
shell@tiny4412:/sys/kernel/debug/asoc/TINY4412_UDA8960/wm8960-codec.0-001a/dapm # ls
HP_L                  Left Speaker Output   Right Boost Mixer
HP_R                  Left Speaker PGA      Right DAC
LINPUT1               MICB                  Right Input Mixer
LINPUT2               Mic Onboard           Right Output Mixer
LINPUT3               Mono Output Mixer     Right Speaker Output
LOUT1 PGA             OUT3                  Right Speaker PGA
Left ADC              RINPUT1               SPK_LN
Left Boost Mixer      RINPUT2               SPK_LP
Left DAC              RINPUT3               SPK_RN
Left Input Mixer      ROUT1 PGA             SPK_RP
Left Output Mixer     Right ADC             bias_level

② Codec的寄存器信息
shell@tiny4412:/sys/kernel/debug/asoc/TINY4412_UDA8960/wm8960-codec.0-001a # ls
cache_only  cache_sync  codec_reg

③ 為消除pop音的延時時間
/sys/kernel/debug/asoc/TINY4412_UDA8960# ls
dapm_pop_time

④ dapm的bias_level
/sys/kernel/debug/asoc/TINY4412_UDA8960/dapm # cat bias_level   
Off

⑤ 系統中所有注冊的Codec,dais和Platform驅動的名字
/sys/kernel/debug/asoc # ls
S3C2440_UDA1341  codecs           dais             platforms

三、驅動實戰

驅動分Platform驅動,Codec驅動和Machine驅動。我們對于4412開發板主要任務就是實現Machine驅動的平臺設備端,移植調試Codec驅動wm8960.c。

Platform驅動Soc廠商已經實現好了是:sound/soc/samsung/dma.c
Soc端的dai驅動Soc廠商已經實現好了是:sound/soc/samsung/i2s.c
Machine平臺設備驅動驅動端sound子系統已經實現好了,是sound/soc/soc-core.c

Codec驅動和Codec端的dai驅動都在Codec驅動中實現。

(1) 調試好的Codec驅動wm8960.c,

/*
 * wm8960.c  --  WM8960 ALSA SoC Audio driver
 *
 * Author: Liam Girdwood
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/i2c.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/initval.h>
#include <sound/tlv.h>
#include <sound/wm8960.h>

#include "wm8960.h"

/* R25 - Power 1 */
#define WM8960_VMID_MASK 0x180
#define WM8960_VREF      0x40

/* R26 - Power 2 */
#define WM8960_PWR2_LOUT1    0x40
#define WM8960_PWR2_ROUT1    0x20
#define WM8960_PWR2_OUT3    0x02

/* R28 - Anti-pop 1 */
#define WM8960_POBCTRL   0x80
#define WM8960_BUFDCOPEN 0x10
#define WM8960_BUFIOEN   0x08
#define WM8960_SOFT_ST   0x04
#define WM8960_HPSTBY    0x01

/* R29 - Anti-pop 2 */
#define WM8960_DISOP     0x40
#define WM8960_DRES_MASK 0x30

/*
 * wm8960 register cache
 * We can't read the WM8960 register space when we are
 * using 2 wire for device control, so we cache them instead.
 */
static const u16 wm8960_reg[WM8960_CACHEREGNUM] = {
    0x0097, 0x0097, 0x0000, 0x0000,
    0x0000, 0x0008, 0x0000, 0x000a,
    0x01c0, 0x0000, 0x00ff, 0x00ff,
    0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x007b, 0x0100, 0x0032,
    0x0000, 0x00c3, 0x00c3, 0x01c0,
    0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0000, 0x0000,
    0x0100, 0x0100, 0x0050, 0x0050,
    0x0050, 0x0050, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0040, 0x0000,
    0x0000, 0x0050, 0x0050, 0x0000,
    0x0002, 0x0037, 0x004d, 0x0080,
    0x0008, 0x0031, 0x0026, 0x00e9,
};

struct wm8960_priv {
    enum snd_soc_control_type control_type;
    void *control_data;
    int (*set_bias_level)(struct snd_soc_codec *, enum snd_soc_bias_level level);
    struct snd_soc_dapm_widget *lout1;
    struct snd_soc_dapm_widget *rout1;
    struct snd_soc_dapm_widget *out3;
    bool deemph;
    int playback_fs;
};

#define wm8960_reset(c)    snd_soc_write(c, WM8960_RESET, 0)

/* enumerated controls */ /*極性*/
static const char *wm8960_polarity[] = {
    "No Inversion", "Left Inverted",
    "Right Inverted", "Stereo Inversion"}; /*立體聲反轉*/
static const char *wm8960_3d_upper_cutoff[] = {"High", "Low"};
static const char *wm8960_3d_lower_cutoff[] = {"Low", "High"};
static const char *wm8960_alcfunc[] = {"Off", "Right", "Left", "Stereo"};
static const char *wm8960_alcmode[] = {"ALC", "Limiter"};

/*
#define SOC_ENUM_SINGLE(xreg, xshift, xmax, xtexts)
{
    .reg = xreg,
    .shift_l = xshift,
    .shift_r = xshift,
    .max = xmax,
    .texts = xtexts
}
*/
/*
soc_mixer_control來描述mixer控件的寄存器信息
soc_enum 來描述mux控件的寄存器信息
*/
static const struct soc_enum wm8960_enum[] = {
    SOC_ENUM_SINGLE(WM8960_DACCTL1, 5, 4, wm8960_polarity),
    SOC_ENUM_SINGLE(WM8960_DACCTL2, 5, 4, wm8960_polarity),
    SOC_ENUM_SINGLE(WM8960_3D, 6, 2, wm8960_3d_upper_cutoff),
    SOC_ENUM_SINGLE(WM8960_3D, 5, 2, wm8960_3d_lower_cutoff),
    SOC_ENUM_SINGLE(WM8960_ALC1, 7, 4, wm8960_alcfunc),
    SOC_ENUM_SINGLE(WM8960_ALC3, 8, 2, wm8960_alcmode),
};

/*采樣率設置*/
static const int deemph_settings[] = { 0, 32000, 44100, 48000 };

static int wm8960_set_deemph(struct snd_soc_codec *codec)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    int val, i, best;

    /* If we're using deemphasis select the nearest available sample
     * rate.
     */
    if (wm8960->deemph) {
        best = 1;
        for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) {
            if (abs(deemph_settings[i] - wm8960->playback_fs) <
                abs(deemph_settings[best] - wm8960->playback_fs))
                best = i;
        }

        val = best << 1;
    } else {
        val = 0;
    }

    dev_dbg(codec->dev, "Set deemphasis %d
", val);

    return snd_soc_update_bits(codec, WM8960_DACCTL1,
                   0x6, val);
}

static int wm8960_get_deemph(struct snd_kcontrol *kcontrol,
                 struct snd_ctl_elem_value *ucontrol)
{
    struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);

    ucontrol->value.enumerated.item[0] = wm8960->deemph;
    return 0;
}

static int wm8960_put_deemph(struct snd_kcontrol *kcontrol,
                 struct snd_ctl_elem_value *ucontrol)
{
    struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    int deemph = ucontrol->value.enumerated.item[0];

    if (deemph > 1)
        return -EINVAL;

    wm8960->deemph = deemph;

    return wm8960_set_deemph(codec);
}


/*
補充介紹:
DECLARE_TLV_DB_LINEAR(beep_tlv, -4500, 0);
DECLARE_TLV_DB_LINEAR宏定義的mixer control,它的輸出隨值的變化而線性變化。 該宏的:
第一個參數是要定義變量的名字,
第二個參數是最小值,以0.01dB為單位。
第三個參數是最大值,以0.01dB為單位。
如果該control處于最小值時會做出mute時,需要把第二個參數設為TLV_DB_GAIN_MUTE。

這兩個宏實際上就是定義一個整形數組,所謂tlv,就是Type-Lenght-Value的意思,數組的第0各
元素代表數據的類型,第1個元素代表數據的長度,第三個元素和之后的元素保存該變量的數據。

*/

/*這些定義的數組adc_tlv[]會被放在snd_kcontrol_new.tlv.p中,單位是db.

DECLARE_TLV_DB_SCALE宏定義的mixer control,它所代表的值按一個固定的dB值的步長變化。
該宏的:
第一個參數是要定義變量的名字,
第二個參數是最小值,以0.01dB為單位。
第三個參數是變化的步長,也是以0.01dB為單位。
如果該control處于最小值時會做出mute時,需要把第四個參數設為1。
*/
static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0);
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1);
static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0);
static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);


/*
 * 這些snd_kcontrol_new定義的控制項可以通過tinymix工具讀取出來,可供app設置.
 * 這些是沒有使用DAPM的kcontrol,對比SOC_SINGLE和SOC_DAPM_SINGLE可知其內部指定
 * 的回調函數不同。
*/
static const struct snd_kcontrol_new wm8960_snd_controls[] = {
SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL,
         0, 63, 0, adc_tlv),
SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL,
    6, 1, 0),
SOC_DOUBLE_R("Capture Switch", WM8960_LINVOL, WM8960_RINVOL,
    7, 1, 0),

SOC_DOUBLE_R_TLV("Playback Volume", WM8960_LDAC, WM8960_RDAC,
         0, 255, 0, dac_tlv),

SOC_DOUBLE_R_TLV("Headphone Playback Volume", WM8960_LOUT1, WM8960_ROUT1,
         0, 127, 0, out_tlv),
SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8960_LOUT1, WM8960_ROUT1,
    7, 1, 0),

SOC_DOUBLE_R_TLV("Speaker Playback Volume", WM8960_LOUT2, WM8960_ROUT2,
         0, 127, 0, out_tlv),
SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8960_LOUT2, WM8960_ROUT2,
    7, 1, 0),
SOC_SINGLE("Speaker DC Volume", WM8960_CLASSD3, 3, 5, 0),
SOC_SINGLE("Speaker AC Volume", WM8960_CLASSD3, 0, 5, 0),

SOC_SINGLE("PCM Playback -6dB Switch", WM8960_DACCTL1, 7, 1, 0),
SOC_ENUM("ADC Polarity", wm8960_enum[0]),
SOC_SINGLE("ADC High Pass Filter Switch", WM8960_DACCTL1, 0, 1, 0),

SOC_ENUM("DAC Polarity", wm8960_enum[2]),
SOC_SINGLE_BOOL_EXT("DAC Deemphasis Switch", 0,
            wm8960_get_deemph, wm8960_put_deemph),

SOC_ENUM("3D Filter Upper Cut-Off", wm8960_enum[2]),
SOC_ENUM("3D Filter Lower Cut-Off", wm8960_enum[3]),
SOC_SINGLE("3D Volume", WM8960_3D, 1, 15, 0),
SOC_SINGLE("3D Switch", WM8960_3D, 0, 1, 0),

SOC_ENUM("ALC Function", wm8960_enum[4]),
SOC_SINGLE("ALC Max Gain", WM8960_ALC1, 4, 7, 0),
SOC_SINGLE("ALC Target", WM8960_ALC1, 0, 15, 1),
SOC_SINGLE("ALC Min Gain", WM8960_ALC2, 4, 7, 0),
SOC_SINGLE("ALC Hold Time", WM8960_ALC2, 0, 15, 0),
SOC_ENUM("ALC Mode", wm8960_enum[5]),
SOC_SINGLE("ALC Decay", WM8960_ALC3, 4, 15, 0),
SOC_SINGLE("ALC Attack", WM8960_ALC3, 0, 15, 0),

SOC_SINGLE("Noise Gate Threshold", WM8960_NOISEG, 3, 31, 0),
SOC_SINGLE("Noise Gate Switch", WM8960_NOISEG, 0, 1, 0),

SOC_DOUBLE_R("ADC PCM Capture Volume", WM8960_LINPATH, WM8960_RINPATH,
    4, 3, 0),

SOC_SINGLE_TLV("Left Output Mixer Boost Bypass Volume",
           WM8960_BYPASS1, 4, 7, 1, bypass_tlv),
SOC_SINGLE_TLV("Left Output Mixer LINPUT3 Volume",
           WM8960_LOUTMIX, 4, 7, 1, bypass_tlv),
SOC_SINGLE_TLV("Right Output Mixer Boost Bypass Volume",
           WM8960_BYPASS2, 4, 7, 1, bypass_tlv),
SOC_SINGLE_TLV("Right Output Mixer RINPUT3 Volume",
           WM8960_ROUTMIX, 4, 7, 1, bypass_tlv),
};

/*
 * 宏中帶DAPM的表示是使用DAPM的kcontrol.
 *
 * dapm kcontrol的put回調函數不僅僅會更新控件本身的狀態,他還會把這種變化傳
 * 遞到相鄰的dapm kcontrol,相鄰的dapm kcontrol又會傳遞這個變化到他自己相鄰
 * 的dapm kcontrol,知道音頻路徑的末端,通過這種機制,只要改變其中一個widget
 * 的連接狀態,與之相關的所有widget都會被掃描并測試一下自身是否還在有效的音頻
 * 路徑中,從而可以動態地改變自身的電源狀態,這就是dapm的精髓所在。
 */
static const struct snd_kcontrol_new wm8960_lin_boost[] = {
SOC_DAPM_SINGLE("LINPUT2 Switch", WM8960_LINPATH, 6, 1, 0),
SOC_DAPM_SINGLE("LINPUT3 Switch", WM8960_LINPATH, 7, 1, 0),
SOC_DAPM_SINGLE("LINPUT1 Switch", WM8960_LINPATH, 8, 1, 0),
};

/*
 * snd_kcontrol_new是定義個控件
*/
static const struct snd_kcontrol_new wm8960_lin[] = {
SOC_DAPM_SINGLE("Boost Switch", WM8960_LINPATH, 3, 1, 0),
};

static const struct snd_kcontrol_new wm8960_rin_boost[] = {
SOC_DAPM_SINGLE("RINPUT2 Switch", WM8960_RINPATH, 6, 1, 0),
SOC_DAPM_SINGLE("RINPUT3 Switch", WM8960_RINPATH, 7, 1, 0),
SOC_DAPM_SINGLE("RINPUT1 Switch", WM8960_RINPATH, 8, 1, 0),
};

static const struct snd_kcontrol_new wm8960_rin[] = {
SOC_DAPM_SINGLE("Boost Switch", WM8960_RINPATH, 3, 1, 0),
};

static const struct snd_kcontrol_new wm8960_loutput_mixer[] = {
SOC_DAPM_SINGLE("PCM Playback Switch", WM8960_LOUTMIX, 8, 1, 0),
SOC_DAPM_SINGLE("LINPUT3 Switch", WM8960_LOUTMIX, 7, 1, 0),
SOC_DAPM_SINGLE("Boost Bypass Switch", WM8960_BYPASS1, 7, 1, 0),
};

static const struct snd_kcontrol_new wm8960_routput_mixer[] = {
SOC_DAPM_SINGLE("PCM Playback Switch", WM8960_ROUTMIX, 8, 1, 0),
SOC_DAPM_SINGLE("RINPUT3 Switch", WM8960_ROUTMIX, 7, 1, 0),
SOC_DAPM_SINGLE("Boost Bypass Switch", WM8960_BYPASS2, 7, 1, 0),
};

static const struct snd_kcontrol_new wm8960_mono_out[] = {
SOC_DAPM_SINGLE("Left Switch", WM8960_MONOMIX1, 7, 1, 0),
SOC_DAPM_SINGLE("Right Switch", WM8960_MONOMIX2, 7, 1, 0),
};


/*
不同的組件初始化的成員不同:
SND_SOC_DAPM_INPUT中沒有snd_kcontrol_new
SND_SOC_DAPM_MIXER中有多個snd_kcontrol_new

將上面定義的控件轉化為widget
*/
static const struct snd_soc_dapm_widget wm8960_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("LINPUT1"),
SND_SOC_DAPM_INPUT("RINPUT1"),
SND_SOC_DAPM_INPUT("LINPUT2"),
SND_SOC_DAPM_INPUT("RINPUT2"),
SND_SOC_DAPM_INPUT("LINPUT3"),
SND_SOC_DAPM_INPUT("RINPUT3"),

SND_SOC_DAPM_MICBIAS("MICB", WM8960_POWER1, 1, 0),

/*
 * 若arg2=SND_SOC_NOPM則表示此widget不具備電源屬性,但是mux的
 * 切換會影響到與之相連的其它具備電源屬性的電源狀態。
 */
SND_SOC_DAPM_MIXER("Left Boost Mixer", WM8960_POWER1, 5, 0,
           wm8960_lin_boost, ARRAY_SIZE(wm8960_lin_boost)),
SND_SOC_DAPM_MIXER("Right Boost Mixer", WM8960_POWER1, 4, 0,
           wm8960_rin_boost, ARRAY_SIZE(wm8960_rin_boost)),

SND_SOC_DAPM_MIXER("Left Input Mixer", WM8960_POWER3, 5, 0,
           wm8960_lin, ARRAY_SIZE(wm8960_lin)),
SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0,
           wm8960_rin, ARRAY_SIZE(wm8960_rin)),

SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER1, 3, 0),
SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER1, 2, 0),

SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0),
SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0),

SND_SOC_DAPM_MIXER("Left Output Mixer", WM8960_POWER3, 3, 0,
    &wm8960_loutput_mixer[0], ARRAY_SIZE(wm8960_loutput_mixer)),
SND_SOC_DAPM_MIXER("Right Output Mixer", WM8960_POWER3, 2, 0,
    &wm8960_routput_mixer[0], ARRAY_SIZE(wm8960_routput_mixer)),

SND_SOC_DAPM_PGA("LOUT1 PGA", WM8960_POWER2, 6, 0, NULL, 0),
SND_SOC_DAPM_PGA("ROUT1 PGA", WM8960_POWER2, 5, 0, NULL, 0),

SND_SOC_DAPM_PGA("Left Speaker PGA", WM8960_POWER2, 4, 0, NULL, 0),
SND_SOC_DAPM_PGA("Right Speaker PGA", WM8960_POWER2, 3, 0, NULL, 0),

SND_SOC_DAPM_PGA("Right Speaker Output", WM8960_CLASSD1, 7, 0, NULL, 0),
SND_SOC_DAPM_PGA("Left Speaker Output", WM8960_CLASSD1, 6, 0, NULL, 0),

SND_SOC_DAPM_OUTPUT("SPK_LP"),
SND_SOC_DAPM_OUTPUT("SPK_LN"),
SND_SOC_DAPM_OUTPUT("HP_L"),
SND_SOC_DAPM_OUTPUT("HP_R"),
SND_SOC_DAPM_OUTPUT("SPK_RP"),
SND_SOC_DAPM_OUTPUT("SPK_RN"),
SND_SOC_DAPM_OUTPUT("OUT3"),
};

static const struct snd_soc_dapm_widget wm8960_dapm_widgets_out3[] = {
SND_SOC_DAPM_MIXER("Mono Output Mixer", WM8960_POWER2, 1, 0,
    &wm8960_mono_out[0], ARRAY_SIZE(wm8960_mono_out)),
};

/* Represent OUT3 as a PGA so that it gets turned on with LOUT1/ROUT1 */
static const struct snd_soc_dapm_widget wm8960_dapm_widgets_capless[] = {
    SND_SOC_DAPM_PGA("OUT3 VMID", WM8960_POWER2, 1, 0, NULL, 0),
};

/*
route的source和sink成員都是widget的名字,control成員是兩個widget之間連接通過的開關
的snd_kcontrol, 若是兩個widget之間有開關,那么control成員就是這個開關的名字。若是沒
有開關而是直連的,那么control成員就設置為NULL,此時這個連接成為靜態連接。

route會被解析成path,使用snd_soc_dapm_path結構表示。

從這個結構體里面可以看出聲道的連接路由。

*/
static const struct snd_soc_dapm_route audio_paths[] = {
    { "Left Boost Mixer", "LINPUT1 Switch", "LINPUT1" },
    { "Left Boost Mixer", "LINPUT2 Switch", "LINPUT2" },
    { "Left Boost Mixer", "LINPUT3 Switch", "LINPUT3" },

    { "Left Input Mixer", "Boost Switch", "Left Boost Mixer", },
    { "Left Input Mixer", NULL, "LINPUT1", },  /* Really Boost Switch */
    { "Left Input Mixer", NULL, "LINPUT2" },
    { "Left Input Mixer", NULL, "LINPUT3" },

    { "Right Boost Mixer", "RINPUT1 Switch", "RINPUT1" },
    { "Right Boost Mixer", "RINPUT2 Switch", "RINPUT2" },
    { "Right Boost Mixer", "RINPUT3 Switch", "RINPUT3" },

    { "Right Input Mixer", "Boost Switch", "Right Boost Mixer", },
    { "Right Input Mixer", NULL, "RINPUT1", },  /* Really Boost Switch */
    { "Right Input Mixer", NULL, "RINPUT2" },
    { "Right Input Mixer", NULL, "LINPUT3" },

    { "Left ADC", NULL, "Left Input Mixer" },
    { "Right ADC", NULL, "Right Input Mixer" },

    { "Left Output Mixer", "LINPUT3 Switch", "LINPUT3" },
    { "Left Output Mixer", "Boost Bypass Switch", "Left Boost Mixer"} ,
    { "Left Output Mixer", "PCM Playback Switch", "Left DAC" },

    { "Right Output Mixer", "RINPUT3 Switch", "RINPUT3" },
    { "Right Output Mixer", "Boost Bypass Switch", "Right Boost Mixer" } ,
    { "Right Output Mixer", "PCM Playback Switch", "Right DAC" },

    { "LOUT1 PGA", NULL, "Left Output Mixer" },
    { "ROUT1 PGA", NULL, "Right Output Mixer" },

    { "HP_L", NULL, "LOUT1 PGA" },
    { "HP_R", NULL, "ROUT1 PGA" },

    { "Left Speaker PGA", NULL, "Left Output Mixer" },
    { "Right Speaker PGA", NULL, "Right Output Mixer" },

    { "Left Speaker Output", NULL, "Left Speaker PGA" },
    { "Right Speaker Output", NULL, "Right Speaker PGA" },

    { "SPK_LN", NULL, "Left Speaker Output" },
    { "SPK_LP", NULL, "Left Speaker Output" },
    { "SPK_RN", NULL, "Right Speaker Output" },
    { "SPK_RP", NULL, "Right Speaker Output" },
};

static const struct snd_soc_dapm_route audio_paths_out3[] = {
    { "Mono Output Mixer", "Left Switch", "Left Output Mixer" },
    { "Mono Output Mixer", "Right Switch", "Right Output Mixer" },

    { "OUT3", NULL, "Mono Output Mixer", }
};

static const struct snd_soc_dapm_route audio_paths_capless[] = {
    { "HP_L", NULL, "OUT3 VMID" },
    { "HP_R", NULL, "OUT3 VMID" },

    { "OUT3 VMID", NULL, "Left Output Mixer" },
    { "OUT3 VMID", NULL, "Right Output Mixer" },
};

static int wm8960_add_widgets(struct snd_soc_codec *codec)
{
    struct wm8960_data *pdata = codec->dev->platform_data;
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    struct snd_soc_dapm_context *dapm = &codec->dapm;
    struct snd_soc_dapm_widget *w;

    snd_soc_dapm_new_controls(dapm, wm8960_dapm_widgets, ARRAY_SIZE(wm8960_dapm_widgets));

    snd_soc_dapm_add_routes(dapm, audio_paths, ARRAY_SIZE(audio_paths));

    /* In capless mode OUT3 is used to provide VMID for the
     * headphone outputs, otherwise it is used as a mono mixer.
     */
    if (pdata && pdata->capless) {
        snd_soc_dapm_new_controls(dapm, wm8960_dapm_widgets_capless,
                      ARRAY_SIZE(wm8960_dapm_widgets_capless));

        snd_soc_dapm_add_routes(dapm, audio_paths_capless,
                    ARRAY_SIZE(audio_paths_capless));
    } else {
        snd_soc_dapm_new_controls(dapm, wm8960_dapm_widgets_out3,
                      ARRAY_SIZE(wm8960_dapm_widgets_out3));

        snd_soc_dapm_add_routes(dapm, audio_paths_out3,
                    ARRAY_SIZE(audio_paths_out3));
    }

    /* We need to power up the headphone output stage out of
     * sequence for capless mode.  To save scanning the widget
     * list each time to find the desired power state do so now
     * and save the result.
     */
    list_for_each_entry(w, &codec->card->widgets, list) {
        if (w->dapm != &codec->dapm)
            continue;
        if (strcmp(w->name, "LOUT1 PGA") == 0)
            wm8960->lout1 = w;
        if (strcmp(w->name, "ROUT1 PGA") == 0)
            wm8960->rout1 = w;
        if (strcmp(w->name, "OUT3 VMID") == 0)
            wm8960->out3 = w;
    }

    return 0;
}

static int wm8960_set_dai_fmt(struct snd_soc_dai *codec_dai,
        unsigned int fmt)
{
    struct snd_soc_codec *codec = codec_dai->codec;
    u16 iface = 0;

    /* set master/slave audio interface */
    switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    case SND_SOC_DAIFMT_CBM_CFM:
        iface |= 0x0040;
        break;
    case SND_SOC_DAIFMT_CBS_CFS:
        break;
    default:
        return -EINVAL;
    }

    /* interface format */
    switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    case SND_SOC_DAIFMT_I2S:
        iface |= 0x0002;
        break;
    case SND_SOC_DAIFMT_RIGHT_J:
        break;
    case SND_SOC_DAIFMT_LEFT_J:
        iface |= 0x0001;
        break;
    case SND_SOC_DAIFMT_DSP_A:
        iface |= 0x0003;
        break;
    case SND_SOC_DAIFMT_DSP_B:
        iface |= 0x0013;
        break;
    default:
        return -EINVAL;
    }

    /* clock inversion */
    switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
    case SND_SOC_DAIFMT_NB_NF:
        break;
    case SND_SOC_DAIFMT_IB_IF:
        iface |= 0x0090;
        break;
    case SND_SOC_DAIFMT_IB_NF:
        iface |= 0x0080;
        break;
    case SND_SOC_DAIFMT_NB_IF:
        iface |= 0x0010;
        break;
    default:
        return -EINVAL;
    }

    /* set iface */
    snd_soc_write(codec, WM8960_IFACE1, iface);
    return 0;
}

static struct {
    int rate;
    unsigned int val;
} alc_rates[] = {
    { 48000, 0 },
    { 44100, 0 },
    { 32000, 1 },
    { 22050, 2 },
    { 24000, 2 },
    { 16000, 3 },
    { 11250, 4 },
    { 12000, 4 },
    {  8000, 5 },
};


/*這個params從何而來???*/
static int wm8960_hw_params(struct snd_pcm_substream *substream,
                struct snd_pcm_hw_params *params,
                struct snd_soc_dai *dai)
{
    struct snd_soc_pcm_runtime *rtd = substream->private_data;
    struct snd_soc_codec *codec = rtd->codec;
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3;
    int i;

    /* bit size */
    switch (params_format(params)) {
    case SNDRV_PCM_FORMAT_S16_LE:
        break;
    case SNDRV_PCM_FORMAT_S20_3LE:
        iface |= 0x0004;
        break;
    case SNDRV_PCM_FORMAT_S24_LE:
        iface |= 0x0008;
        break;
    }

    /* Update filters for the new rate */
    if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
        wm8960->playback_fs = params_rate(params);
        wm8960_set_deemph(codec);
    } else {
        for (i = 0; i < ARRAY_SIZE(alc_rates); i++)
            if (alc_rates[i].rate == params_rate(params))
                snd_soc_update_bits(codec,
                            WM8960_ADDCTL3, 0x7,
                            alc_rates[i].val);
    }

    /* set iface */
    snd_soc_write(codec, WM8960_IFACE1, iface);
    return 0;
}

static int wm8960_mute(struct snd_soc_dai *dai, int mute)
{
    struct snd_soc_codec *codec = dai->codec;
    u16 mute_reg = snd_soc_read(codec, WM8960_DACCTL1) & 0xfff7;

    if (mute)
        snd_soc_write(codec, WM8960_DACCTL1, mute_reg | 0x8);
    else
        snd_soc_write(codec, WM8960_DACCTL1, mute_reg);
    return 0;
}

static int wm8960_set_bias_level_out3(struct snd_soc_codec *codec,
                      enum snd_soc_bias_level level)
{
    u16 reg;

    switch (level) {
    case SND_SOC_BIAS_ON:
        break;

    case SND_SOC_BIAS_PREPARE:
        /* Set VMID to 2x50k */
        reg = snd_soc_read(codec, WM8960_POWER1);
        reg &= ~0x180;
        reg |= 0x80;
        snd_soc_write(codec, WM8960_POWER1, reg);
        break;

    case SND_SOC_BIAS_STANDBY:
        if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
            /* Enable anti-pop features */
            snd_soc_write(codec, WM8960_APOP1,
                      WM8960_POBCTRL | WM8960_SOFT_ST |
                      WM8960_BUFDCOPEN | WM8960_BUFIOEN);

            /* Enable & ramp VMID at 2x50k */
            reg = snd_soc_read(codec, WM8960_POWER1);
            reg |= 0x80;
            snd_soc_write(codec, WM8960_POWER1, reg);
            msleep(100);

            /* Enable VREF */
            snd_soc_write(codec, WM8960_POWER1, reg | WM8960_VREF);

            /* Disable anti-pop features */
            snd_soc_write(codec, WM8960_APOP1, WM8960_BUFIOEN);
        }

        /* Set VMID to 2x250k */
        reg = snd_soc_read(codec, WM8960_POWER1);
        reg &= ~0x180;
        reg |= 0x100;
        snd_soc_write(codec, WM8960_POWER1, reg);
        break;

    case SND_SOC_BIAS_OFF:
        /* Enable anti-pop features */
        snd_soc_write(codec, WM8960_APOP1,
                 WM8960_POBCTRL | WM8960_SOFT_ST |
                 WM8960_BUFDCOPEN | WM8960_BUFIOEN);

        /* Disable VMID and VREF, let them discharge */
        snd_soc_write(codec, WM8960_POWER1, 0);
        msleep(600);
        break;
    }

    codec->dapm.bias_level = level;

    return 0;
}

static int wm8960_set_bias_level_capless(struct snd_soc_codec *codec,
                     enum snd_soc_bias_level level)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    int reg;

    switch (level) {
    case SND_SOC_BIAS_ON:
        break;

    case SND_SOC_BIAS_PREPARE:
        switch (codec->dapm.bias_level) {
        case SND_SOC_BIAS_STANDBY:
            /* Enable anti pop mode */
            snd_soc_update_bits(codec, WM8960_APOP1,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN);

            /* Enable LOUT1, ROUT1 and OUT3 if they're enabled */
            reg = 0;
            if (wm8960->lout1 && wm8960->lout1->power)
                reg |= WM8960_PWR2_LOUT1;
            if (wm8960->rout1 && wm8960->rout1->power)
                reg |= WM8960_PWR2_ROUT1;
            if (wm8960->out3 && wm8960->out3->power)
                reg |= WM8960_PWR2_OUT3;
            snd_soc_update_bits(codec, WM8960_POWER2,
                        WM8960_PWR2_LOUT1 |
                        WM8960_PWR2_ROUT1 |
                        WM8960_PWR2_OUT3, reg);

            /* Enable VMID at 2*50k */
            snd_soc_update_bits(codec, WM8960_POWER1,
                        WM8960_VMID_MASK, 0x80);

            /* Ramp */
            msleep(100);

            /* Enable VREF */
            snd_soc_update_bits(codec, WM8960_POWER1,
                        WM8960_VREF, WM8960_VREF);

            msleep(100);
            break;

        case SND_SOC_BIAS_ON:
            /* Enable anti-pop mode */
            snd_soc_update_bits(codec, WM8960_APOP1,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN);

            /* Disable VMID and VREF */
            snd_soc_update_bits(codec, WM8960_POWER1,
                        WM8960_VREF | WM8960_VMID_MASK, 0);
            break;

        default:
            break;
        }
        break;

    case SND_SOC_BIAS_STANDBY:
        switch (codec->dapm.bias_level) {
        case SND_SOC_BIAS_PREPARE:
            /* Disable HP discharge */
            snd_soc_update_bits(codec, WM8960_APOP2,
                        WM8960_DISOP | WM8960_DRES_MASK,
                        0);

            /* Disable anti-pop features */
            snd_soc_update_bits(codec, WM8960_APOP1,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN,
                        WM8960_POBCTRL | WM8960_SOFT_ST |
                        WM8960_BUFDCOPEN);
            break;

        default:
            break;
        }
        break;

    case SND_SOC_BIAS_OFF:
        break;
    }

    codec->dapm.bias_level = level;

    return 0;
}

/* PLL divisors */
struct _pll_div {
    u32 pre_div:1;
    u32 n:4;
    u32 k:24;
};

/* The size in bits of the pll divide multiplied by 10
 * to allow rounding later */
#define FIXED_PLL_SIZE ((1 << 24) * 10)

static int pll_factors(unsigned int source, unsigned int target,
               struct _pll_div *pll_div)
{
    unsigned long long Kpart;
    unsigned int K, Ndiv, Nmod;

    pr_debug("WM8960 PLL: setting %dHz->%dHz
", source, target);

    /* Scale up target to PLL operating frequency */
    target *= 4;

    Ndiv = target / source;
    if (Ndiv < 6) {
        source >>= 1;
        pll_div->pre_div = 1;
        Ndiv = target / source;
    } else
        pll_div->pre_div = 0;

    if ((Ndiv < 6) || (Ndiv > 12)) {
        pr_err("WM8960 PLL: Unsupported N=%d
", Ndiv);
        return -EINVAL;
    }

    pll_div->n = Ndiv;
    Nmod = target % source;
    Kpart = FIXED_PLL_SIZE * (long long)Nmod;

    do_div(Kpart, source);

    K = Kpart & 0xFFFFFFFF;

    /* Check if we need to round */
    if ((K % 10) >= 5)
        K += 5;

    /* Move down to proper range now rounding is done */
    K /= 10;

    pll_div->k = K;

    pr_debug("WM8960 PLL: N=%x K=%x pre_div=%d
",
         pll_div->n, pll_div->k, pll_div->pre_div);

    return 0;
}

static int wm8960_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
        int source, unsigned int freq_in, unsigned int freq_out)
{
    struct snd_soc_codec *codec = codec_dai->codec;
    u16 reg;
    static struct _pll_div pll_div;
    int ret;

    if (freq_in && freq_out) {
        ret = pll_factors(freq_in, freq_out, &pll_div);
        if (ret != 0)
            return ret;
    }

    /* Disable the PLL: even if we are changing the frequency the
     * PLL needs to be disabled while we do so. */
    snd_soc_write(codec, WM8960_CLOCK1,
             snd_soc_read(codec, WM8960_CLOCK1) & ~1);
    snd_soc_write(codec, WM8960_POWER2,
             snd_soc_read(codec, WM8960_POWER2) & ~1);

    if (!freq_in || !freq_out)
        return 0;

    reg = snd_soc_read(codec, WM8960_PLL1) & ~0x3f;
    reg |= pll_div.pre_div << 4;
    reg |= pll_div.n;

    if (pll_div.k) {
        reg |= 0x20;

        snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 18) & 0x3f);
        snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 9) & 0x1ff);
        snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0x1ff);
    }
    snd_soc_write(codec, WM8960_PLL1, reg);

    /* Turn it on */
    snd_soc_write(codec, WM8960_POWER2,
             snd_soc_read(codec, WM8960_POWER2) | 1);
    msleep(250);
    snd_soc_write(codec, WM8960_CLOCK1,
             snd_soc_read(codec, WM8960_CLOCK1) | 1);

    return 0;
}

static int wm8960_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
        int div_id, int div)
{
    struct snd_soc_codec *codec = codec_dai->codec;
    u16 reg;

    switch (div_id) {
    case WM8960_SYSCLKDIV:
        reg = snd_soc_read(codec, WM8960_CLOCK1) & 0x1f9;
        snd_soc_write(codec, WM8960_CLOCK1, reg | div);
        break;
    case WM8960_DACDIV:
        reg = snd_soc_read(codec, WM8960_CLOCK1) & 0x1c7;
        snd_soc_write(codec, WM8960_CLOCK1, reg | div);
        break;
    case WM8960_OPCLKDIV:
        reg = snd_soc_read(codec, WM8960_PLL1) & 0x03f;
        snd_soc_write(codec, WM8960_PLL1, reg | div);
        break;
    case WM8960_DCLKDIV:
        reg = snd_soc_read(codec, WM8960_CLOCK2) & 0x03f;
        snd_soc_write(codec, WM8960_CLOCK2, reg | div);
        break;
    case WM8960_TOCLKSEL:
        reg = snd_soc_read(codec, WM8960_ADDCTL1) & 0x1fd;
        snd_soc_write(codec, WM8960_ADDCTL1, reg | div);
        break;
    default:
        return -EINVAL;
    }

    return 0;
}

static int wm8960_set_bias_level(struct snd_soc_codec *codec,
                 enum snd_soc_bias_level level)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);

    return wm8960->set_bias_level(codec, level);
}

#define WM8960_RATES SNDRV_PCM_RATE_8000_48000

#define WM8960_FORMATS 
    (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | 
    SNDRV_PCM_FMTBIT_S24_LE)

static struct snd_soc_dai_ops wm8960_dai_ops = {
    .hw_params = wm8960_hw_params,
    .digital_mute = wm8960_mute,
    .set_fmt = wm8960_set_dai_fmt,
    .set_clkdiv = wm8960_set_dai_clkdiv,
    .set_pll = wm8960_set_dai_pll,
};

/*這個是dai接口的驅動*/
static struct snd_soc_dai_driver wm8960_dai = {
    /*
     * 這個name會傳遞給snd_soc_codec.name, 后者會和
     * codec_conf->dev_name匹配
     */
    .name = "wm8960-hifi",
    .playback = {
        .stream_name = "Playback",
        .channels_min = 1,
        .channels_max = 2,
        .rates = WM8960_RATES,
        .formats = WM8960_FORMATS,},
    .capture = {
        .stream_name = "Capture",
        .channels_min = 1,
        .channels_max = 2,
        .rates = WM8960_RATES,
        .formats = WM8960_FORMATS,},
    .ops = &wm8960_dai_ops,
    .symmetric_rates = 1,
};

static int wm8960_suspend(struct snd_soc_codec *codec, pm_message_t state)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);

    wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF);
    return 0;
}

static int wm8960_resume(struct snd_soc_codec *codec)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    int i;
    u8 data[2];
    u16 *cache = codec->reg_cache;

    /* Sync reg_cache with the hardware */
    for (i = 0; i < ARRAY_SIZE(wm8960_reg); i++) {
        data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
        data[1] = cache[i] & 0x00ff;
        codec->hw_write(codec->control_data, data, 2);
    }

    wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
    return 0;
}

static int wm8960_probe(struct snd_soc_codec *codec)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
    struct wm8960_data *pdata = dev_get_platdata(codec->dev);
    int ret;
    u16 reg;

    wm8960->set_bias_level = wm8960_set_bias_level_out3;
    codec->control_data = wm8960->control_data;

    if (!pdata) {
        dev_warn(codec->dev, "No platform data supplied
");
    } else {
        if (pdata->dres > WM8960_DRES_MAX) {
            dev_err(codec->dev, "Invalid DRES: %d
", pdata->dres);
            pdata->dres = 0;
        }

        if (pdata->capless)
            wm8960->set_bias_level = wm8960_set_bias_level_capless;
    }

    /*選中codec的控制接口*/
    ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8960->control_type);
    if (ret < 0) {
        dev_err(codec->dev, "Failed to set cache I/O: %d
", ret);
        return ret;
    }

    ret = wm8960_reset(codec);
    if (ret < 0) {
        dev_err(codec->dev, "Failed to issue reset
");
        return ret;
    }

    wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);

    /*對芯片寄存器進行初始化*/
    /* Latch the update bits */
    reg = snd_soc_read(codec, WM8960_LINVOL);
    snd_soc_write(codec, WM8960_LINVOL, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_RINVOL);
    snd_soc_write(codec, WM8960_RINVOL, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_LADC);
    snd_soc_write(codec, WM8960_LADC, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_RADC);
    snd_soc_write(codec, WM8960_RADC, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_LDAC);
    snd_soc_write(codec, WM8960_LDAC, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_RDAC);
    snd_soc_write(codec, WM8960_RDAC, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_LOUT1);
    snd_soc_write(codec, WM8960_LOUT1, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_ROUT1);
    snd_soc_write(codec, WM8960_ROUT1, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_LOUT2);
    snd_soc_write(codec, WM8960_LOUT2, reg | 0x100);
    reg = snd_soc_read(codec, WM8960_ROUT2);
    snd_soc_write(codec, WM8960_ROUT2, reg | 0x100);

    /* 如果不想每次上電錄音之前都要執行這些命令, 就在此設置寄存器:
     * tinymix "Capture Switch" 0
     * tinymix "Left Input Mixer Boost Switch" 1
     */
    /* Capture Switch off  */
    snd_soc_update_bits(codec, WM8960_LINVOL, (1<<7), (0<<7));

    /* Left Input Mixer Boost Switch */
    snd_soc_update_bits(codec, WM8960_LINPATH, (1<<3), (1<<3));

    /*初始化controls和widgets*/
    snd_soc_add_controls(codec, wm8960_snd_controls,
                     ARRAY_SIZE(wm8960_snd_controls));
    wm8960_add_widgets(codec);

    return 0;
}

/* power down chip */
static int wm8960_remove(struct snd_soc_codec *codec)
{
    struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);

    wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF);
    return 0;
}


/*這個是codec芯片的驅動*/
static struct snd_soc_codec_driver soc_codec_dev_wm8960 = {
    .probe =    wm8960_probe,
    .remove =    wm8960_remove,
    .suspend =    wm8960_suspend,
    .resume =    wm8960_resume,
    .set_bias_level = wm8960_set_bias_level,
    .reg_cache_size = ARRAY_SIZE(wm8960_reg),
    .reg_word_size = sizeof(u16),
    .reg_cache_default = wm8960_reg,
};

/*這是主機i2c控制接口的驅動*/
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
                      const struct i2c_device_id *id)
{
    struct wm8960_priv *wm8960;
    int ret;

    wm8960 = kzalloc(sizeof(struct wm8960_priv), GFP_KERNEL);
    if (wm8960 == NULL)
        return -ENOMEM;

    i2c_set_clientdata(i2c, wm8960);
    /*指定對codec芯片的控制接口是i2c*/
    wm8960->control_type = SND_SOC_I2C;
    wm8960->control_data = i2c;

    /*
     * 注冊一個codec需要提供snd_soc_codec_driver和snd_soc_dai_driver
     * 同時可以有多個dai
     * 這個函數內部會實例化一個snd_soc_codec,若全局鏈表上有數據還會去實例化
     * 一個snd_soc_card(這個結構在其它地方也能實例化)
    */
    ret = snd_soc_register_codec(&i2c->dev,
            &soc_codec_dev_wm8960, &wm8960_dai, 1);
    if (ret < 0)
        kfree(wm8960);
    return ret;
}

static __devexit int wm8960_i2c_remove(struct i2c_client *client)
{
    snd_soc_unregister_codec(&client->dev);
    kfree(i2c_get_clientdata(client));
    return 0;
}

/*設備端在mach-tiny4412.c中定義*/
static const struct i2c_device_id wm8960_i2c_id[] = {
    { "wm8960", 0 },
    { }
};
MODULE_DEVICE_TABLE(i2c, wm8960_i2c_id);

/*它是怎么通過名字匹配到設備的呢?*/
static struct i2c_driver wm8960_i2c_driver = {
    .driver = {
        .name = "wm8960-codec",
        .owner = THIS_MODULE,
    },
    .probe =    wm8960_i2c_probe,
    .remove =   __devexit_p(wm8960_i2c_remove),
    .id_table = wm8960_i2c_id,
};
#endif

static int __init wm8960_modinit(void)
{
    int ret = 0;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
    ret = i2c_add_driver(&wm8960_i2c_driver);
    if (ret != 0) {
        printk(KERN_ERR "Failed to register WM8960 I2C driver: %d
",
               ret);
    }
#endif
    return ret;
}
module_init(wm8960_modinit);

static void __exit wm8960_exit(void)
{
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
    i2c_del_driver(&wm8960_i2c_driver);
#endif
}
module_exit(wm8960_exit);

MODULE_DESCRIPTION("ASoC WM8960 driver");
MODULE_AUTHOR("Liam Girdwood");
MODULE_LICENSE("GPL");

View Code

(2) Machine平臺設備驅動設備端(驅動端是: sound/soc/soc-core.c)

#include <linux/clk.h>
#include <linux/gpio.h>
#include <linux/module.h>

#include <sound/soc.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>

#include "i2s.h"

static int set_epll_rate(unsigned long rate)
{
    struct clk *fout_epll;

    fout_epll = clk_get(NULL, "fout_epll");
    if (IS_ERR(fout_epll)) {
        printk(KERN_ERR "%s: failed to get fout_epll
", __func__);
        return PTR_ERR(fout_epll);
    }

    if (rate == clk_get_rate(fout_epll))
        goto out;

    clk_set_rate(fout_epll, rate);
out:
    clk_put(fout_epll);

    return 0;
}

/*
RFS:IIS Root clk freq select,
BFS:bit clock freq select

*/
static int smdk_hw_params(struct snd_pcm_substream *substream,
    struct snd_pcm_hw_params *params)
{
    struct snd_soc_pcm_runtime *rtd = substream->private_data;
    struct snd_soc_dai *codec_dai = rtd->codec_dai;
    struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
    int bfs, psr, rfs, ret;
    unsigned long rclk;

    switch (params_format(params)) {
    case SNDRV_PCM_FORMAT_U24:
    case SNDRV_PCM_FORMAT_S24:
        bfs = 48;
        break;
    case SNDRV_PCM_FORMAT_U16_LE:
    case SNDRV_PCM_FORMAT_S16_LE:
        bfs = 32;
        break;
    default:
        return -EINVAL;
    }

    switch (params_rate(params)) {
    case 16000:
    case 22050:
    case 24000:
    case 32000:
    case 44100:
    case 48000:
    case 88200:
    case 96000:
        if (bfs == 48)
            rfs = 384; /*rfs=bfs*8*/
        else
            rfs = 256;
        break;
    case 64000:
        rfs = 384;
        break;
    case 8000:
    case 11025:
    case 12000:
        if (bfs == 48)
            rfs = 768;
        else
            rfs = 512;
        break;
    default:
        return -EINVAL;
    }

    rclk = params_rate(params) * rfs;

    switch (rclk) {
    case 4096000:
    case 5644800:
    case 6144000:
    case 8467200:
    case 9216000:
        psr = 8;
        break;
    case 8192000:
    case 11289600:
    case 12288000:
    case 16934400:
    case 18432000:
        psr = 4;
        break;
    case 22579200:
    case 24576000:
    case 33868800:
    case 36864000:
        psr = 2;
        break;
    case 67737600:
    case 73728000:
        psr = 1;
        break;
    default:
        printk("Not yet supported!
");
        return -EINVAL;
    }

    set_epll_rate(rclk * psr);

    /*調用platform驅動中的dai驅動的函數*/
    ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
                    | SND_SOC_DAIFMT_NB_NF
                    | SND_SOC_DAIFMT_CBS_CFS);
    if (ret < 0)
        return ret;

    ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
                    | SND_SOC_DAIFMT_NB_NF
                    | SND_SOC_DAIFMT_CBS_CFS);
    if (ret < 0)
        return ret;


    ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_CDCLK,
                    0, SND_SOC_CLOCK_OUT);
    if (ret < 0)
        return ret;

    ret = snd_soc_dai_set_clkdiv(cpu_dai, SAMSUNG_I2S_DIV_BCLK, bfs);
    if (ret < 0)
        return ret;

    return 0;
}


/* 參考soundsocsamsungs3c24xx_uda134x.c
 */

/*
 * 1. 分配注冊一個名為soc-audio的平臺設備
 * 2. 這個平臺設備有一個私有數據 snd_soc_card
 *    snd_soc_card里有一項snd_soc_dai_link
 *    snd_soc_dai_link被用來決定ASOC各部分的驅動
 */

static struct snd_soc_ops tiny4412_wm8960_ops = {
    /*這里面指定的params從哪里來????*/
    .hw_params = smdk_hw_params,
};

/*

#define SND_SOC_DAPM_MIC(wname, wevent)
{
    .id = snd_soc_dapm_mic,
    .name = "Mic Onboard",
    .kcontrol_news = NULL,
    .num_kcontrols = 0,
    .reg = SND_SOC_NOPM,
    .event = NULL,
    .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD

    關系的dapm事件:
    SND_SOC_DAPM_PRE_PMU: widget要上電前發出的事件
    SND_SOC_DAPM_POST_PMD: widget要下電后發出的事件
}

這也是一條輸入line的一部分,但是由于是板級的,所以寫在這個文件中.

處理單板上的widget,定義的虛擬widget
*/
static const struct snd_soc_dapm_widget tiny4412_wm8960_widgets[] = {
    SND_SOC_DAPM_MIC("Mic Onboard", NULL),
};

static const struct snd_soc_dapm_route tiny4412_wm8960_paths[] = {
    { "MICB", NULL, "Mic Onboard" },
    { "LINPUT1", NULL, "MICB" },
};

static int tiny4412_wm8960_machine_init(struct snd_soc_pcm_runtime *rtd)
{
    struct snd_soc_codec *codec = rtd->codec;
    struct snd_soc_dapm_context *dapm = &codec->dapm;

    /* 添加一個虛擬的MIC widget */
    snd_soc_dapm_new_controls(dapm, tiny4412_wm8960_widgets,
                  ARRAY_SIZE(tiny4412_wm8960_widgets));

    /* 添加2個route */
    snd_soc_dapm_add_routes(dapm, tiny4412_wm8960_paths, ARRAY_SIZE(tiny4412_wm8960_paths));

#define WM8960_IFACE2        0x9
    //設置Pin15(ADCLRC/GPIO)為GPIO ,如果不設置而且Pin15上又沒有外部時鐘則ADC 工作異常
    snd_soc_update_bits(codec, WM8960_IFACE2, 0x40, 0x40);


    snd_soc_dapm_sync(dapm);

    return 0;
}


/*
 * snd_soc_dai_link被用來決定ASOC各部分的驅動。
 * 通過名字的匹配過程是在soc_bind_dai_link()中完成的。
 */
static struct snd_soc_dai_link tiny4412_wm8960_dai_link = {
    /*這兩個名字不用與匹配信息*/
    .name = "NAME_UDA8960",
    .stream_name = "STREAM_NAME_UDA8960",

    /*
     * "wm8960-codec.0-001a"這個名字來自codec驅動,分為2部分,
     * wm8960-codec是在wm8960.c中指定的i2c驅動的名字,0-001a是i2c
     * 設備的設備地址,組合起來稱為snd_soc_codec->name。
     * 這個是用來匹配wm8960這個codec驅動的。
     */
    .codec_name = "wm8960-codec.0-001a",
    /*
     * 這個名字用于匹配wm8960.c中注冊的dai,而這個codec的dai的name
     * 來自snd_soc_dai_driver->name, 因此指定為codec中注冊的
     * snd_soc_dai_driver中的name就可以了。
     * 作用: 用于匹配codec中的哪個codec_dai
     */
    .codec_dai_name = "wm8960-hifi",
    /*
     * 這個名字用于和soundsocsamsungI2s.c中使用snd_soc_register_dai注冊的dai_name
     * 匹配上才行, 應該用于Soc與Codec之間通信的接口的選擇。
     *
     * codec_dai和cpu_dai都確定下來了,那么一條dai連接就確定下來了。
     */
    .cpu_dai_name = "samsung-i2s.0",
    .ops = &tiny4412_wm8960_ops,
    /*
     * 用于選擇使用哪個platform(Soc相關)驅動,指定這個名字是要求
     * 使用soundsocsamsungdma.c中注冊的snd_soc_platform
     * 一個Soc可能注冊了多個snd_soc_platform,這個用于選擇使用哪個。
     */
    .platform_name    = "samsung-audio",
    .init = tiny4412_wm8960_machine_init,
};


static struct snd_soc_card myalsa_card = {
    /*這里面的幾個名字又該如何賦值????*/
    /*這個名字去掉"_"顯示在//sys/devices/platform/soc-audio/sound/card0/id中*/
    .name = "TINY4412_UDA8960",
    .owner = THIS_MODULE,
    /*
     * 這里dai_link其實是個數組,num_links是數組項個數,
     * 這里只有1項,就直接當指針使用了。
     */
    .dai_link = &tiny4412_wm8960_dai_link,
    .num_links = 1,
};

static void asoc_release(struct device * dev)
{
}

/*
 * 驅動端:/sound/soc/soc-core.c, 驅動已經在core中抽象出來了。
 *
 * 注冊成平臺設備,snd_soc_card最為平臺設備的data,在平臺設備
 * 的驅動端soc-core.c注冊。
 */
static struct platform_device asoc_dev = {
    /*通過這個名字匹配驅動soc-core.c,公有的驅動*/
    .name    = "soc-audio",
    .id     = -1,
    .dev = {
        .release = asoc_release,
    },
};

static int tiny4412_wm8960_init(void)
{
    platform_set_drvdata(&asoc_dev, &myalsa_card);
    platform_device_register(&asoc_dev);
    return 0;
}

static void tiny4412_wm8960_exit(void)
{
    platform_device_unregister(&asoc_dev);
}

module_init(tiny4412_wm8960_init);
module_exit(tiny4412_wm8960_exit);

MODULE_LICENSE("GPL");

View Code

總結

以上是生活随笔為你收集整理的Android音频(4)——音频驱动实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

好爽又高潮了毛片免费下载 | 久久99精品国产.久久久久 | 久久精品国产日本波多野结衣 | 欧美真人作爱免费视频 | 激情爆乳一区二区三区 | 中文亚洲成a人片在线观看 | 国产成人人人97超碰超爽8 | 亚洲人交乣女bbw | 成人一在线视频日韩国产 | 动漫av网站免费观看 | 国产香蕉尹人视频在线 | 蜜桃无码一区二区三区 | 女人被男人爽到呻吟的视频 | av无码久久久久不卡免费网站 | 成年美女黄网站色大免费全看 | 国产成人一区二区三区别 | 97人妻精品一区二区三区 | 精品国产青草久久久久福利 | 日本一区二区更新不卡 | 亚洲精品一区二区三区在线 | 久久精品国产99精品亚洲 | 日本丰满护士爆乳xxxx | 国产成人无码专区 | 55夜色66夜色国产精品视频 | 3d动漫精品啪啪一区二区中 | 久久人人爽人人爽人人片av高清 | 最近中文2019字幕第二页 | 久久精品人人做人人综合试看 | 色欲人妻aaaaaaa无码 | 99久久人妻精品免费一区 | 国产卡一卡二卡三 | 天天做天天爱天天爽综合网 | 乌克兰少妇xxxx做受 | 国产婷婷色一区二区三区在线 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美 日韩 人妻 高清 中文 | 国产欧美亚洲精品a | 丰腴饱满的极品熟妇 | 久久久中文久久久无码 | 亚洲国产精品毛片av不卡在线 | 日韩在线不卡免费视频一区 | 亚洲熟妇色xxxxx亚洲 | 真人与拘做受免费视频 | 国产成人无码av一区二区 | 领导边摸边吃奶边做爽在线观看 | 2019午夜福利不卡片在线 | 亚洲色大成网站www | 永久黄网站色视频免费直播 | 少妇人妻av毛片在线看 | 免费乱码人妻系列无码专区 | 樱花草在线播放免费中文 | 欧美大屁股xxxxhd黑色 | 亚洲七七久久桃花影院 | 性色av无码免费一区二区三区 | 国产成人精品优优av | 亚洲色在线无码国产精品不卡 | 对白脏话肉麻粗话av | 亚洲精品成人av在线 | 国产亚洲精品久久久闺蜜 | 中文字幕乱码人妻无码久久 | 精品夜夜澡人妻无码av蜜桃 | 亚洲一区二区三区播放 | 国产av剧情md精品麻豆 | 久久天天躁狠狠躁夜夜免费观看 | 中文字幕日韩精品一区二区三区 | 又大又硬又爽免费视频 | 999久久久国产精品消防器材 | 人人超人人超碰超国产 | 97精品国产97久久久久久免费 | 亚洲国产精品一区二区美利坚 | 红桃av一区二区三区在线无码av | 久久亚洲日韩精品一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 曰本女人与公拘交酡免费视频 | 久久久中文久久久无码 | 国产精品久久久久9999小说 | 18黄暴禁片在线观看 | 久久久久久亚洲精品a片成人 | 欧美日韩精品 | 亚洲人亚洲人成电影网站色 | 精品久久久无码人妻字幂 | 人妻夜夜爽天天爽三区 | 大肉大捧一进一出视频出来呀 | 国产午夜视频在线观看 | 国产高清不卡无码视频 | 中文字幕人妻无码一区二区三区 | 两性色午夜视频免费播放 | 欧美乱妇无乱码大黄a片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 色婷婷久久一区二区三区麻豆 | 日本丰满护士爆乳xxxx | 搡女人真爽免费视频大全 | 狠狠色丁香久久婷婷综合五月 | 中文亚洲成a人片在线观看 | 俺去俺来也在线www色官网 | 国产成人综合美国十次 | 亚洲国产午夜精品理论片 | 老头边吃奶边弄进去呻吟 | 国产麻豆精品一区二区三区v视界 | 十八禁视频网站在线观看 | 日韩精品无码免费一区二区三区 | 亚洲一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 欧美 日韩 亚洲 在线 | 欧美肥老太牲交大战 | 亚洲一区二区三区国产精华液 | 国产人妻大战黑人第1集 | 国产一区二区三区日韩精品 | 久9re热视频这里只有精品 | 日日夜夜撸啊撸 | 人妻体内射精一区二区三四 | 丰满肥臀大屁股熟妇激情视频 | 欧美 丝袜 自拍 制服 另类 | 男女爱爱好爽视频免费看 | 免费看少妇作爱视频 | 国产精品99久久精品爆乳 | 未满成年国产在线观看 | 日本又色又爽又黄的a片18禁 | 色婷婷综合激情综在线播放 | 国产av人人夜夜澡人人爽麻豆 | 伊人久久大香线蕉av一区二区 | 熟妇人妻中文av无码 | 搡女人真爽免费视频大全 | 国产高潮视频在线观看 | 久久综合网欧美色妞网 | 色诱久久久久综合网ywww | 国产精品亚洲а∨无码播放麻豆 | 国产午夜精品一区二区三区嫩草 | 初尝人妻少妇中文字幕 | 大色综合色综合网站 | 娇妻被黑人粗大高潮白浆 | 中文字幕无码免费久久9一区9 | 老司机亚洲精品影院无码 | 国产在热线精品视频 | 成人动漫在线观看 | 亲嘴扒胸摸屁股激烈网站 | 国产精品高潮呻吟av久久4虎 | 乱码午夜-极国产极内射 | 亚洲国产精品一区二区第一页 | 久久精品丝袜高跟鞋 | 国产在线一区二区三区四区五区 | 最近中文2019字幕第二页 | 啦啦啦www在线观看免费视频 | 日韩精品无码一区二区中文字幕 | 性欧美videos高清精品 | 久久婷婷五月综合色国产香蕉 | 未满小14洗澡无码视频网站 | 东京热一精品无码av | 水蜜桃色314在线观看 | 亚洲中文无码av永久不收费 | 中文字幕无码免费久久99 | 国产成人人人97超碰超爽8 | 日本成熟视频免费视频 | 国产成人综合在线女婷五月99播放 | а√天堂www在线天堂小说 | 亚洲成a人一区二区三区 | 精品水蜜桃久久久久久久 | 国产av无码专区亚洲awww | 亚洲va中文字幕无码久久不卡 | 精品国产一区二区三区四区在线看 | 国产精品久久久久久无码 | 99久久精品日本一区二区免费 | а√资源新版在线天堂 | 亚洲欧洲无卡二区视頻 | 蜜桃臀无码内射一区二区三区 | 国产97色在线 | 免 | 婷婷色婷婷开心五月四房播播 | av无码久久久久不卡免费网站 | 狠狠亚洲超碰狼人久久 | 色老头在线一区二区三区 | 又大又紧又粉嫩18p少妇 | 十八禁视频网站在线观看 | 欧美精品一区二区精品久久 | 四虎国产精品免费久久 | 女人被男人躁得好爽免费视频 | а√天堂www在线天堂小说 | 日产精品99久久久久久 | 精品国偷自产在线 | 高潮喷水的毛片 | 欧美精品在线观看 | 国语自产偷拍精品视频偷 | 欧美日韩一区二区三区自拍 | 日本爽爽爽爽爽爽在线观看免 | 亚洲熟妇色xxxxx亚洲 | 日韩精品成人一区二区三区 | 精品无码国产自产拍在线观看蜜 | 牲欲强的熟妇农村老妇女视频 | 波多野结衣 黑人 | 欧美性生交xxxxx久久久 | 蜜桃臀无码内射一区二区三区 | 蜜桃臀无码内射一区二区三区 | 日韩精品一区二区av在线 | 日本www一道久久久免费榴莲 | 精品久久久中文字幕人妻 | 久久久精品欧美一区二区免费 | 7777奇米四色成人眼影 | 日本在线高清不卡免费播放 | 国产麻豆精品一区二区三区v视界 | 色 综合 欧美 亚洲 国产 | 综合网日日天干夜夜久久 | 久久精品人人做人人综合 | 给我免费的视频在线观看 | 成人影院yy111111在线观看 | 久久综合香蕉国产蜜臀av | 六十路熟妇乱子伦 | 牲欲强的熟妇农村老妇女视频 | 色综合天天综合狠狠爱 | 人妻有码中文字幕在线 | 精品国产成人一区二区三区 | 成人女人看片免费视频放人 | 国产精品毛片一区二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品无码国产一区二区三区av | 婷婷五月综合激情中文字幕 | 国产又爽又猛又粗的视频a片 | 成人免费视频视频在线观看 免费 | 精品久久久无码人妻字幂 | 久久天天躁夜夜躁狠狠 | 99久久精品无码一区二区毛片 | 波多野42部无码喷潮在线 | 鲁大师影院在线观看 | 亚洲人亚洲人成电影网站色 | 香蕉久久久久久av成人 | 乱中年女人伦av三区 | 午夜理论片yy44880影院 | 最近的中文字幕在线看视频 | 午夜无码人妻av大片色欲 | 亚洲国产精品毛片av不卡在线 | 无码一区二区三区在线观看 | 波多野结衣高清一区二区三区 | 国产suv精品一区二区五 | 亚洲精品鲁一鲁一区二区三区 | 欧美黑人性暴力猛交喷水 | 久久久久亚洲精品男人的天堂 | 中文无码精品a∨在线观看不卡 | 国产精品久久久久久久9999 | 色综合天天综合狠狠爱 | 18禁止看的免费污网站 | 久久精品一区二区三区四区 | 国产亚洲精品久久久久久久 | 无码人妻出轨黑人中文字幕 | 国产美女精品一区二区三区 | 中文无码精品a∨在线观看不卡 | 亚洲精品成人福利网站 | 又大又黄又粗又爽的免费视频 | 99久久久无码国产aaa精品 | 亚洲 欧美 激情 小说 另类 | 思思久久99热只有频精品66 | 亚洲综合伊人久久大杳蕉 | 亚洲精品一区二区三区在线 | 青青青爽视频在线观看 | 国产精品久久久久久无码 | 亚洲色欲色欲欲www在线 | 亚洲精品综合五月久久小说 | 日本一卡2卡3卡四卡精品网站 | 久久久久亚洲精品男人的天堂 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲娇小与黑人巨大交 | 国产精品久久久久久亚洲影视内衣 | 亚洲国产精品无码一区二区三区 | 国产精品丝袜黑色高跟鞋 | 国産精品久久久久久久 | 青青青爽视频在线观看 | 性欧美熟妇videofreesex | 欧美日韩一区二区三区自拍 | 亚洲自偷精品视频自拍 | 亚洲人成网站免费播放 | av无码电影一区二区三区 | 97夜夜澡人人爽人人喊中国片 | 亚洲精品一区二区三区婷婷月 | 激情五月综合色婷婷一区二区 | 国产精品久久福利网站 | 永久免费观看国产裸体美女 | 日日摸夜夜摸狠狠摸婷婷 | 自拍偷自拍亚洲精品10p | 亚洲呦女专区 | 2019nv天堂香蕉在线观看 | 精品久久8x国产免费观看 | 日韩欧美中文字幕在线三区 | 成人毛片一区二区 | 噜噜噜亚洲色成人网站 | 人人澡人摸人人添 | 日本xxxx色视频在线观看免费 | 天天拍夜夜添久久精品 | 国产偷抇久久精品a片69 | 欧美一区二区三区视频在线观看 | 蜜桃臀无码内射一区二区三区 | 久久人人97超碰a片精品 | 国产免费无码一区二区视频 | 日欧一片内射va在线影院 | 久久久久久国产精品无码下载 | 狠狠色欧美亚洲狠狠色www | 1000部啪啪未满十八勿入下载 | av人摸人人人澡人人超碰下载 | 97色伦图片97综合影院 | 国产精品久久久一区二区三区 | 亚洲午夜福利在线观看 | 偷窥村妇洗澡毛毛多 | 无码国产乱人伦偷精品视频 | 欧美第一黄网免费网站 | 成 人 免费观看网站 | 国产成人无码专区 | 丰满少妇熟乱xxxxx视频 | 成人aaa片一区国产精品 | 99精品国产综合久久久久五月天 | 久久精品人人做人人综合 | 久久国产精品二国产精品 | 欧美高清在线精品一区 | 大色综合色综合网站 | 国产成人无码一二三区视频 | 东京无码熟妇人妻av在线网址 | 少妇性l交大片 | 国产成人无码av在线影院 | 强伦人妻一区二区三区视频18 | 青春草在线视频免费观看 | 在线a亚洲视频播放在线观看 | 午夜精品久久久内射近拍高清 | 亚洲 a v无 码免 费 成 人 a v | 露脸叫床粗话东北少妇 | 精品国产乱码久久久久乱码 | 性啪啪chinese东北女人 | 国产无av码在线观看 | 精品亚洲韩国一区二区三区 | 狂野欧美性猛xxxx乱大交 | 国产熟妇另类久久久久 | 精品国产aⅴ无码一区二区 | 中文字幕无码人妻少妇免费 | 中文字幕+乱码+中文字幕一区 | 国产综合在线观看 | 日日摸日日碰夜夜爽av | 国产熟女一区二区三区四区五区 | 国产97人人超碰caoprom | 精品久久久无码人妻字幂 | 久久国产精品二国产精品 | 国产亚洲视频中文字幕97精品 | 国产小呦泬泬99精品 | 四十如虎的丰满熟妇啪啪 | 午夜免费福利小电影 | 捆绑白丝粉色jk震动捧喷白浆 | 国产av久久久久精东av | 成人影院yy111111在线观看 | 欧美三级不卡在线观看 | 无码精品人妻一区二区三区av | 高清国产亚洲精品自在久久 | 欧美亚洲国产一区二区三区 | 一二三四在线观看免费视频 | 精品国产成人一区二区三区 | 精品国产乱码久久久久乱码 | 欧洲美熟女乱又伦 | 精品国产一区二区三区四区 | 国产精品无码一区二区三区不卡 | 999久久久国产精品消防器材 | 噜噜噜亚洲色成人网站 | 九九综合va免费看 | 少妇人妻av毛片在线看 | 六十路熟妇乱子伦 | 波多野42部无码喷潮在线 | av无码不卡在线观看免费 | 东京热无码av男人的天堂 | 国产精品鲁鲁鲁 | 国产熟妇另类久久久久 | 图片小说视频一区二区 | 麻豆av传媒蜜桃天美传媒 | 沈阳熟女露脸对白视频 | aⅴ亚洲 日韩 色 图网站 播放 | 精品无码一区二区三区爱欲 | 久久久久久亚洲精品a片成人 | 久久午夜无码鲁丝片秋霞 | 伊人久久大香线蕉av一区二区 | 天堂亚洲2017在线观看 | 精品国精品国产自在久国产87 | 国产精品亚洲专区无码不卡 | 国产av一区二区三区最新精品 | 奇米影视7777久久精品人人爽 | 国产内射老熟女aaaa | 丰满少妇人妻久久久久久 | 久久www免费人成人片 | 无码一区二区三区在线观看 | 久久无码专区国产精品s | 欧美xxxxx精品 | 欧洲熟妇精品视频 | 欧美精品在线观看 | 中文字幕av无码一区二区三区电影 | 国产做国产爱免费视频 | 大乳丰满人妻中文字幕日本 | 亚洲精品午夜无码电影网 | 精品国产aⅴ无码一区二区 | 国产熟妇高潮叫床视频播放 | 亚洲成在人网站无码天堂 | 99久久人妻精品免费二区 | 老熟女乱子伦 | 伊人久久婷婷五月综合97色 | 熟妇人妻中文av无码 | 国产9 9在线 | 中文 | 午夜精品一区二区三区的区别 | 三上悠亚人妻中文字幕在线 | 中文字幕av无码一区二区三区电影 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲日韩中文字幕在线播放 | 久久无码中文字幕免费影院蜜桃 | 国产一区二区不卡老阿姨 | 少妇无码吹潮 | av人摸人人人澡人人超碰下载 | 一个人看的www免费视频在线观看 | 亚洲爆乳精品无码一区二区三区 | 亚洲精品一区三区三区在线观看 | 国产精品国产自线拍免费软件 | 无码av岛国片在线播放 | 亚洲精品久久久久久一区二区 | 强伦人妻一区二区三区视频18 | 97se亚洲精品一区 | 国语精品一区二区三区 | 国产精品香蕉在线观看 | 亚洲午夜福利在线观看 | 人妻无码久久精品人妻 | 高潮毛片无遮挡高清免费 | 亚洲色大成网站www | 中文字幕无码免费久久9一区9 | 中文字幕无线码免费人妻 | 婷婷综合久久中文字幕蜜桃三电影 | 国产黑色丝袜在线播放 | 国产激情一区二区三区 | 国产 精品 自在自线 | 少妇的肉体aa片免费 | 熟女少妇人妻中文字幕 | 人妻熟女一区 | 国产av一区二区精品久久凹凸 | ass日本丰满熟妇pics | 欧美丰满老熟妇xxxxx性 | 国产精品99久久精品爆乳 | 伊人久久大香线蕉午夜 | 欧美午夜特黄aaaaaa片 | 大乳丰满人妻中文字幕日本 | 97se亚洲精品一区 | 亚洲人成网站在线播放942 | 亚洲综合无码一区二区三区 | 国产综合久久久久鬼色 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久99精品国产麻豆蜜芽 | 亚洲欧美中文字幕5发布 | 中文字幕 亚洲精品 第1页 | 人人妻人人澡人人爽欧美精品 | 国产9 9在线 | 中文 | 久久亚洲精品成人无码 | 欧美性生交活xxxxxdddd | 国产精品久久国产精品99 | 99riav国产精品视频 | 少妇无套内谢久久久久 | 国产精品美女久久久久av爽李琼 | 无码国模国产在线观看 | 乱人伦人妻中文字幕无码 | 在线a亚洲视频播放在线观看 | 中文字幕无码av激情不卡 | 国产免费无码一区二区视频 | 国产熟妇高潮叫床视频播放 | 欧美精品免费观看二区 | 欧美怡红院免费全部视频 | 特大黑人娇小亚洲女 | 国产精品二区一区二区aⅴ污介绍 | 性欧美牲交在线视频 | 亚洲欧美综合区丁香五月小说 | 亚洲小说春色综合另类 | 久久久久成人精品免费播放动漫 | 国产av无码专区亚洲awww | 国产精品久久久av久久久 | 亚洲精品中文字幕乱码 | 色综合视频一区二区三区 | 欧美日韩色另类综合 | 精品国产成人一区二区三区 | 亚洲人成人无码网www国产 | 国产精品视频免费播放 | 国产亚洲日韩欧美另类第八页 | 国产成人精品视频ⅴa片软件竹菊 | 久久aⅴ免费观看 | 人妻夜夜爽天天爽三区 | 无码吃奶揉捏奶头高潮视频 | 未满小14洗澡无码视频网站 | 四虎4hu永久免费 | 午夜性刺激在线视频免费 | 无码av免费一区二区三区试看 | 精品一区二区三区波多野结衣 | 久久人人爽人人爽人人片av高清 | 夜夜影院未满十八勿进 | 天天爽夜夜爽夜夜爽 | 妺妺窝人体色www婷婷 | 国精产品一品二品国精品69xx | 成熟女人特级毛片www免费 | 精品国产乱码久久久久乱码 | 日日天日日夜日日摸 | 久久久婷婷五月亚洲97号色 | 国产女主播喷水视频在线观看 | 欧美xxxx黑人又粗又长 | 在线观看国产午夜福利片 | 人妻无码久久精品人妻 | 日日橹狠狠爱欧美视频 | 国产色视频一区二区三区 | 久久久久人妻一区精品色欧美 | 久久久精品欧美一区二区免费 | 免费人成在线观看网站 | 成人性做爰aaa片免费看不忠 | 亚洲人成网站在线播放942 | 亚洲伊人久久精品影院 | 老子影院午夜伦不卡 | 亚洲精品无码国产 | 牲交欧美兽交欧美 | 久久久久99精品成人片 | 久久国产精品偷任你爽任你 | 丝袜人妻一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 欧美丰满熟妇xxxx性ppx人交 | 色爱情人网站 | 成人免费视频视频在线观看 免费 | 亚洲国产精品无码一区二区三区 | 人人超人人超碰超国产 | 欧美性生交xxxxx久久久 | 成人免费视频视频在线观看 免费 | 国产做国产爱免费视频 | 丝袜美腿亚洲一区二区 | 亚洲另类伦春色综合小说 | 久久亚洲中文字幕精品一区 | 国产猛烈高潮尖叫视频免费 | 国色天香社区在线视频 | 久久伊人色av天堂九九小黄鸭 | ass日本丰满熟妇pics | 欧美黑人乱大交 | 内射老妇bbwx0c0ck | 午夜免费福利小电影 | 丰满少妇高潮惨叫视频 | 国产精品毛片一区二区 | 欧美日本精品一区二区三区 | 精品人妻人人做人人爽 | 丰满人妻翻云覆雨呻吟视频 | 国产激情艳情在线看视频 | 精品国产福利一区二区 | 欧洲vodafone精品性 | 亚洲a无码综合a国产av中文 | 亚洲精品一区国产 | 色欲av亚洲一区无码少妇 | 国产精品久久福利网站 | 无码中文字幕色专区 | 爽爽影院免费观看 | 老熟妇乱子伦牲交视频 | 人人妻人人藻人人爽欧美一区 | 国产成人精品无码播放 | 成人亚洲精品久久久久软件 | 国产精品丝袜黑色高跟鞋 | 少妇一晚三次一区二区三区 | 精品熟女少妇av免费观看 | 日本精品久久久久中文字幕 | 人人妻在人人 | 久久精品99久久香蕉国产色戒 | 亚洲一区二区三区含羞草 | 波多野42部无码喷潮在线 | 内射欧美老妇wbb | 99精品国产综合久久久久五月天 | 亚洲成a人片在线观看无码 | 亚洲精品中文字幕 | 曰本女人与公拘交酡免费视频 | 精品厕所偷拍各类美女tp嘘嘘 | 午夜精品久久久久久久 | 无码精品人妻一区二区三区av | 麻豆国产丝袜白领秘书在线观看 | 成人性做爰aaa片免费看不忠 | 色综合天天综合狠狠爱 | аⅴ资源天堂资源库在线 | 老熟女重囗味hdxx69 | 欧美兽交xxxx×视频 | 国产激情无码一区二区app | 国产午夜亚洲精品不卡下载 | 亚洲精品欧美二区三区中文字幕 | 无码帝国www无码专区色综合 | 国内丰满熟女出轨videos | 亚洲天堂2017无码中文 | 国产免费久久久久久无码 | 色一情一乱一伦一区二区三欧美 | 亚洲の无码国产の无码影院 | 动漫av一区二区在线观看 | 伊人色综合久久天天小片 | 亚洲无人区一区二区三区 | 国产成人人人97超碰超爽8 | 女人被男人躁得好爽免费视频 | 免费无码肉片在线观看 | 国产精品办公室沙发 | 亚洲国产精品久久人人爱 | 在线a亚洲视频播放在线观看 | 内射后入在线观看一区 | 人人澡人人透人人爽 | 99精品无人区乱码1区2区3区 | 亚洲经典千人经典日产 | 成人无码视频在线观看网站 | 成人无码精品一区二区三区 | 宝宝好涨水快流出来免费视频 | 亚洲小说图区综合在线 | 爽爽影院免费观看 | 成人精品视频一区二区三区尤物 | 无码成人精品区在线观看 | 午夜福利电影 | 日韩亚洲欧美中文高清在线 | 色噜噜亚洲男人的天堂 | 国产无套粉嫩白浆在线 | 亚洲国产精品毛片av不卡在线 | 亚洲最大成人网站 | 国产免费观看黄av片 | 在线精品亚洲一区二区 | 日欧一片内射va在线影院 | 曰韩无码二三区中文字幕 | 偷窥日本少妇撒尿chinese | 中文字幕 人妻熟女 | 久久zyz资源站无码中文动漫 | 2019nv天堂香蕉在线观看 | 精品国产一区二区三区四区在线看 | 99久久婷婷国产综合精品青草免费 | 免费国产成人高清在线观看网站 | 99精品无人区乱码1区2区3区 | 久久精品国产精品国产精品污 | 人妻少妇精品无码专区动漫 | 精品久久久无码人妻字幂 | 日欧一片内射va在线影院 | 国产 浪潮av性色四虎 | 国产午夜亚洲精品不卡下载 | 国产亚洲欧美在线专区 | 狂野欧美性猛交免费视频 | 少妇高潮一区二区三区99 | 扒开双腿疯狂进出爽爽爽视频 | 天堂一区人妻无码 | 美女毛片一区二区三区四区 | 免费乱码人妻系列无码专区 | 日韩精品无码免费一区二区三区 | 欧美日韩视频无码一区二区三 | aⅴ亚洲 日韩 色 图网站 播放 | 国产在线精品一区二区高清不卡 | 日本一本二本三区免费 | 久久久久亚洲精品男人的天堂 | 中文字幕人成乱码熟女app | 亚洲国产成人av在线观看 | 久青草影院在线观看国产 | 久久99精品久久久久久 | 中文字幕乱码亚洲无线三区 | 黑人粗大猛烈进出高潮视频 | 性欧美牲交xxxxx视频 | 无码人妻精品一区二区三区不卡 | 国产人妻精品午夜福利免费 | 超碰97人人做人人爱少妇 | 搡女人真爽免费视频大全 | 国产亚洲精品久久久久久大师 | 色综合久久88色综合天天 | 纯爱无遮挡h肉动漫在线播放 | 熟女体下毛毛黑森林 | 久久这里只有精品视频9 | 久热国产vs视频在线观看 | 一本一道久久综合久久 | 亚洲呦女专区 | 国产午夜亚洲精品不卡下载 | 狠狠色噜噜狠狠狠狠7777米奇 | 乱人伦中文视频在线观看 | 国产内射老熟女aaaa | 亚洲自偷自拍另类第1页 | 日本一本二本三区免费 | 天天摸天天透天天添 | 国产精品久久久久久亚洲影视内衣 | 熟女少妇在线视频播放 | 亚洲色在线无码国产精品不卡 | 色婷婷欧美在线播放内射 | 牛和人交xxxx欧美 | 少妇被粗大的猛进出69影院 | 午夜福利一区二区三区在线观看 | 亚洲国产精品久久久久久 | 无码人中文字幕 | yw尤物av无码国产在线观看 | 人妻插b视频一区二区三区 | 久久综合九色综合97网 | 亚洲一区av无码专区在线观看 | 国产午夜亚洲精品不卡下载 | 国产成人无码区免费内射一片色欲 | 丰满少妇高潮惨叫视频 | 精品 日韩 国产 欧美 视频 | 成人欧美一区二区三区黑人 | 午夜不卡av免费 一本久久a久久精品vr综合 | 成 人 免费观看网站 | 久久久久国色av免费观看性色 | 蜜桃视频插满18在线观看 | 日韩 欧美 动漫 国产 制服 | 日韩视频 中文字幕 视频一区 | 亚洲国产精品毛片av不卡在线 | 中文字幕无码av波多野吉衣 | 无人区乱码一区二区三区 | 日日躁夜夜躁狠狠躁 | 国内揄拍国内精品人妻 | 欧美亚洲国产一区二区三区 | 人妻互换免费中文字幕 | 草草网站影院白丝内射 | 国产成人精品必看 | 又黄又爽又色的视频 | 免费乱码人妻系列无码专区 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲综合无码久久精品综合 | 国产日产欧产精品精品app | 国产成人精品优优av | 亚洲乱码国产乱码精品精 | 久久综合九色综合97网 | 久久久久国色av免费观看性色 | 国产精品爱久久久久久久 | 99精品国产综合久久久久五月天 | 国产精华av午夜在线观看 | 久久亚洲a片com人成 | 久久久久久a亚洲欧洲av冫 | 国产欧美精品一区二区三区 | 真人与拘做受免费视频一 | 在线播放亚洲第一字幕 | 国产激情艳情在线看视频 | 亲嘴扒胸摸屁股激烈网站 | 老熟女乱子伦 | 白嫩日本少妇做爰 | 久久99精品久久久久久 | 精品人妻中文字幕有码在线 | 亚洲午夜福利在线观看 | 国产成人无码一二三区视频 | 超碰97人人做人人爱少妇 | 一本大道久久东京热无码av | 久久久国产一区二区三区 | 青青草原综合久久大伊人精品 | 无套内谢老熟女 | 国产莉萝无码av在线播放 | 天堂无码人妻精品一区二区三区 | 亚洲天堂2017无码中文 | 暴力强奷在线播放无码 | 小鲜肉自慰网站xnxx | 少妇被黑人到高潮喷出白浆 | 99久久精品国产一区二区蜜芽 | 最新国产乱人伦偷精品免费网站 | 扒开双腿疯狂进出爽爽爽视频 | 中文字幕无线码 | 少妇高潮喷潮久久久影院 | 无人区乱码一区二区三区 | 最新版天堂资源中文官网 | 日日摸夜夜摸狠狠摸婷婷 | 奇米影视7777久久精品人人爽 | 亚洲最大成人网站 | 未满成年国产在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 奇米影视7777久久精品人人爽 | 无码国产激情在线观看 | 亚洲 a v无 码免 费 成 人 a v | 日本欧美一区二区三区乱码 | 久久精品丝袜高跟鞋 | 久久99精品国产麻豆 | 亚洲高清偷拍一区二区三区 | 少妇无码av无码专区在线观看 | 精品无人区无码乱码毛片国产 | 三级4级全黄60分钟 | 国产av无码专区亚洲a∨毛片 | 欧洲熟妇色 欧美 | 思思久久99热只有频精品66 | 久久久中文久久久无码 | 日本一卡二卡不卡视频查询 | 亚洲精品国偷拍自产在线观看蜜桃 | 鲁鲁鲁爽爽爽在线视频观看 | 两性色午夜视频免费播放 | 日本大香伊一区二区三区 | 日韩亚洲欧美精品综合 | 国产激情无码一区二区app | 真人与拘做受免费视频一 | 秋霞成人午夜鲁丝一区二区三区 | 国产真实伦对白全集 | 亚洲无人区午夜福利码高清完整版 | 国产激情一区二区三区 | 露脸叫床粗话东北少妇 | 丝袜足控一区二区三区 | 久久久久人妻一区精品色欧美 | 色婷婷综合中文久久一本 | 免费观看的无遮挡av | 亚洲国产精品无码一区二区三区 | 99久久久无码国产aaa精品 | 亚洲精品一区三区三区在线观看 | 亚洲天堂2017无码 | 东京热一精品无码av | 55夜色66夜色国产精品视频 | 国产日产欧产精品精品app | 日日碰狠狠躁久久躁蜜桃 | 麻豆果冻传媒2021精品传媒一区下载 | 国产亚洲精品久久久闺蜜 | 色诱久久久久综合网ywww | 熟女体下毛毛黑森林 | 欧美 日韩 亚洲 在线 | 色噜噜亚洲男人的天堂 | 欧美一区二区三区 | 好爽又高潮了毛片免费下载 | 无码人妻丰满熟妇区五十路百度 | 领导边摸边吃奶边做爽在线观看 | 成人aaa片一区国产精品 | 国产疯狂伦交大片 | 熟女体下毛毛黑森林 | 玩弄少妇高潮ⅹxxxyw | 人妻少妇精品无码专区动漫 | 色婷婷av一区二区三区之红樱桃 | 国产又爽又黄又刺激的视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 欧美高清在线精品一区 | 香蕉久久久久久av成人 | 精品久久久久久亚洲精品 | 久久久久se色偷偷亚洲精品av | 日韩 欧美 动漫 国产 制服 | 无码人中文字幕 | 亚洲日韩精品欧美一区二区 | 青青青手机频在线观看 | 日本在线高清不卡免费播放 | 色婷婷香蕉在线一区二区 | 国产成人无码av在线影院 | 曰本女人与公拘交酡免费视频 | 欧美人与动性行为视频 | 欧美人与牲动交xxxx | 国产手机在线αⅴ片无码观看 | 国产麻豆精品一区二区三区v视界 | 亚洲人成网站在线播放942 | 久久综合激激的五月天 | 精品国产青草久久久久福利 | 亚洲熟妇色xxxxx亚洲 | 思思久久99热只有频精品66 | 国产亚洲精品久久久久久久 | 人人妻人人澡人人爽精品欧美 | 天天燥日日燥 | 国产成人无码a区在线观看视频app | 曰本女人与公拘交酡免费视频 | 免费无码一区二区三区蜜桃大 | 日本精品高清一区二区 | 人人妻人人藻人人爽欧美一区 | 日本一区二区三区免费高清 | 97无码免费人妻超级碰碰夜夜 | 99久久亚洲精品无码毛片 | 粗大的内捧猛烈进出视频 | 性欧美熟妇videofreesex | 欧美性猛交内射兽交老熟妇 | 亚洲欧美日韩国产精品一区二区 | 狠狠噜狠狠狠狠丁香五月 | 欧美日韩一区二区免费视频 | 国产成人精品三级麻豆 | 乱人伦中文视频在线观看 | 国产电影无码午夜在线播放 | 国产亚洲精品久久久久久 | 日本一区二区三区免费高清 | 色情久久久av熟女人妻网站 | 国产精品久久久久久久影院 | 亚洲精品无码人妻无码 | 久久综合久久自在自线精品自 | www成人国产高清内射 | 蜜桃无码一区二区三区 | 国产日产欧产精品精品app | 久久久中文字幕日本无吗 | 久久精品国产99久久6动漫 | 国产va免费精品观看 | 人妻少妇精品久久 | 99久久精品日本一区二区免费 | 麻豆av传媒蜜桃天美传媒 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲中文无码av永久不收费 | 给我免费的视频在线观看 | 亚洲国产成人av在线观看 | 2020最新国产自产精品 | 麻豆成人精品国产免费 | 久久国产自偷自偷免费一区调 | 无码一区二区三区在线 | 欧美日本免费一区二区三区 | 成年美女黄网站色大免费全看 | 强伦人妻一区二区三区视频18 | 欧洲欧美人成视频在线 | 久久伊人色av天堂九九小黄鸭 | 日本一卡二卡不卡视频查询 | 国产三级久久久精品麻豆三级 | 日本乱偷人妻中文字幕 | 国产亚洲精品久久久久久久久动漫 | 国产综合色产在线精品 | 亚洲一区二区三区播放 | 亚洲中文字幕av在天堂 | 少妇厨房愉情理9仑片视频 | 窝窝午夜理论片影院 | 国产午夜无码视频在线观看 | 无码毛片视频一区二区本码 | 东京无码熟妇人妻av在线网址 | 妺妺窝人体色www在线小说 | 67194成是人免费无码 | 暴力强奷在线播放无码 | 在线精品国产一区二区三区 | 蜜桃臀无码内射一区二区三区 | 国产亚洲日韩欧美另类第八页 | 欧美性黑人极品hd | 日韩精品无码一本二本三本色 | 久久99精品国产麻豆蜜芽 | 精品国产av色一区二区深夜久久 | 搡女人真爽免费视频大全 | 清纯唯美经典一区二区 | 55夜色66夜色国产精品视频 | 狠狠色噜噜狠狠狠7777奇米 | 国产免费无码一区二区视频 | 久9re热视频这里只有精品 | 夜精品a片一区二区三区无码白浆 | 国产做国产爱免费视频 | 中文字幕无线码免费人妻 | 一二三四在线观看免费视频 | 国产精品丝袜黑色高跟鞋 | 老熟女重囗味hdxx69 | 精品国偷自产在线 | 精品人妻人人做人人爽夜夜爽 | 狠狠亚洲超碰狼人久久 | 欧美国产日产一区二区 | 久久久国产精品无码免费专区 | 少妇激情av一区二区 | 一本久道久久综合婷婷五月 | 国产精品亚洲一区二区三区喷水 | 日韩无套无码精品 | 99精品国产综合久久久久五月天 | a国产一区二区免费入口 | 无人区乱码一区二区三区 | 女人被爽到呻吟gif动态图视看 | 亚洲 欧美 激情 小说 另类 | 国产97在线 | 亚洲 | 波多野42部无码喷潮在线 | 成人综合网亚洲伊人 | 西西人体www44rt大胆高清 | 未满小14洗澡无码视频网站 | 精品偷拍一区二区三区在线看 | 亚洲精品一区三区三区在线观看 | 奇米影视7777久久精品人人爽 | 狠狠噜狠狠狠狠丁香五月 | 成年美女黄网站色大免费全看 | 老熟妇乱子伦牲交视频 | 俄罗斯老熟妇色xxxx | 欧美亚洲国产一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 欧美老人巨大xxxx做受 | 3d动漫精品啪啪一区二区中 | 大胆欧美熟妇xx | 高清不卡一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 无码人妻av免费一区二区三区 | 精品乱子伦一区二区三区 | 久久久久se色偷偷亚洲精品av | 国产特级毛片aaaaaaa高清 | 精品国产成人一区二区三区 | 亚洲一区二区三区国产精华液 | 久久无码中文字幕免费影院蜜桃 | 国产乱人伦av在线无码 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久中文字幕日本无吗 | 性欧美熟妇videofreesex | 久久97精品久久久久久久不卡 | 亚洲综合无码一区二区三区 | 精品一区二区三区波多野结衣 | 亚洲乱码日产精品bd | 久久综合九色综合97网 | 搡女人真爽免费视频大全 | 欧美三级不卡在线观看 | 欧洲熟妇色 欧美 | 国产色在线 | 国产 | 国产成人综合美国十次 | 最新国产麻豆aⅴ精品无码 | 麻豆av传媒蜜桃天美传媒 | 玩弄人妻少妇500系列视频 | 精品人妻人人做人人爽夜夜爽 | 麻豆md0077饥渴少妇 | 窝窝午夜理论片影院 | 国产色精品久久人妻 | 狠狠色色综合网站 | 好爽又高潮了毛片免费下载 | 欧美精品无码一区二区三区 | 成人女人看片免费视频放人 | 99久久精品午夜一区二区 | 免费无码的av片在线观看 | 久久久精品456亚洲影院 | 奇米影视7777久久精品 | 亚洲欧美精品aaaaaa片 | 久久精品中文字幕大胸 | 极品尤物被啪到呻吟喷水 | 中文字幕+乱码+中文字幕一区 | 人人爽人人澡人人高潮 | 九一九色国产 | 人人爽人人澡人人高潮 | 日韩 欧美 动漫 国产 制服 | 亚洲成a人片在线观看日本 | 亚洲精品中文字幕久久久久 | 国产精品爱久久久久久久 | 精品偷拍一区二区三区在线看 | 国产成人亚洲综合无码 | 国产精品亚洲lv粉色 | 给我免费的视频在线观看 | 水蜜桃色314在线观看 | 国产免费观看黄av片 | 最近中文2019字幕第二页 | 国产精品欧美成人 | 亚洲国产精华液网站w | 久9re热视频这里只有精品 | 婷婷五月综合激情中文字幕 | 亚洲精品综合五月久久小说 | 少妇无码av无码专区在线观看 | 野外少妇愉情中文字幕 | 日韩欧美成人免费观看 | 色 综合 欧美 亚洲 国产 | 亚洲一区二区三区四区 | 国产乡下妇女做爰 | 色窝窝无码一区二区三区色欲 | 亚洲 日韩 欧美 成人 在线观看 | 麻豆md0077饥渴少妇 | 国产香蕉尹人综合在线观看 | 亚洲精品久久久久久一区二区 | 免费人成在线观看网站 | 偷窥村妇洗澡毛毛多 | 精品少妇爆乳无码av无码专区 | 人人妻人人澡人人爽人人精品浪潮 | 青青青爽视频在线观看 | 国产莉萝无码av在线播放 | 久久久久se色偷偷亚洲精品av | 欧美国产亚洲日韩在线二区 | 天天摸天天碰天天添 | 精品无码一区二区三区的天堂 | 中文字幕+乱码+中文字幕一区 | 九九久久精品国产免费看小说 | 亚洲区小说区激情区图片区 | 丁香啪啪综合成人亚洲 | 亚洲中文字幕乱码av波多ji | 中文字幕人妻丝袜二区 | 日韩欧美中文字幕公布 | 狂野欧美激情性xxxx | 日韩 欧美 动漫 国产 制服 | 亚洲一区二区三区含羞草 | 风流少妇按摩来高潮 | 国产婷婷色一区二区三区在线 | 网友自拍区视频精品 | 好爽又高潮了毛片免费下载 | 无码人妻出轨黑人中文字幕 | 国产成人精品三级麻豆 | 人妻体内射精一区二区三四 | 国产凸凹视频一区二区 | 99久久久无码国产aaa精品 | 人人爽人人澡人人人妻 | 中文字幕无码乱人伦 | 亚洲中文字幕成人无码 | 妺妺窝人体色www在线小说 | 亚洲人成网站色7799 | 无码精品人妻一区二区三区av | 少妇愉情理伦片bd | 国产香蕉尹人综合在线观看 | 中文字幕人妻无码一夲道 | 超碰97人人射妻 | 国产内射老熟女aaaa | 99久久精品国产一区二区蜜芽 | 亚洲熟妇色xxxxx欧美老妇y | 欧美精品免费观看二区 | www国产亚洲精品久久网站 | 精品国产一区二区三区四区 | 精品夜夜澡人妻无码av蜜桃 | 曰韩少妇内射免费播放 | 荫蒂被男人添的好舒服爽免费视频 | 国产特级毛片aaaaaa高潮流水 | 伦伦影院午夜理论片 | 国产一区二区不卡老阿姨 | 国产福利视频一区二区 | 人妻无码αv中文字幕久久琪琪布 | 精品熟女少妇av免费观看 | 1000部啪啪未满十八勿入下载 | 熟妇女人妻丰满少妇中文字幕 | 伊人久久婷婷五月综合97色 | 色综合久久久久综合一本到桃花网 | 九月婷婷人人澡人人添人人爽 | 欧洲欧美人成视频在线 | 动漫av一区二区在线观看 | 久久精品无码一区二区三区 | 十八禁视频网站在线观看 | 欧洲极品少妇 | 亚洲狠狠婷婷综合久久 | 亚洲成色在线综合网站 | 亚洲国产午夜精品理论片 | 老熟女重囗味hdxx69 | 久久综合给合久久狠狠狠97色 | 亚洲成a人片在线观看日本 | 色 综合 欧美 亚洲 国产 | 老司机亚洲精品影院无码 | 午夜无码人妻av大片色欲 | 国内精品人妻无码久久久影院 | 人人澡人人透人人爽 | 久久国产自偷自偷免费一区调 | 欧美阿v高清资源不卡在线播放 | 精品人妻人人做人人爽夜夜爽 | 狠狠色丁香久久婷婷综合五月 | 亚洲欧美中文字幕5发布 | 亚洲国产高清在线观看视频 | 免费无码午夜福利片69 | 一本久久伊人热热精品中文字幕 | 激情人妻另类人妻伦 | 一个人看的www免费视频在线观看 | 国产精品人人妻人人爽 | 欧美激情一区二区三区成人 | 国产精品无码永久免费888 | 在线观看国产午夜福利片 | 精品无码av一区二区三区 | 国产亚洲精品久久久久久 | 成人女人看片免费视频放人 | 亚洲国产欧美日韩精品一区二区三区 | 丰满护士巨好爽好大乳 | 人人妻人人澡人人爽人人精品浪潮 | 精品乱子伦一区二区三区 | 无码人妻精品一区二区三区下载 | 国产精品无码成人午夜电影 | 亚洲精品久久久久中文第一幕 | 国产另类ts人妖一区二区 | 成人精品天堂一区二区三区 | 2019nv天堂香蕉在线观看 | 性做久久久久久久久 | 欧美日韩综合一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕无码人妻少妇免费 | 亚洲精品国产精品乱码不卡 | 2020最新国产自产精品 | 真人与拘做受免费视频 | 欧美丰满少妇xxxx性 | 老熟妇乱子伦牲交视频 | 日本一区二区三区免费播放 | 在教室伦流澡到高潮hnp视频 | 日韩亚洲欧美精品综合 | 沈阳熟女露脸对白视频 | 国产成人综合在线女婷五月99播放 | 人人妻人人澡人人爽欧美一区九九 | 九九综合va免费看 | 熟女体下毛毛黑森林 | 亚洲自偷自偷在线制服 | 亚洲啪av永久无码精品放毛片 | 亚洲中文字幕无码中文字在线 | 国产成人无码av一区二区 | 天天av天天av天天透 | 久久久亚洲欧洲日产国码αv | 在线欧美精品一区二区三区 | 中文字幕人妻无码一夲道 | 日本饥渴人妻欲求不满 | 99久久精品国产一区二区蜜芽 | 国产一区二区不卡老阿姨 | 亚洲乱码日产精品bd | 强辱丰满人妻hd中文字幕 | 国产一区二区三区精品视频 | 麻豆蜜桃av蜜臀av色欲av | 四虎国产精品免费久久 | 无套内谢的新婚少妇国语播放 | a在线亚洲男人的天堂 | 成 人影片 免费观看 | 少妇一晚三次一区二区三区 | 精品国产成人一区二区三区 | 无码av免费一区二区三区试看 | 久久精品人人做人人综合试看 | 亚洲中文字幕在线观看 | 午夜福利一区二区三区在线观看 | 国产九九九九九九九a片 | 天堂亚洲免费视频 | 高中生自慰www网站 | 午夜不卡av免费 一本久久a久久精品vr综合 | 风流少妇按摩来高潮 | 亚洲aⅴ无码成人网站国产app | 色噜噜亚洲男人的天堂 | 国产激情一区二区三区 | 亚洲无人区一区二区三区 | 久久精品人妻少妇一区二区三区 | 亚洲熟女一区二区三区 | 国产精品人妻一区二区三区四 | 女人被爽到呻吟gif动态图视看 | 99精品视频在线观看免费 | 人人爽人人澡人人人妻 | 亚洲国产午夜精品理论片 | 性做久久久久久久久 | 亚洲精品美女久久久久久久 | 人妻人人添人妻人人爱 | 天天综合网天天综合色 | 国精产品一品二品国精品69xx | 内射巨臀欧美在线视频 | 激情内射亚州一区二区三区爱妻 | 国产无遮挡又黄又爽又色 | 蜜臀av无码人妻精品 | 欧美人与禽zoz0性伦交 | 国产日产欧产精品精品app | 无套内谢的新婚少妇国语播放 | 伊人久久大香线焦av综合影院 | 一本无码人妻在中文字幕免费 | 男女超爽视频免费播放 | 精品久久久久香蕉网 | 久久国产精品精品国产色婷婷 | 日韩精品久久久肉伦网站 | 亚洲无人区一区二区三区 | 欧美黑人性暴力猛交喷水 | 婷婷五月综合激情中文字幕 | 久久精品99久久香蕉国产色戒 | 鲁大师影院在线观看 | 亚洲码国产精品高潮在线 | 亚洲区小说区激情区图片区 | 精品国产麻豆免费人成网站 | 国产舌乚八伦偷品w中 | 狠狠色丁香久久婷婷综合五月 | 亚洲国产精品美女久久久久 | 国产激情无码一区二区 | 欧美国产日产一区二区 | 又湿又紧又大又爽a视频国产 | 国产精品多人p群无码 | 在线成人www免费观看视频 | 国产区女主播在线观看 | 99精品无人区乱码1区2区3区 | 久久亚洲中文字幕无码 | 精品午夜福利在线观看 | 99久久久无码国产精品免费 | 国模大胆一区二区三区 | 欧美一区二区三区 | 波多野结衣av一区二区全免费观看 | 一个人看的视频www在线 | 夜夜躁日日躁狠狠久久av | 欧美野外疯狂做受xxxx高潮 | 免费乱码人妻系列无码专区 | 国产美女极度色诱视频www | 自拍偷自拍亚洲精品被多人伦好爽 | 狠狠噜狠狠狠狠丁香五月 | 久青草影院在线观看国产 | 国产精品高潮呻吟av久久4虎 | 娇妻被黑人粗大高潮白浆 | 欧美 日韩 亚洲 在线 | 成人影院yy111111在线观看 | 一二三四社区在线中文视频 | 精品水蜜桃久久久久久久 | 色综合久久久无码网中文 | 国产精品第一国产精品 | 欧美亚洲日韩国产人成在线播放 | 狠狠色噜噜狠狠狠7777奇米 | 国产在线精品一区二区高清不卡 | 国产真实伦对白全集 | 清纯唯美经典一区二区 | 在线天堂新版最新版在线8 | 国产精品鲁鲁鲁 | 日韩av激情在线观看 | 精品成在人线av无码免费看 | 日本xxxx色视频在线观看免费 | 久久久久成人片免费观看蜜芽 | 好爽又高潮了毛片免费下载 | 国产精品无码一区二区桃花视频 | 久久综合色之久久综合 | 99久久久国产精品无码免费 | 啦啦啦www在线观看免费视频 | 人妻夜夜爽天天爽三区 | 国产免费久久精品国产传媒 | 国产在线精品一区二区三区直播 | 中文字幕人妻无码一夲道 | 国产精品无码久久av | 国产精品久久久一区二区三区 | 亚洲s码欧洲m码国产av | 精品熟女少妇av免费观看 | 中文字幕无线码 | 成人试看120秒体验区 | 丰满岳乱妇在线观看中字无码 | 久久久亚洲欧洲日产国码αv | 欧洲美熟女乱又伦 | 色妞www精品免费视频 | 国产精品久久久久7777 | 天天做天天爱天天爽综合网 | 国产精品成人av在线观看 | 久久久国产一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 国产女主播喷水视频在线观看 | 玩弄少妇高潮ⅹxxxyw | 久久99国产综合精品 | 国产午夜无码精品免费看 | 亚洲 欧美 激情 小说 另类 | 欧美激情综合亚洲一二区 | 高清不卡一区二区三区 | 超碰97人人做人人爱少妇 | 日韩精品乱码av一区二区 | 亚洲色无码一区二区三区 | 我要看www免费看插插视频 | 无码人妻精品一区二区三区不卡 | 一个人看的www免费视频在线观看 | 精品熟女少妇av免费观看 | 99精品视频在线观看免费 | 亚洲人成网站色7799 | 成人试看120秒体验区 | 亚洲欧洲无卡二区视頻 | 精品人妻av区 | 国产激情艳情在线看视频 | 亚洲一区二区三区国产精华液 | 无码成人精品区在线观看 | 国产av一区二区精品久久凹凸 | 久久99精品国产麻豆蜜芽 | 国产午夜福利亚洲第一 | 国产精品无码久久av | 牲欲强的熟妇农村老妇女视频 | 国产精品无码一区二区桃花视频 | 亚无码乱人伦一区二区 | 欧美freesex黑人又粗又大 | 国产精品人人爽人人做我的可爱 | 无码免费一区二区三区 | 久久久婷婷五月亚洲97号色 | 精品一区二区三区波多野结衣 | 亚洲精品一区三区三区在线观看 | 欧美性猛交内射兽交老熟妇 | 亚洲欧美中文字幕5发布 | 欧美xxxxx精品 | 76少妇精品导航 | 人妻互换免费中文字幕 | 无码精品人妻一区二区三区av | 黑人粗大猛烈进出高潮视频 | 爱做久久久久久 | 国内揄拍国内精品人妻 | 人妻少妇被猛烈进入中文字幕 | 四虎影视成人永久免费观看视频 | 国产精品嫩草久久久久 | 国产精品毛多多水多 | 少妇性俱乐部纵欲狂欢电影 | 日本一本二本三区免费 | 成 人 免费观看网站 | 国产成人av免费观看 | 蜜桃臀无码内射一区二区三区 | 在线观看免费人成视频 | 国产人妻人伦精品1国产丝袜 | 99久久婷婷国产综合精品青草免费 | 小sao货水好多真紧h无码视频 | 丰满肥臀大屁股熟妇激情视频 | 3d动漫精品啪啪一区二区中 | 极品嫩模高潮叫床 | 人人妻人人澡人人爽欧美一区 | 久久99热只有频精品8 | 久久国产精品偷任你爽任你 | 男女超爽视频免费播放 | 色狠狠av一区二区三区 | 亚洲中文字幕va福利 | 伊人久久大香线蕉亚洲 | 成人免费无码大片a毛片 | 无码吃奶揉捏奶头高潮视频 | 97精品人妻一区二区三区香蕉 | 中文精品久久久久人妻不卡 | 在线观看免费人成视频 | v一区无码内射国产 | 中文字幕无码日韩专区 | 久久无码中文字幕免费影院蜜桃 | 高中生自慰www网站 | 一本大道久久东京热无码av | 老子影院午夜伦不卡 | 中文字幕人妻丝袜二区 | 97人妻精品一区二区三区 | 全球成人中文在线 | 国精品人妻无码一区二区三区蜜柚 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久久亚洲精品中文字幕 | 亚洲成色在线综合网站 | 男女爱爱好爽视频免费看 | 图片小说视频一区二区 | 亚洲国产午夜精品理论片 | 精品国产一区二区三区四区在线看 | 国产成人综合在线女婷五月99播放 | 国产色xx群视频射精 | 撕开奶罩揉吮奶头视频 | 思思久久99热只有频精品66 | 亚洲成a人一区二区三区 | 亚洲日韩av一区二区三区中文 | 日韩精品无码一本二本三本色 | 大色综合色综合网站 | 亚洲一区二区三区在线观看网站 | 波多野结衣乳巨码无在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 久久久久成人精品免费播放动漫 | 免费观看黄网站 | 小鲜肉自慰网站xnxx | 亚洲成av人片天堂网无码】 | 久久久久人妻一区精品色欧美 | 国产精品人人爽人人做我的可爱 | 亚洲精品一区三区三区在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 乱人伦人妻中文字幕无码久久网 | 夜夜高潮次次欢爽av女 | 99国产精品白浆在线观看免费 | 激情综合激情五月俺也去 | 狂野欧美性猛xxxx乱大交 | 亚洲一区二区三区无码久久 | 亚洲精品鲁一鲁一区二区三区 | 精品国产一区二区三区av 性色 | 国产亲子乱弄免费视频 | 色窝窝无码一区二区三区色欲 | 国产xxx69麻豆国语对白 | 麻豆国产人妻欲求不满 | 在线观看免费人成视频 | 久久精品国产99久久6动漫 | 欧洲美熟女乱又伦 | 无码国产色欲xxxxx视频 | 免费无码一区二区三区蜜桃大 | 亚洲另类伦春色综合小说 | 欧美xxxx黑人又粗又长 | 亚洲区小说区激情区图片区 | 天天躁夜夜躁狠狠是什么心态 | 日韩人妻无码一区二区三区久久99 | 免费无码肉片在线观看 | 亚洲日韩一区二区三区 | 高中生自慰www网站 | 女人被爽到呻吟gif动态图视看 | 国产成人精品必看 | 成年美女黄网站色大免费视频 | 国产女主播喷水视频在线观看 | 亚洲成在人网站无码天堂 | 蜜桃臀无码内射一区二区三区 | 日韩少妇白浆无码系列 | 性做久久久久久久免费看 | 永久免费精品精品永久-夜色 | 亚洲精品综合五月久久小说 | 青草青草久热国产精品 | 久久国产精品精品国产色婷婷 | 牲欲强的熟妇农村老妇女视频 | 国产欧美亚洲精品a | 国产亲子乱弄免费视频 | 乱人伦中文视频在线观看 | 国产精品18久久久久久麻辣 | 国产精品手机免费 | 荫蒂添的好舒服视频囗交 | 无码免费一区二区三区 | 中文无码成人免费视频在线观看 | 丰满岳乱妇在线观看中字无码 | av无码电影一区二区三区 | 久久婷婷五月综合色国产香蕉 | 无码精品人妻一区二区三区av | 又大又黄又粗又爽的免费视频 | 澳门永久av免费网站 | 天堂在线观看www | 国产午夜手机精彩视频 | 99麻豆久久久国产精品免费 | 国产欧美熟妇另类久久久 | 中文无码成人免费视频在线观看 | 亚洲 激情 小说 另类 欧美 | www一区二区www免费 | 狂野欧美性猛xxxx乱大交 | 成 人影片 免费观看 | 国产超级va在线观看视频 | 国内精品久久毛片一区二区 | 人人妻人人藻人人爽欧美一区 | 亚洲国产av美女网站 | 在线观看免费人成视频 | 成人动漫在线观看 | 在教室伦流澡到高潮hnp视频 | 亚洲理论电影在线观看 | 在线观看国产午夜福利片 | www国产亚洲精品久久久日本 | 特大黑人娇小亚洲女 | 噜噜噜亚洲色成人网站 | 国产日产欧产精品精品app | 国产内射爽爽大片视频社区在线 | www国产亚洲精品久久网站 | 久久人人97超碰a片精品 | 国产激情精品一区二区三区 | 欧美日韩一区二区三区自拍 | 又紧又大又爽精品一区二区 | 国产在线一区二区三区四区五区 | 97无码免费人妻超级碰碰夜夜 | 激情人妻另类人妻伦 | 性色欲情网站iwww九文堂 | 3d动漫精品啪啪一区二区中 | 99久久人妻精品免费二区 | 国产乱人偷精品人妻a片 | 欧美亚洲国产一区二区三区 | 成人无码影片精品久久久 | 国产电影无码午夜在线播放 | 丰满少妇弄高潮了www | 任你躁在线精品免费 | 国产熟妇另类久久久久 | 国产成人一区二区三区别 | 性做久久久久久久久 | 国产av无码专区亚洲awww | 久久精品成人欧美大片 | 中文字幕 亚洲精品 第1页 | 小泽玛莉亚一区二区视频在线 | 日日躁夜夜躁狠狠躁 | 成在人线av无码免观看麻豆 | 国产香蕉97碰碰久久人人 | 99精品国产综合久久久久五月天 | 欧美freesex黑人又粗又大 | 国产熟妇另类久久久久 | 精品国产一区二区三区四区在线看 | 国产97在线 | 亚洲 | 亚洲欧美精品aaaaaa片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 黑人巨大精品欧美一区二区 | 亚洲乱亚洲乱妇50p | 中文字幕无码日韩专区 | 久久久久se色偷偷亚洲精品av | 少妇性俱乐部纵欲狂欢电影 | 免费无码午夜福利片69 | 亚洲欧美国产精品久久 | 日日摸日日碰夜夜爽av | 国内精品久久毛片一区二区 | 无码精品人妻一区二区三区av | 成人免费视频视频在线观看 免费 | 国产精品99久久精品爆乳 | 亚洲日本va午夜在线电影 | 亚洲欧美日韩综合久久久 | 成人一区二区免费视频 | 男人的天堂av网站 | 国产激情无码一区二区app | 国产一精品一av一免费 | 九月婷婷人人澡人人添人人爽 | 大乳丰满人妻中文字幕日本 | 精品日本一区二区三区在线观看 | 国产精品美女久久久 | 国产真实乱对白精彩久久 | 久久精品无码一区二区三区 | 国产精品亚洲专区无码不卡 | 色五月五月丁香亚洲综合网 | 色欲av亚洲一区无码少妇 | 久久精品中文字幕大胸 | 在线欧美精品一区二区三区 | 女高中生第一次破苞av | 国产av一区二区精品久久凹凸 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧洲无卡二区视頻 | 99久久99久久免费精品蜜桃 | 99精品无人区乱码1区2区3区 | 夫妻免费无码v看片 | 国产精品久久久久久亚洲毛片 | 国产亚洲美女精品久久久2020 | 性欧美牲交xxxxx视频 | 一本精品99久久精品77 | 国产午夜亚洲精品不卡 | 蜜桃视频插满18在线观看 | 精品一区二区三区波多野结衣 | 人妻天天爽夜夜爽一区二区 | 国产综合色产在线精品 | 精品一区二区三区波多野结衣 | 天天综合网天天综合色 | 亚拍精品一区二区三区探花 | 波多野42部无码喷潮在线 | 欧美亚洲日韩国产人成在线播放 | 大色综合色综合网站 | 在线欧美精品一区二区三区 | 18精品久久久无码午夜福利 | 亚洲欧洲中文日韩av乱码 | 全黄性性激高免费视频 | 国产在线精品一区二区高清不卡 | www国产精品内射老师 | 成熟妇人a片免费看网站 | 无人区乱码一区二区三区 | 国产亚洲tv在线观看 | 日韩精品a片一区二区三区妖精 | 久久zyz资源站无码中文动漫 | 亚洲熟妇自偷自拍另类 | 亚洲人成无码网www | 色窝窝无码一区二区三区色欲 | 麻豆av传媒蜜桃天美传媒 | 亚洲欧美日韩综合久久久 | 免费看少妇作爱视频 | 真人与拘做受免费视频 | 亚洲精品中文字幕久久久久 | 亚洲精品一区三区三区在线观看 | 欧美午夜特黄aaaaaa片 | 国产三级久久久精品麻豆三级 | 日日鲁鲁鲁夜夜爽爽狠狠 | 色欲av亚洲一区无码少妇 | 久久久久久久久888 | 内射欧美老妇wbb | 欧美怡红院免费全部视频 | 99国产精品白浆在线观看免费 | 欧美精品国产综合久久 | 亚洲自偷精品视频自拍 | 女人和拘做爰正片视频 | 精品国产aⅴ无码一区二区 | 欧美性猛交xxxx富婆 | 国产一精品一av一免费 | 99国产欧美久久久精品 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美35页视频在线观看 | 无码精品国产va在线观看dvd | 无码人妻丰满熟妇区五十路百度 | 亚洲精品午夜国产va久久成人 | 老熟女乱子伦 | 精品国产一区二区三区四区 | 国产凸凹视频一区二区 | 国产成人一区二区三区在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 人人澡人人透人人爽 | 男女性色大片免费网站 | 99精品国产综合久久久久五月天 | 中文字幕久久久久人妻 | 好屌草这里只有精品 | 无码av最新清无码专区吞精 | 国产精品成人av在线观看 | 亚洲日韩一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 国产极品视觉盛宴 | 激情人妻另类人妻伦 | 国模大胆一区二区三区 | 国产熟妇另类久久久久 | 日本免费一区二区三区最新 | 中文字幕乱码中文乱码51精品 | 精品无人区无码乱码毛片国产 | 亚洲国产综合无码一区 | 久久99精品国产麻豆蜜芽 | 无码av免费一区二区三区试看 | 国产亚洲精品久久久久久久 | 亚洲中文字幕乱码av波多ji | 无码av中文字幕免费放 | 久久久久亚洲精品男人的天堂 | 亚洲欧美国产精品专区久久 | 色窝窝无码一区二区三区色欲 | 扒开双腿吃奶呻吟做受视频 | 国精品人妻无码一区二区三区蜜柚 | 久久人人爽人人爽人人片ⅴ | 国产亚洲视频中文字幕97精品 | 亚洲精品综合五月久久小说 | 99国产精品白浆在线观看免费 | 国产亚洲精品久久久久久大师 | 人妻中文无码久热丝袜 | 国产手机在线αⅴ片无码观看 | 日韩欧美群交p片內射中文 | 久久精品人人做人人综合试看 | 国产卡一卡二卡三 | 久久久婷婷五月亚洲97号色 | 鲁鲁鲁爽爽爽在线视频观看 | 丰满少妇女裸体bbw | 久久久久久av无码免费看大片 | 成熟妇人a片免费看网站 | 四十如虎的丰满熟妇啪啪 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产精品怡红院永久免费 | 亚洲精品一区二区三区四区五区 | 国产又粗又硬又大爽黄老大爷视 | 国产小呦泬泬99精品 | 荡女精品导航 | 性色欲情网站iwww九文堂 | 久久国产自偷自偷免费一区调 | 国产av一区二区精品久久凹凸 | 精品亚洲韩国一区二区三区 | 精品久久久无码人妻字幂 | 澳门永久av免费网站 | 国产又粗又硬又大爽黄老大爷视 | 久久综合激激的五月天 | 国产两女互慰高潮视频在线观看 | 国产亚洲欧美日韩亚洲中文色 | 婷婷色婷婷开心五月四房播播 | 曰韩无码二三区中文字幕 | 成人一区二区免费视频 | 国产精品嫩草久久久久 | 国产亚洲欧美在线专区 | 亚洲中文字幕va福利 | 国产成人无码a区在线观看视频app | 偷窥村妇洗澡毛毛多 | www成人国产高清内射 | 亚洲精品中文字幕久久久久 | 99国产精品白浆在线观看免费 | 男人的天堂2018无码 | 久久久成人毛片无码 | 粗大的内捧猛烈进出视频 | av无码不卡在线观看免费 | 无码人妻黑人中文字幕 | 精品亚洲韩国一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产农村乱对白刺激视频 | 无码乱肉视频免费大全合集 | 国产美女精品一区二区三区 | 国产一区二区三区影院 | аⅴ资源天堂资源库在线 | 亚洲中文字幕成人无码 | 亚洲国产精品无码久久久久高潮 | 精品国产一区二区三区av 性色 | 四虎国产精品免费久久 | 草草网站影院白丝内射 | 人妻无码久久精品人妻 | 亚洲国产精品久久久天堂 | 永久黄网站色视频免费直播 | 久久www免费人成人片 | 中文久久乱码一区二区 | 日韩精品a片一区二区三区妖精 | 丰满人妻一区二区三区免费视频 | 久久久久免费看成人影片 | 精品偷自拍另类在线观看 | 国产成人午夜福利在线播放 | 少妇被粗大的猛进出69影院 | 午夜精品一区二区三区的区别 | 色一情一乱一伦 | 夫妻免费无码v看片 | 亚洲日本va午夜在线电影 | 76少妇精品导航 | 国产亚洲精品精品国产亚洲综合 | 97夜夜澡人人爽人人喊中国片 | 未满小14洗澡无码视频网站 | 激情综合激情五月俺也去 |