3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核调用串口,linux驱动之串口驱动框架

發(fā)布時間:2024/8/1 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核调用串口,linux驱动之串口驱动框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

前面介紹了 Linux內核 的 2 個驅動框架—— I2C 和 SPI ,這 2 個框架相對簡單一些,直來直去,沒有比較難以理解的點,層次分明。而今天我們要講述的是我們熟悉的 串口驅動,該驅動加框也較之之前的驅動來說,復雜了許多。串口 是我們常用的通訊手段,但其軟件框架在 Linux內核 中非常復雜。當然,這里面也有歷史原因在。本文將簡單地介紹 UART驅動框架,希望能夠幫助各位讀者。

二、UART驅動

2.1 tty簡介

串口(UART) 通常是以 tty驅動 的形式在用戶層表現(xiàn)出來,那么我們首先需要知道 tty 是什么東西。

tty 是 Linux系統(tǒng) 中出現(xiàn)得最多的一種設備類型,可以直接查看 /dev目錄 下,往往可以看到多個 tty設備節(jié)點。要了解 tty設備 就需要從歷史的角度說起。

在計算機系統(tǒng)中,終端 是 電子設備,用于向系統(tǒng)輸入數(shù)據(jù),或者接收系統(tǒng)發(fā)送的數(shù)據(jù)并顯示出來,所以該設備的作用是用于 人機交互。而 電傳打字機(Teletype) 是一種久遠的 遠距離信息傳送設備,其通過 鍵盤 輸入數(shù)據(jù),通過 印字機器 顯示接收到的數(shù)據(jù)。電傳打字機 就是一種典型的 終端,其英語簡稱即 tty。

按照筆者的理解,tty 即用于與 用戶 交互的設備,其向計算機系統(tǒng)輸入數(shù)據(jù),也接收來自計算機系統(tǒng)的數(shù)據(jù)。有興趣的讀者可以參考鏈接中的文章 Linux TTY framework(1)_基本概念。

對于 Linux系統(tǒng) 來說,通過 串口 連接的設備一般都可以作為 終端設備。經過日積月累,終端、tty、串口等概念逐漸不再去分。一般來講,所有 串口設備 都是 tty設備,而 tty設備 除了 串口外還有其他的具體形式,比如 虛擬終端 、偽終端等。

其實這里還涉及到一個概念 控制臺(console),但本文目前不做講述,后續(xù)有機會再寫相關文章。

2.2 串口tty框架

在講解相關細節(jié)之前,我們需要對 串口tty驅動 有個整體性的認識,這樣有非常助于后面理解代碼細節(jié)。在看細節(jié)之前,我們需要知道:

整個驅動的整體架構是如何組織的

數(shù)據(jù)結構之間的關系是如何

函數(shù)的傳遞是如何遞進的

下面將展示一張圖,該圖有助于我們理解

串口tty驅動框架圖

我們可以看到:

從左往右 看,整個驅動可以分為 3個層次,分為為 字符設備層、tty層 和 串口硬件層。

字符設備層 是 tty驅動 作為 字符設備 直接與應用層進行交互,中間通過 tty層 進行抽象,使得底層的具體形式可以被解耦。最終是底層硬件的 串口層,該層負責數(shù)據(jù)的設備之間的交互及一系列管理操作的具體實現(xiàn)。

從上往下 看,驅動主要由幾個數(shù)據(jù)結構組成,分別為 UART_driver、UART_state 和 tty_driver。UART_driver 是全局的 根數(shù)據(jù)結構,所有的結構體都由其來進行保存和控制。tty_driver 則是對 tty層的具體實現(xiàn),最后 UART_state 和 Uart_pot 則是底層驅動的具體實現(xiàn)。

2.3 串口tty驅動

本節(jié)將對代碼進行講述,其中我們選擇 8250 這個串口IP的代碼作為示例來進行講述。當然只是為了學習驅動的實現(xiàn),其他的串口驅動讀者可以按照自己的理解再去閱讀。

本節(jié)會分別按照 初始化 和 讀/寫 來進行講述。

2.3.1 串口硬件初始化

串口驅動的框架一大部分是在初始化階段進行,對 初始化 進行梳理是必要的階段。下面先來看看代碼調用圖譜。

首先是對 UART_driver結構體 進行創(chuàng)建和相關初始化,其負責高度的軟件抽象和相關軟件邏輯。其代碼調用圖譜如下:

->serial8250_init

->serial8250_isa_init_ports(初始化serial8250_ports,數(shù)據(jù)類型為uart_8250_port)

->serial8250_init_port(將serial8250_pops賦值給uart_port->ops)

->univ8250_rsa_support

->uart_register_driver(注冊uart_driver,即全局變量serial8250_reg,將uart_ops設置給tty_driver)

->alloc_tty_driver(分配uart_driver->uart_state)

->tty_port_init(初始化uart_driver->uart_state->tty_port,tty_port的操作集為uart_port_ops)

->tty_register_driver(注冊tty_driver,將tty_driver加入全局鏈表tty_drivers)

/* 8250_core */

/* 初始化8250串口框架 */

module_init(serial8250_init);

static int __init serial8250_init(void)

{

int ret;

......

/* 初始化各個串口的UART_port數(shù)據(jù)結構 */

serial8250_isa_init_ports();

......

/* 注冊UART驅動即UART_driver */

serial8250_reg.nr = UART_NR;

ret = uart_register_driver(&serial8250_reg);

......

serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);

......

}

/* 初始化各個串口的UART_port數(shù)據(jù)結構 */

static void __init serial8250_isa_init_ports(void)

{

struct uart_8250_port *up;

static int first = 1;

int i, irqflag = 0;

......

/* 初始化每個UART_port的操作函數(shù)集 */

for (i = 0; i < nr_uarts; i++) {

struct uart_8250_port *up = &serial8250_ports[i];

struct uart_port *port = &up->port;

/* 設置當前UART_port的編號 */

port->line = i;

/* 初始化UART_port的ops成員 */

serial8250_init_port(up);

{

struct uart_port *port = &up->port;

port->ops = &serial8250_pops;

......

}

/* 此時port->ops為serial8250_pops,所以base_ops指向了serial8250_pops */

if (!base_ops)

base_ops = port->ops;

/* 將UART_port的ops成員指向univ8250_port_ops */

port->ops = &univ8250_port_ops;

......

/* 設置uart_8250_port的ops成員指向了univ8250_driver_ops,該成員在設置中斷時有用到 */

up->ops = &univ8250_driver_ops;

......

}

/*

univ8250_port_ops的成員賦值為*base_ops指向的地址,即serial8250_pops

所以此時UART_port的ops成員指向serial8250_pops

*/

univ8250_port_ops = *base_ops;

/* 設置UART_port->ops的部分成員 */

univ8250_rsa_support(&univ8250_port_ops);

{

ops->config_port = univ8250_config_port;

ops->request_port = univ8250_request_port;

ops->release_port = univ8250_release_port;

}

......

}

/* 注冊UART_driver驅動 */

int uart_register_driver(struct uart_driver *drv)

{

struct tty_driver *normal;

int i, retval;

/* 為UART_driver的每個UART_state分配空間,每個串口硬件都有UART_state */

drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);

......

/* 為串口驅動UART_driver分配一個tty_driver */

normal = alloc_tty_driver(drv->nr);

{

struct tty_driver *ret = tty_alloc_driver(lines, 0);

......

return ret;

}

......

/* 設置UART_driver的tty_driver成員 */

drv->tty_driver = normal;

/* 初始化相關成員 */

normal->driver_name = drv->driver_name;

normal->name = drv->dev_name;

/* 這里的設備號會在后續(xù)的open過程中使用到 */

normal->major = drv->major;

normal->minor_start = drv->minor;

normal->type = TTY_DRIVER_TYPE_SERIAL;

normal->subtype = SERIAL_TYPE_NORMAL;

normal->init_termios = tty_std_termios;

normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;

normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;

normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;

normal->driver_state = drv;

/* 設置tty_driver的ops成員指向struct tty_operations uart_ops */

tty_set_operations(normal, &uart_ops);

{

driver->ops = op;

};

/* 初始化每個UART_state的tty_port成員 */

for (i = 0; i < drv->nr; i++) {

struct uart_state *state = drv->state + i;

struct tty_port *port = &state->port;

/* 初始化每個tty_port */

tty_port_init(port);

{

memset(port, 0, sizeof(*port));

tty_buffer_init(port);

/* 以下為tty_buffer_init函數(shù)體 */

{

struct tty_bufhead *buf = &port->buf;

mutex_init(&buf->lock);

tty_buffer_reset(&buf->sentinel, 0);

buf->head = &buf->sentinel;

buf->tail = &buf->sentinel;

init_llist_head(&buf->free);

atomic_set(&buf->mem_used, 0);

atomic_set(&buf->priority, 0);

INIT_WORK(&buf->work, flush_to_ldisc);//該work_queue,后面的讀取數(shù)據(jù)的時候要用到

buf->mem_limit = TTYB_DEFAULT_MEM_LIMIT;

}

init_waitqueue_head(&port->open_wait);

init_waitqueue_head(&port->delta_msr_wait);

mutex_init(&port->mutex);

mutex_init(&port->buf_mutex);

spin_lock_init(&port->lock);

port->close_delay = (50 * HZ) / 100;

port->closing_wait = (3000 * HZ) / 100;

/* 設置tty_port的client_ops指向default_client_ops,會在接收和發(fā)送數(shù)據(jù)時使用到 */

port->client_ops = &default_client_ops;

kref_init(&port->kref);

}

/* 設置tty_port的ops成員指向uart_port_ops */

port->ops = &uart_port_ops;

}

retval = tty_register_driver(normal);

......

}

/* 注冊tty_driver驅動 */

int tty_register_driver(struct tty_driver *driver)

{

int error;

int i;

dev_t dev;

struct device *d;

/* 分配設備好 */

if (!driver->major) {

error = alloc_chrdev_region(&dev, driver->minor_start,

driver->num, driver->name);

if (!error) {

driver->major = MAJOR(dev);

driver->minor_start = MINOR(dev);

}

} else {

dev = MKDEV(driver->major, driver->minor_start);

error = register_chrdev_region(dev, driver->num, driver->name);

}

if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) {

/* 添加tty的字符設備 */

error = tty_cdev_add(driver, dev, 0, driver->num);

{

int err;

driver->cdevs[index] = cdev_alloc();

......

/* 設置字符設備的操作集為tty_fops,該操作集用于tty設備和應用層交互 */

driver->cdevs[index]->ops = &tty_fops;

driver->cdevs[index]->owner = driver->owner;

/* 添加字符設備 */

err = cdev_add(driver->cdevs[index], dev, count);

......

return err;

}

......

}

/* 將當前的tty_driver添加全局的tty_drivers鏈表 */

mutex_lock(&tty_mutex);

list_add(&driver->tty_drivers, &tty_drivers);

mutex_unlock(&tty_mutex);

/* 注冊每一個tty設備 */

if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {

for (i = 0; i < driver->num; i++) {

d = tty_register_device(driver, i, NULL);

......

}

}

}

......

return 0;

......

}

上面是針對 8250串口核心 做的一些基本的初始化。按照筆者理解,在實際應用中用戶有可能需要加載其他串口驅動來修改串口的一些屬性,所以當用戶執(zhí)行驅動裝載時有以下的初始化步驟,同樣也是針對 UART_port 和 UART_state 的初始化和操作。其調用譜圖和代碼示例如下:

dw8250_probe

->serial8250_register_8250_port

->serial8250_find_match_or_unused(從全局serial8250_ports找出可以使用的元素,該元素可以理解為uart_port)

->uart_add_one_port(填充uart_port)

->tty_port_register_device_attr_serdev

->tty_port_link_device

->tty_register_device_attr

->tty_cdev_add(將tty_ops賦給tty_driver的cdec成員)

/* 初始化用戶的串口硬件模塊 */

static int dw8250_probe(struct platform_device *pdev)

{

struct uart_8250_port uart = {};

struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);

int irq = platform_get_irq(pdev, 0);

struct uart_port *p = &uart.port;

struct device *dev = &pdev->dev;

struct dw8250_data *data;

int err;

u32 val;

......

/* 對p指向uart_port結構體進行初始化,根據(jù)用戶自己的進行設置 */

spin_lock_init(&p->lock);

p->mapbase = regs->start;

p->irq = irq; //串口中斷號

p->handle_irq = dw8250_handle_irq; //串口中斷處理函數(shù),會在串口中斷時執(zhí)行

p->pm = dw8250_do_pm;

p->type = PORT_8250;

p->flags = UPF_SHARE_IRQ | UPF_FIXED_PORT;

p->dev = dev;

p->iotype = UPIO_MEM;

p->serial_in = dw8250_serial_in; //串口輸入寄存器設置函數(shù)

p->serial_out = dw8250_serial_out; //串口輸出寄存器設置函數(shù)

p->set_ldisc = dw8250_set_ldisc; //串口線路規(guī)程設置函數(shù)

p->set_termios = dw8250_set_termios; //串口中斷參數(shù)規(guī)程設置函數(shù)

/* 設置寄存器地址 */

p->membase = devm_ioremap(dev, regs->start, resource_size(regs));

......

/* 分配私有數(shù)據(jù) */

data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);

......

data->dma.fn = dw8250_fallback_dma_filter;

data->usr_reg = DW_UART_USR;

p->private_data = data;

......

/* 注冊用戶自己的串口驅動 */

data->line = serial8250_register_8250_port(&uart);

if (data->line < 0) {

err = data->line;

goto err_reset;

}

......

}

/* 注冊用戶的串口驅動 */

int serial8250_register_8250_port(struct uart_8250_port *up)

{

struct uart_8250_port *uart;

int ret = -ENOSPC;

......

mutex_lock(&serial_mutex);

/* 從8250_core中找出一個沒有用且匹配的uart_8250_port */

uart = serial8250_find_match_or_unused(&up->port);

/* 對uart_8250_port 進行初始化 */

if (uart && uart->port.type != PORT_8250_CIR) {

......

/* 初始化找到的uart_port數(shù)據(jù)結構uart->port為uart_port數(shù)據(jù)結構 */

uart->port.iobase = up->port.iobase;

uart->port.membase = up->port.membase;

uart->port.irq = up->port.irq;

uart->port.irqflags = up->port.irqflags;

uart->port.uartclk = up->port.uartclk;

uart->port.fifosize = up->port.fifosize;

uart->port.regshift = up->port.regshift;

uart->port.iotype = up->port.iotype;

uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF;

uart->bugs = up->bugs;

uart->port.mapbase = up->port.mapbase;

uart->port.mapsize = up->port.mapsize;

uart->port.private_data = up->port.private_data;

uart->tx_loadsz = up->tx_loadsz;

uart->capabilities = up->capabilities;

uart->port.throttle = up->port.throttle;

uart->port.unthrottle = up->port.unthrottle;

uart->port.rs485_config = up->port.rs485_config;

uart->port.rs485 = up->port.rs485;

uart->dma = up->dma;

if (uart->port.fifosize && !uart->tx_loadsz)

uart->tx_loadsz = uart->port.fifosize;

if (up->port.dev)

uart->port.dev = up->port.dev;

if (up->port.flags & UPF_FIXED_TYPE)

uart->port.type = up->port.type;

/* 設置uart_port的默認屬性 */

serial8250_set_defaults(uart);

if (up->port.serial_in)

uart->port.serial_in = up->port.serial_in;

if (up->port.serial_out)

uart->port.serial_out = up->port.serial_out;

if (up->port.handle_irq)

uart->port.handle_irq = up->port.handle_irq;

if (up->port.set_termios)

uart->port.set_termios = up->port.set_termios;

if (up->port.set_ldisc)

uart->port.set_ldisc = up->port.set_ldisc;

if (up->port.get_mctrl)

uart->port.get_mctrl = up->port.get_mctrl;

if (up->port.set_mctrl)

uart->port.set_mctrl = up->port.set_mctrl;

if (up->port.startup)

uart->port.startup = up->port.startup;

if (up->port.shutdown)

uart->port.shutdown = up->port.shutdown;

if (up->port.pm)

uart->port.pm = up->port.pm;

if (up->port.handle_break)

uart->port.handle_break = up->port.handle_break;

if (up->dl_read)

uart->dl_read = up->dl_read;

if (up->dl_write)

uart->dl_write = up->dl_write;

if (uart->port.type != PORT_8250_CIR) {

if (serial8250_isa_config != NULL)

serial8250_isa_config(0, &uart->port,

&uart->capabilities);

.....

/* 將新的uart_port添加到uart_driver */

ret = uart_add_one_port(&serial8250_reg, &uart->port);

if (ret == 0)

ret = uart->port.line;

} else {

dev_info(uart->port.dev,

"skipping CIR port at 0x%lx / 0x%llx, IRQ %d\n",

uart->port.iobase,

(unsigned long long)uart->port.mapbase,

uart->port.irq);

ret = 0;

}

}

mutex_unlock(&serial_mutex);

return ret;

}

/* 把一個uart_port添加到uart_driver */

int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)

{

struct uart_state *state;

struct tty_port *port;

int ret = 0;

struct device *tty_dev;

int num_groups;

/* 根據(jù)串口編號獲取對應的uart_state和uart_port */

state = drv->state + uport->line;

port = &state->port;

......

/* 設置新的uart_port到uart_state中,并將對uart_port的state成員進行賦值 */

state->uart_port = uport;

uport->state = state;

......

/* 分配并設置屬性組 */

uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),

GFP_KERNEL);

if (!uport->tty_groups) {

ret = -ENOMEM;

goto out;

}

uport->tty_groups[0] = &tty_dev_attr_group;

if (uport->attr_group)

uport->tty_groups[1] = uport->attr_group;

/* 將新的uart_port及其屬性注冊到內核中 */

tty_dev = tty_port_register_device_attr_serdev(port, drv->tty_driver,

uport->line, uport->dev, port, uport->tty_groups);

......

}

struct device *tty_port_register_device_attr_serdev(struct tty_port *port,

struct tty_driver *driver, unsigned index,

struct device *device, void *drvdata,

const struct attribute_group **attr_grp)

{

struct device *dev;

/* 該函數(shù)設置tty_drvier的tty_port成員,建立聯(lián)系 */

tty_port_link_device(port, driver, index);

{

if (WARN_ON(index >= driver->num))

return;

driver->ports[index] = port;

}

/* 該函數(shù)會設置tty_port的一部分成員 */

dev = serdev_tty_port_register(port, device, driver, index);

{

/* 設置tty_port的client_ops成員 */

port->client_ops = &client_ops;

}

/* 注冊tty_port對應的device */

return tty_register_device_attr(driver, index, device, drvdata,

attr_grp);

}

......

struct device *tty_register_device_attr(struct tty_driver *driver,

unsigned index, struct device *device,

void *drvdata,

const struct attribute_group **attr_grp)

{

char name[64];

dev_t devt = MKDEV(driver->major, driver->minor_start) + index;

struct ktermios *tp;

struct device *dev;

int retval;

......

dev = kzalloc(sizeof(*dev), GFP_KERNEL);

......

/* 設置dev的相關屬性 */

dev->devt = devt;

dev->class = tty_class;

dev->parent = device;

dev->release = tty_device_create_release;

dev_set_name(dev, "%s", name);

dev->groups = attr_grp;

dev_set_drvdata(dev, drvdata);

......

/* 注冊dev */

retval = device_register(dev);

if (retval)

goto err_put;

if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {

......

/* 添加tty_driver的cdev,該函數(shù)在前面已經出現(xiàn)過,這里的cdev是對應新的tty_port */

retval = tty_cdev_add(driver, devt, index, 1);

if (retval)

goto err_del;

}

......

}

前面我們簡單的過了一遍 8250串口核心 和 8250串口硬件 的初始化流程。在初始化以后,數(shù)據(jù)結構就如 串口tty驅動框架圖 所示。當然以上內容刪減了許多細節(jié),有興趣的讀者可以閱讀源碼加深理解。

2.3.2 串口使用流程

相比于 初始化,理解 串口讀取 的難度會更加高一些,以為讀寫過程會更加復雜,希望筆者的一點筆墨可以幫助大家稍微理解一下其過程。

這里需要先知道,串口讀取 一般是由 2 個線程來完成:

前臺線程:即用戶在應用空間使用 read 等系統(tǒng)調用的線程,該線程在進入內核空間會執(zhí)行相關的函數(shù)進行等待。當時機成熟時由 后臺線程 進行喚醒并讀取相關數(shù)據(jù)到應用恐案件。

后臺線程:由 串口驅動 在初始化時會定義一個線程,由該線程在中斷有數(shù)據(jù)時進行讀寫。并把讀取到的數(shù)據(jù)存放在某個緩存中,最后會喚醒 前臺線程 去讀取這個緩存中的數(shù)據(jù)。

在講解線程的執(zhí)行之前需要知道 中斷的初始化及其處理函數(shù),因為 串口讀取 與 中斷 密不可分。下面會先講述 中斷初始化及其處理,然后再講述 讀取的前臺及后臺線程。

2.3.2.1 打開串口

串口中斷 的設置是在串口打開時設置的,所以我們直接查看串口打開時的調用圖譜及代碼即可知道相關內容,如下所示:

tty_open(struct file_operations tty_fops)

/* 申請并初始化相關結構體 */

->tty_open_by_driver

->tty_init_dev

->alloc_tty_struct

->tty_ldisc_init(設置默認線路規(guī)程為N_TTY)

/* 執(zhí)行open操作,比如設置寄存器或者中斷等 */

->uart_open

->tty_port_open

->uart_port_activate

->uart_startup

->uart_port_startup

->serial8250_startup

->serial8250_do_startup

->setup_irq(univ8250_setup_irq)

->serial_link_irq_chain

->request_irq(serial8250_interrupt)

可以看到,打開的流程很長,其調用圖譜也非常的深,我們逐步看一下代碼吧

/* 在前面的章節(jié)中可以看到,tty_open是tty設備使用字符設備cdev對外的接口,當我們打開 */

static int tty_open(struct inode *inode, struct file *filp)

{

struct tty_struct *tty;

int noctty, retval;

dev_t device = inode->i_rdev;

unsigned saved_flags = filp->f_flags;

......

/* 分配一個tty_file_private結構體并賦值給文件的private_data成員 */

retval = tty_alloc_file(filp);

{

struct tty_file_private *priv;

priv = kmalloc(sizeof(*priv), GFP_KERNEL);

......

file->private_data = priv;

return 0;

}

......

/*

根據(jù)內核注釋,tty_open_current_tty用于獲取當前tty設備的鎖,但從函數(shù)命名和返回值來看這應該是另一種說法

根據(jù)筆者理解,這里應該獲取當前tty設備的tty_struct結構體

如果獲取失敗則表明當前的tty設備沒有打開,需要調用tty_open_by_driver重新打開

*/

tty = tty_open_current_tty(device, filp);

if (!tty)

tty = tty_open_by_driver(device, inode, filp);

......

/* 將當前文件的私有數(shù)據(jù)即tty_file_private成員進行填充,再將其鏈入tty_stuct的tty_files鏈表 */

tty_add_file(tty, filp);

{

struct tty_file_private *priv = file->private_data;

priv->tty = tty;

priv->file = file;

spin_lock(&tty->files_lock);

list_add(&priv->list, &tty->tty_files);

spin_unlock(&tty->files_lock);

}

......

/* tty_struct結構題的ops成員(sturct tty_operations)中的open函數(shù),即uart_open */

if (tty->ops->open)

retval = tty->ops->open(tty, filp);

else

retval = -ENODEV;

filp->f_flags = saved_flags;

......

}

static struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode,

struct file *filp)

{

struct tty_struct *tty;

struct tty_driver *driver = NULL;

int index = -1;

int retval;

mutex_lock(&tty_mutex);

/* 根據(jù)設備好找到對應的tty_driver */

driver = tty_lookup_driver(device, filp, &index);

......

/* 檢查我們是否重復打開tty */

tty = tty_driver_lookup_tty(driver, filp, index);

......

/* 如果重復打開則執(zhí)行該分支 */

if (tty) {

if (tty_port_kopened(tty->port)) {

tty_kref_put(tty);

mutex_unlock(&tty_mutex);

tty = ERR_PTR(-EBUSY);

goto out;

}

mutex_unlock(&tty_mutex);

retval = tty_lock_interruptible(tty);

tty_kref_put(tty); /* drop kref from tty_driver_lookup_tty() */

if (retval) {

if (retval == -EINTR)

retval = -ERESTARTSYS;

tty = ERR_PTR(retval);

goto out;

}

retval = tty_reopen(tty);

if (retval < 0) {

tty_unlock(tty);

tty = ERR_PTR(retval);

}

} else {

/* 沒有重復打開則初始化出一個tty_struct */

tty = tty_init_dev(driver, index);

mutex_unlock(&tty_mutex);

}

......

return tty;

}

struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)

{

struct tty_struct *tty;

int retval;

......

/* 分配tty_struct結構體并初始化,該函數(shù)比較重要 */

......

tty_lock(tty);

/* 該函數(shù)主要講tty_struct的地址鏈接到tty_driver的成員中 */

retval = tty_driver_install_tty(driver, tty);

if (retval < 0)

goto err_free_tty;

/* 復制tty_struct中的tty_port成員 */

if (!tty->port)

tty->port = driver->ports[idx];

......

tty->port->itty = tty;

/* 調用線程規(guī)程并打開 */

retval = tty_ldisc_setup(tty, tty->link);

/* 以下為tty_ldisc_setup函數(shù)體 */

{

int retval = tty_ldisc_open(tty, tty->ldisc);

if (retval)

return retval;

if (o_tty) {

retval = tty_ldisc_open(o_tty, o_tty->ldisc);

if (retval) {

tty_ldisc_close(tty, tty->ldisc);

return retval;

}

}

return 0;

}

......

/* Return the tty locked so that it cannot vanish under the caller */

return tty;

......

}

/* 分配并初始化tty_struct */

struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)

{

struct tty_struct *tty;

tty = kzalloc(sizeof(*tty), GFP_KERNEL);

if (!tty)

return NULL;

kref_init(&tty->kref);

tty->magic = TTY_MAGIC;

/* 初始化線路規(guī)程 */

tty_ldisc_init(tty);

/* 以下為tty_ldisc_init函數(shù)體 */

{

/* 線路規(guī)程初始化為N_TTY */

struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);

if (IS_ERR(ld))

panic("n_tty: init_tty");

tty->ldisc = ld;

}

tty->session = NULL;

tty->pgrp = NULL;

mutex_init(&tty->legacy_mutex);

mutex_init(&tty->throttle_mutex);

init_rwsem(&tty->termios_rwsem);

mutex_init(&tty->winsize_mutex);

init_ldsem(&tty->ldisc_sem);

init_waitqueue_head(&tty->write_wait);

init_waitqueue_head(&tty->read_wait);

INIT_WORK(&tty->hangup_work, do_tty_hangup);

mutex_init(&tty->atomic_write_lock);

spin_lock_init(&tty->ctrl_lock);

spin_lock_init(&tty->flow_lock);

spin_lock_init(&tty->files_lock);

INIT_LIST_HEAD(&tty->tty_files);

INIT_WORK(&tty->SAK_work, do_SAK_work);

tty->driver = driver;

tty->ops = driver->ops;

tty->index = idx;

tty_line_name(driver, idx, tty->name);

tty->dev = tty_get_device(tty);

return tty;

}

static int uart_open(struct tty_struct *tty, struct file *filp)

{

struct uart_driver *drv = tty->driver->driver_state;

int retval, line = tty->index;

struct uart_state *state = drv->state + line;

/* 設置tty_struct的driver_data成員為uart_state */

tty->driver_data = state;

/* 打開tty_port */

retval = tty_port_open(&state->port, tty, filp);

if (retval > 0)

retval = 0;

return retval;

}

int tty_port_open(struct tty_port *port, struct tty_struct *tty,

struct file *filp)

{

spin_lock_irq(&port->lock);

++port->count;

spin_unlock_irq(&port->lock);

tty_port_tty_set(port, tty);

/* 只有在硬件沒有初始化好的情況才能打開設備 */

mutex_lock(&port->mutex);

/* 檢測tty_port是否初始化過 */

if (!tty_port_initialized(port)) {

clear_bit(TTY_IO_ERROR, &tty->flags);

if (port->ops->activate) {

/* 執(zhí)行tty_port的activate方法,即uart_port_ops中的uart_port_activate方法 */

int retval = port->ops->activate(port, tty);

if (retval) {

mutex_unlock(&port->mutex);

return retval;

}

}

tty_port_set_initialized(port, 1);

}

mutex_unlock(&port->mutex);

return tty_port_block_til_ready(port, tty, filp);

}

/* 使能uart_port */

static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)

{

struct uart_state *state = container_of(port, struct uart_state, port);

struct uart_port *uport;

......

/* 啟動uart串口 */

return uart_startup(tty, state, 0);

}

/* 啟動串口 */

static int uart_startup(struct tty_struct *tty, struct uart_state *state,

int init_hw)

{

struct tty_port *port = &state->port;

int retval;

/* 檢查串口是否有初始化 */

if (tty_port_initialized(port))

return 0;

/* 執(zhí)行uart_port_startup */

retval = uart_port_startup(tty, state, init_hw);

......

return retval;

}

static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,

int init_hw)

{

struct uart_port *uport = uart_port_check(state);

unsigned long page;

int retval = 0;

......

/* 確保已經開辟了傳輸緩存 */

if (!state->xmit.buf) {

/* 如果沒有則獲取并賦值 */

page = get_zeroed_page(GFP_KERNEL);

if (!page)

return -ENOMEM;

state->xmit.buf = (unsigned char *) page;

uart_circ_clear(&state->xmit);

}

/* 執(zhí)行uart_port的startup函數(shù),即serial8250_pops的serial8250_startup */

retval = uport->ops->startup(uport);

/* 以下為serial8250_startup 函數(shù)體 */

{

if (port->startup)

return port->startup(port);

return serial8250_do_startup(port);

}

if (retval == 0) {

......

/* 初始化串口的硬件設置 */

uart_change_speed(tty, state, NULL);

/* 設置串口的RTS和DTR信號 */

if (init_hw && C_BAUD(tty))

uart_port_dtr_rts(uport, 1);

}

......

return retval;

}

int serial8250_do_startup(struct uart_port *port)

{

struct uart_8250_port *up = up_to_u8250p(port);

unsigned long flags;

unsigned char lsr, iir;

int retval;

/* 省略的部分語句為根據(jù)端口類型設置硬件寄存器,不在本文的講述范圍內,有興趣的讀者可以閱讀源碼 */

......

/*

* For the Altera 16550 variants, set TX threshold trigger level.

*/

if (((port->type == PORT_ALTR_16550_F32) ||

(port->type == PORT_ALTR_16550_F64) ||

(port->type == PORT_ALTR_16550_F128)) && (port->fifosize > 1)) {

/* Bounds checking of TX threshold (valid 0 to fifosize-2) */

if ((up->tx_loadsz < 2) || (up->tx_loadsz > port->fifosize)) {

pr_err("ttyS%d TX FIFO Threshold errors, skipping\n",

serial_index(port));

} else {

serial_port_out(port, UART_ALTR_AFR,

UART_ALTR_EN_TXFIFO_LW);

serial_port_out(port, UART_ALTR_TX_LOW,

port->fifosize - up->tx_loadsz);

port->handle_irq = serial8250_tx_threshold_handle_irq;

}

}

if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) {

unsigned char iir1;

/*

當發(fā)送器是空閑并且中斷已經被清除時,需要測試UART不要讓它再次聲明發(fā)送中斷。

實際上當發(fā)送器是空閑且允許中斷時,16500 應該總是重新聲明該中斷。

為了讓改變寄存器生效,需要加入必要的延時。

*/

/* 關閉中斷 */

spin_lock_irqsave(&port->lock, flags);

if (up->port.irqflags & IRQF_SHARED)

disable_irq_nosync(port->irq);

/* 設置寄存器 */

wait_for_xmitr(up, UART_LSR_THRE);

serial_port_out_sync(port, UART_IER, UART_IER_THRI);

/* 延遲并等待寄存器生效 */

udelay(1);

/* 設置寄存器 */

iir1 = serial_port_in(port, UART_IIR);

serial_port_out(port, UART_IER, 0);

serial_port_out_sync(port, UART_IER, UART_IER_THRI);

/* 延遲并等待寄存器生效 */

udelay(1);

iir = serial_port_in(port, UART_IIR);

serial_port_out(port, UART_IER, 0);

/* 使能中斷 */

if (port->irqflags & IRQF_SHARED)

enable_irq(port->irq);

spin_unlock_irqrestore(&port->lock, flags);

/*

* If the interrupt is not reasserted, or we otherwise

* don't trust the iir, setup a timer to kick the UART

* on a regular basis.

*/

if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||

up->port.flags & UPF_BUG_THRE) {

up->bugs |= UART_BUG_THRE;

}

}

/* 調用uart_8250_port結構體中的setup_irq方法,即univ8250_driver_ops中的univ8250_setup_irq */

retval = up->ops->setup_irq(up);

if (retval)

goto out;

/* 初始化相關的硬件寄存器 */

......

}

/* 設置中斷 */

static int univ8250_setup_irq(struct uart_8250_port *up)

{

struct uart_port *port = &up->port;

int retval = 0;

......

if (!port->irq) {

} else

/* 如果設置了中斷號,則執(zhí)行serial_link_irq_chain */

retval = serial_link_irq_chain(up);

return retval;

}

static int serial_link_irq_chain(struct uart_8250_port *up)

{

struct hlist_head *h;

struct hlist_node *n;

struct irq_info *i;

int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;

......

if (i->head) {

......

} else {

......

/* 申請中斷 */

ret = request_irq(up->port.irq, serial8250_interrupt,

irq_flags, up->port.name, i);

if (ret < 0)

serial_do_unlink(i, up);

}

return ret;

}

總結而言,open流程 可以分為 2個部分:

申請并初始化結構體,比如 tty_struct

設置相關寄存器和初始化中斷

2.3.2.1 打開串口

上面講述了串口的 open流程,完成了中斷設置和寄存器設置。此時我們的應用線程開始讀取串口數(shù)據(jù)。那么讀取流程需要分開 2 個部分來講述:

中斷后臺進程:負責從硬件讀取數(shù)據(jù)存放到 buffer 中,并通過機制通知 用戶前臺進程 獲取數(shù)據(jù)。

用戶前臺進程:負責等待接收 buffer 中的數(shù)據(jù)

下面先講述 后臺中斷讀取,其調用圖譜如下:

/* 中斷設置,該部分以前在前文中講過,不再贅述 */

serial8250_init

->serial8250_isa_init_ports(up->ops = &univ8250_driver_ops;)

/* 中斷處理函數(shù) */

serial8250_interrupt

->handle_irq(dw8250_handle_irq,是在dw8250_probe設置的)

->serial8250_handle_irq

->serial8250_rx_chars

|->serial8250_read_char//從硬件中讀取數(shù)據(jù)到tty_buffer中

| ->uart_insert_char

| ->tty_insert_flip_char

| ->__tty_insert_flip_char

| ->__tty_buffer_request_room

| ->tty_buffer_alloc

|->tty_flip_buffer_push//將tty_buffer中數(shù)據(jù)投放到線路規(guī)程層(ldsc)的緩沖區(qū)中

| ->tty_schedule_flip

| ->flush_to_ldisc

| ->receive_buf

| ->tty_port_default_receive_buf(tty_port)

| ->tty_ldisc_receive_buf

| ->n_tty_receive_buf

下面直接看中斷代碼:

static irqreturn_t serial8250_interrupt(int irq, void *dev_id)

{

struct irq_info *i = dev_id;

struct list_head *l, *end = NULL;

int pass_counter = 0, handled = 0;

......

l = i->head;

/* 輪眉每個串口的中斷函數(shù) */

do {

struct uart_8250_port *up;

struct uart_port *port;

up = list_entry(l, struct uart_8250_port, list);

port = &up->port;

/* 執(zhí)行中斷函數(shù),也就是dw8250_handle_irq,該函數(shù)在dw8250_probe設置 */

if (port->handle_irq(port)) {

handled = 1;

end = NULL;

} else if (end == NULL)

end = l;

l = l->next;

......

} while (l != end);

......

return IRQ_RETVAL(handled);

}

static int dw8250_handle_irq(struct uart_port *p)

{

struct uart_8250_port *up = up_to_u8250p(p);

struct dw8250_data *d = p->private_data;

unsigned int iir = p->serial_in(p, UART_IIR);

unsigned int status;

unsigned long flags;

......

if (serial8250_handle_irq(p, iir))

return 1;

......

return 0;

}

int serial8250_handle_irq(struct uart_port *port, unsigned int iir)

{

unsigned char status;

unsigned long flags;

struct uart_8250_port *up = up_to_u8250p(port);

......

if (status & (UART_LSR_DR | UART_LSR_BI)) {

if (!up->dma || handle_rx_dma(up, iir))

/* 從串口中讀取字節(jié) */

status = serial8250_rx_chars(up, status);

}

......

return 1;

}

unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)

{

struct uart_port *port = &up->port;

int max_count = 256;

do {

/* 循環(huán)讀取字節(jié)到tty_buffer中,該buffer位于uart_port數(shù)據(jù)結構中 */

serial8250_read_char(up, lsr);

if (--max_count == 0)

break;

lsr = serial_in(up, UART_LSR);

} while (lsr & (UART_LSR_DR | UART_LSR_BI));

tty_flip_buffer_push(&port->state->port);

return lsr;

}

static void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr)

{

struct uart_port *port = &up->port;

unsigned char ch;

char flag = TTY_NORMAL;

if (likely(lsr & UART_LSR_DR))

/* 讀取串口接收到的字節(jié) */

ch = serial_in(up, UART_RX);

......

/* 將數(shù)據(jù)放入tty_buffer中 */

uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);

}

void uart_insert_char(struct uart_port *port, unsigned int status,

unsigned int overrun, unsigned int ch, unsigned int flag)

{

struct tty_port *tport = &port->state->port;

if ((status & port->ignore_status_mask & ~overrun) == 0)

/* 將字節(jié)ch保存到tty_buffer中 */

if (tty_insert_flip_char(tport, ch, flag) == 0)

++port->icount.buf_overrun;

if (status & ~port->ignore_status_mask & overrun)

/* 將字節(jié)ch保存到tty_buffer中 */

if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)

++port->icount.buf_overrun;

}

static inline int tty_insert_flip_char(struct tty_port *port,

unsigned char ch, char flag)

{

/* 獲取tty_buffer的尾部 */

struct tty_buffer *tb = port->buf.tail;

int change;

......

if (!change && tb->used < tb->size) {

if (~tb->flags & TTYB_NORMAL)

*flag_buf_ptr(tb, tb->used) = flag;

/* 如果tty_buffer中還有空間,則將字節(jié)ch插入tty_buffer中尾部中并返回 */

*char_buf_ptr(tb, tb->used++) = ch;

return 1;

}

/* 如果沒有空間則執(zhí)行__tty_insert_flip_char */

return __tty_insert_flip_char(port, ch, flag);

}

int __tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag)

{

struct tty_buffer *tb;

int flags = (flag == TTY_NORMAL) ? TTYB_NORMAL : 0;

/* 開辟tty_buffer的空間 */

if (!__tty_buffer_request_room(port, 1, flags))

return 0;

/* 將字節(jié)ch插入剛剛開辟的tty_buffer中 */

tb = port->buf.tail;

if (~tb->flags & TTYB_NORMAL)

*flag_buf_ptr(tb, tb->used) = flag;

*char_buf_ptr(tb, tb->used++) = ch;

return 1;

}

static int __tty_buffer_request_room(struct tty_port *port, size_t size,

int flags)

{

struct tty_bufhead *buf = &port->buf;

struct tty_buffer *b, *n;

int left, change;

/* 獲取剩余空間 */

b = buf->tail;

if (b->flags & TTYB_NORMAL)

left = 2 * b->size - b->used;

else

left = b->size - b->used;

change = (b->flags & TTYB_NORMAL) && (~flags & TTYB_NORMAL);

if (change || left < size) {

/* 開辟tty_buffer的空間 */

n = tty_buffer_alloc(port, size);

if (n != NULL) {

n->flags = flags;

/* 設置緩沖區(qū)到尾部 */

buf->tail = n;

smp_store_release(&b->commit, b->used);

smp_store_release(&b->next, n);

} else if (change)

size = 0;

else

size = left;

}

return size;

}

static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)

{

struct llist_node *free;

struct tty_buffer *p;

/* 對齊緩沖區(qū)大小 */

size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);

if (size <= MIN_TTYB_SIZE) {

free = llist_del_first(&port->buf.free);

if (free) {

p = llist_entry(free, struct tty_buffer, free);

goto found;

}

}

......

/* 分配緩沖區(qū) */

p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);

if (p == NULL)

return NULL;

found:

tty_buffer_reset(p, size);

atomic_add(size, &port->buf.mem_used);

return p;

}

到了這里,我們基本上就完成了 數(shù)據(jù)到tty_buffer 的填充,接下來我們就需要使用 tty_flip_buffer_push 喚醒 前臺線程,下面為代碼實例:

void tty_flip_buffer_push(struct tty_port *port)

{

tty_schedule_flip(port);

}

void tty_schedule_flip(struct tty_port *port)

{

struct tty_bufhead *buf = &port->buf;

/* paired w/ acquire in flush_to_ldisc(); ensures

* flush_to_ldisc() sees buffer data.

*/

smp_store_release(&buf->tail->commit, buf->tail->used);

/* 喚醒workqueue執(zhí)行處理,即調用flush_to_ldisc,該函數(shù)在tty_buffer_init時初始化 */

queue_work(system_unbound_wq, &buf->work);

}

static void flush_to_ldisc(struct work_struct *work)

{

struct tty_port *port = container_of(work, struct tty_port, buf.work);

struct tty_bufhead *buf = &port->buf;

mutex_lock(&buf->lock);

while (1) {

struct tty_buffer *head = buf->head;

struct tty_buffer *next;

int count;

.....

/* 判斷是否有數(shù)據(jù)可讀 */

next = smp_load_acquire(&head->next);

count = smp_load_acquire(&head->commit) - head->read;

if (!count) {

if (next == NULL)

break;

buf->head = next;

tty_buffer_free(port, head);

continue;

}

/* 接收數(shù)據(jù) */

count = receive_buf(port, head, count);

if (!count)

break;

head->read += count;

}

mutex_unlock(&buf->lock);

}

static int receive_buf(struct tty_port *port, struct tty_buffer *head, int count)

{

/* 獲取tty_buffer的緩沖區(qū)地址 */

unsigned char *p = char_buf_ptr(head, head->read);

char *f = NULL;

if (~head->flags & TTYB_NORMAL)

f = flag_buf_ptr(head, head->read);

/*

這里執(zhí)行的是tty_port的client_ops操作集

其初始化是在函數(shù)tty_port_init中進行初始化,該回調的函數(shù)名為tty_port_default_receive_buf

*/

return port->client_ops->receive_buf(port, p, f, count);

}

static int tty_port_default_receive_buf(struct tty_port *port,

const unsigned char *p,

const unsigned char *f, size_t count)

{

int ret;

struct tty_struct *tty;

struct tty_ldisc *disc;

......

/* 使用線路規(guī)程的接收方法對數(shù)據(jù)進行接收 */

ret = tty_ldisc_receive_buf(disc, p, (char *)f, count);

tty_ldisc_deref(disc);

return ret;

}

int tty_ldisc_receive_buf(struct tty_ldisc *ld, const unsigned char *p,

char *f, int count)

{

/*

使用線路規(guī)程的接收方法,前面講說初始化使用的是ntty作為默認的線路規(guī)程

所以這里的回調receive_buf2為n_tty_receive_buf2函數(shù),執(zhí)行該函數(shù)接收數(shù)據(jù)

請助理,這里p是存放有接收數(shù)據(jù)的緩沖區(qū)

*/

if (ld->ops->receive_buf2)

count = ld->ops->receive_buf2(ld->tty, p, f, count);

else {

count = min_t(int, count, ld->tty->receive_room);

if (count && ld->ops->receive_buf)

ld->ops->receive_buf(ld->tty, p, f, count);

}

return count;

}

static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,

char *fp, int count)

{

return n_tty_receive_buf_common(tty, cp, fp, count, 1);

}

static int n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,

char *fp, int count, int flow)

{

struct n_tty_data *ldata = tty->disc_data;

int room, n, rcvd = 0, overflow;

......

while (1) {

......

/* 在這里對數(shù)據(jù)進行接收 */

/* ignore parity errors if handling overflow */

if (!overflow || !fp || *fp != TTY_PARITY)

__receive_buf(tty, cp, fp, n);

cp += n;

if (fp)

fp += n;

count -= n;

rcvd += n;

}

tty->receive_room = room;

/* Unthrottle if handling overflow on pty */

if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {

if (overflow) {

tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);

tty_unthrottle_safe(tty);

__tty_set_flow_change(tty, 0);

}

} else

n_tty_check_throttle(tty);

up_read(&tty->termios_rwsem);

return rcvd;

}

static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,

char *fp, int count)

{

struct n_tty_data *ldata = tty->disc_data;

bool preops = I_ISTRIP(tty) || (I_IUCLC(tty) && L_IEXTEN(tty));

/*

這里判斷分支比較多,需要根據(jù)不同的設置執(zhí)行不同的接收函數(shù)。

不同的接收函數(shù)對數(shù)據(jù)的處理不同,但在最終都會調用put_tty_queue來投放數(shù)據(jù)

下面以n_tty_receive_char_fast函數(shù)為例子進行說明

*/

if (ldata->real_raw)

n_tty_receive_buf_real_raw(tty, cp, fp, count);

else if (ldata->raw || (L_EXTPROC(tty) && !preops))

n_tty_receive_buf_raw(tty, cp, fp, count);

else if (tty->closing && !L_EXTPROC(tty))

n_tty_receive_buf_closing(tty, cp, fp, count);

else {

if (ldata->lnext) {

char flag = TTY_NORMAL;

if (fp)

flag = *fp++;

n_tty_receive_char_lnext(tty, *cp++, flag);

count--;

}

if (!preops && !I_PARMRK(tty))

n_tty_receive_buf_fast(tty, cp, fp, count);

else

n_tty_receive_buf_standard(tty, cp, fp, count);

flush_echoes(tty);

/*

flush_chars回到調用的是uart_ops操作集的uart_flush_chars函數(shù)。

該函數(shù)使能串口發(fā)送應用程的數(shù)據(jù)

*/

if (tty->ops->flush_chars)

tty->ops->flush_chars(tty);

}

if (ldata->icanon && !L_EXTPROC(tty))

return;

/* publish read_head to consumer */

smp_store_release(&ldata->commit_head, ldata->read_head);

/* 喚醒前臺進程來接收數(shù)據(jù) */

if (read_cnt(ldata)) {

kill_fasync(&tty->fasync, SIGIO, POLL_IN);

wake_up_interruptible_poll(&tty->read_wait, POLLIN);

}

}

static void

n_tty_receive_buf_fast(struct tty_struct *tty, const unsigned char *cp,

char *fp, int count)

{

struct n_tty_data *ldata = tty->disc_data;

char flag = TTY_NORMAL;

/* 循環(huán)接收字節(jié) */

while (count--) {

if (fp)

flag = *fp++;

if (likely(flag == TTY_NORMAL)) {

/* 從緩沖區(qū)中獲取字節(jié) */

unsigned char c = *cp++;

if (!test_bit(c, ldata->char_map))

/* 將接收到的字節(jié)投放到線路規(guī)程的數(shù)據(jù)緩沖區(qū)中 */

n_tty_receive_char_fast(tty, c);

......

}

}

}

static inline void n_tty_receive_char_fast(struct tty_struct *tty, unsigned char c)

{

struct n_tty_data *ldata = tty->disc_data;

......

/* 投送字節(jié)到線路規(guī)程的數(shù)據(jù)中 */

put_tty_queue(c, ldata);

}

static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata)

{

/* 將字節(jié)賦值給線路規(guī)程中的read_buf中 */

*read_buf_addr(ldata, ldata->read_head) = c;

/* 以下為read_buf_addr函數(shù)體 */

{

return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];

}

/* 記錄緩沖區(qū)當前的頭部下標 */

ldata->read_head++;

}

到了這里,數(shù)據(jù)的 中斷后臺接收流程 就已經完成了。這里我們還需要注意 前臺接收進程 的流程,求該流程比較簡單,相比于 后臺接收流程 來了說調用圖譜十分簡潔。其代碼實例和調用圖譜如下:

tty_read

->n_tty_read

->canon_copy_from_read_buf

static ssize_t tty_read(struct file *file, char __user *buf, size_t count,

loff_t *ppos)

{

int i;

struct inode *inode = file_inode(file);

struct tty_struct *tty = file_tty(file);

struct tty_ldisc *ld;

......

/* 調用線路規(guī)程的read方法,同理這里使用的是ntty作用默認線路規(guī)程,所以其函數(shù)名為n_tty_read */

if (ld->ops->read)

i = ld->ops->read(tty, file, buf, count);

......

return i;

}

static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,

unsigned char __user *buf, size_t nr)

{

struct n_tty_data *ldata = tty->disc_data;

unsigned char __user *b = buf;

/* 聲明一個等待隊列實例 */

DEFINE_WAIT_FUNC(wait, woken_wake_function);

int c;

int minimum, time;

ssize_t retval = 0;

long timeout;

int packet;

size_t tail;

......

packet = tty->packet;

tail = ldata->read_tail;

/* 加入等待隊列 */

add_wait_queue(&tty->read_wait, &wait);

while (nr) {

/* First test for status change. */

if (packet && tty->link->ctrl_status) {

unsigned char cs;

if (b != buf)

break;

spin_lock_irq(&tty->link->ctrl_lock);

cs = tty->link->ctrl_status;

tty->link->ctrl_status = 0;

spin_unlock_irq(&tty->link->ctrl_lock);

if (put_user(cs, b)) {

retval = -EFAULT;

break;

}

b++;

nr--;

break;

}

if (!input_available_p(tty, 0)) {

up_read(&tty->termios_rwsem);

tty_buffer_flush_work(tty->port);

down_read(&tty->termios_rwsem);

if (!input_available_p(tty, 0)) {

......

/* 如果當前由于某種原因不可讀,則進程讓出當前CPU,等待喚醒 */

timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,

timeout);

down_read(&tty->termios_rwsem);

continue;

}

}

if (ldata->icanon && !L_EXTPROC(tty)) {

......

} else {

int uncopied;

if (packet && b == buf) {

if (put_user(TIOCPKT_DATA, b)) {

retval = -EFAULT;

break;

}

b++;

nr--;

}

/* 根據(jù)不同情況將數(shù)據(jù)投放到應用層 */

uncopied = copy_from_read_buf(tty, &b, &nr);

......

}

n_tty_check_unthrottle(tty);

if (b - buf >= minimum)

break;

if (time)

timeout = time;

}

if (tail != ldata->read_tail)

n_tty_kick_worker(tty);

up_read(&tty->termios_rwsem);

/* 移除出等待隊列 */

remove_wait_queue(&tty->read_wait, &wait);

mutex_unlock(&ldata->atomic_read_lock);

if (b - buf)

retval = b - buf;

return retval;

}

static int copy_from_read_buf(struct tty_struct *tty,

unsigned char __user **b,

size_t *nr)

{

struct n_tty_data *ldata = tty->disc_data;

int retval;

size_t n;

bool is_eof;

size_t head = smp_load_acquire(&ldata->commit_head);

size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);

retval = 0;

n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail);

n = min(*nr, n);

if (n) {

/* 獲取當前數(shù)據(jù)包的所在地址 */

const unsigned char *from = read_buf_addr(ldata, tail);

/* 以下為read_buf_addr函數(shù)體 */

{

/* 獲取線路規(guī)程中的讀取buffer地址 */

return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];

}

/* 將地址拷貝到應用空間,其中b為應用空間buffer地址,from為串口接收數(shù)據(jù)包所在地址 */

retval = copy_to_user(*b, from, n);

n -= retval;

......

*b += n;

*nr -= n;

}

return retval;

}

到了這里,串口讀流程 基本完成了。其 寫流程 框架類似,但數(shù)據(jù)流相反,這里不做講述,有興趣的讀者可以自行閱讀源碼理解。

三、結語

本文更新得有些許慢,主要是平時看代碼寫文章的時間少了,再加上 tty框架 復雜且代碼多,所以閱讀起來理解不是很容易。按照筆者理解,包括筆者在內大部分人一輩子都應該不會自己去寫一個 串口或者tty驅動,但學習 串口和tty驅動 有助于理解和使用 線路規(guī)程,想 串口藍牙 等使用方法相信不少人會遇到過,學習串口驅動框架有助于我們工作生活中開發(fā)和調試。

本文與該系列的其他文章類似,主要在于梳理驅動框架來幫助讀者理解,而非講述使用方法。所以對于很多不影響流程的細節(jié)都省略掉,筆者建議讀者有條件的可以閱讀一遍代碼可以加深理解。如果本文有誤或者有講得不好的地方,請各位讀者指出并海涵。

四、參考鏈接

總結

以上是生活随笔為你收集整理的linux内核调用串口,linux驱动之串口驱动框架的全部內容,希望文章能夠幫你解決所遇到的問題。

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

领导边摸边吃奶边做爽在线观看 | 久久综合香蕉国产蜜臀av | 亚洲精品久久久久avwww潮水 | 国语精品一区二区三区 | 综合网日日天干夜夜久久 | 国产偷自视频区视频 | 欧美怡红院免费全部视频 | 少妇太爽了在线观看 | 樱花草在线社区www | 无码人妻av免费一区二区三区 | 国产在线精品一区二区三区直播 | 中文无码精品a∨在线观看不卡 | 国产精品久久久久久久影院 | 日本欧美一区二区三区乱码 | 免费看男女做好爽好硬视频 | 久久久婷婷五月亚洲97号色 | 无码人妻精品一区二区三区下载 | 一本大道久久东京热无码av | 亚洲午夜久久久影院 | 激情爆乳一区二区三区 | 国产精品美女久久久久av爽李琼 | 亚洲另类伦春色综合小说 | 日日碰狠狠丁香久燥 | 国产成人无码区免费内射一片色欲 | 无码一区二区三区在线观看 | 国内少妇偷人精品视频免费 | 中文字幕人妻无码一夲道 | 中文字幕 亚洲精品 第1页 | 国产人妻人伦精品1国产丝袜 | 久青草影院在线观看国产 | 日本丰满熟妇videos | 亚欧洲精品在线视频免费观看 | 国产亚洲tv在线观看 | 久9re热视频这里只有精品 | 麻豆md0077饥渴少妇 | 一二三四社区在线中文视频 | 国产精品欧美成人 | 色诱久久久久综合网ywww | 人妻体内射精一区二区三四 | 久久久亚洲欧洲日产国码αv | 国产成人无码av一区二区 | 国产性生交xxxxx无码 | 久久久国产精品无码免费专区 | 国产艳妇av在线观看果冻传媒 | 成人三级无码视频在线观看 | 免费看少妇作爱视频 | 天天摸天天碰天天添 | 麻豆人妻少妇精品无码专区 | 久久久久久久人妻无码中文字幕爆 | 国产精品无码久久av | 搡女人真爽免费视频大全 | 久久久www成人免费毛片 | 高潮毛片无遮挡高清免费视频 | 精品久久综合1区2区3区激情 | 老熟妇仑乱视频一区二区 | 沈阳熟女露脸对白视频 | 午夜嘿嘿嘿影院 | 精品国产一区二区三区av 性色 | 欧美真人作爱免费视频 | 亚洲阿v天堂在线 | 色噜噜亚洲男人的天堂 | 好男人www社区 | 丰满岳乱妇在线观看中字无码 | 狂野欧美性猛xxxx乱大交 | 无码国产激情在线观看 | 丁香啪啪综合成人亚洲 | 日韩视频 中文字幕 视频一区 | 亚洲中文字幕乱码av波多ji | 四虎永久在线精品免费网址 | 乌克兰少妇性做爰 | 日韩精品无码一区二区中文字幕 | 玩弄人妻少妇500系列视频 | 国产av一区二区三区最新精品 | 中国女人内谢69xxxxxa片 | 激情爆乳一区二区三区 | 国产无套内射久久久国产 | 欧洲熟妇色 欧美 | 日韩人妻少妇一区二区三区 | 丰满人妻一区二区三区免费视频 | 丰满护士巨好爽好大乳 | 国产精品美女久久久网av | 人妻少妇精品久久 | 99精品无人区乱码1区2区3区 | 无码人妻少妇伦在线电影 | 国产无遮挡又黄又爽免费视频 | 国产精品久久久av久久久 | 日本一区二区更新不卡 | 丰腴饱满的极品熟妇 | 乱人伦人妻中文字幕无码久久网 | 国产无遮挡吃胸膜奶免费看 | 久久五月精品中文字幕 | 2020最新国产自产精品 | 精品乱子伦一区二区三区 | 99riav国产精品视频 | 久久亚洲精品成人无码 | 中文亚洲成a人片在线观看 | 日本一本二本三区免费 | 国产精品亚洲五月天高清 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 无码免费一区二区三区 | 欧美丰满少妇xxxx性 | 97夜夜澡人人爽人人喊中国片 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲熟妇色xxxxx亚洲 | 国产成人精品久久亚洲高清不卡 | 清纯唯美经典一区二区 | 人妻少妇精品无码专区动漫 | √天堂资源地址中文在线 | 精品国产成人一区二区三区 | 亚洲欧美中文字幕5发布 | 亚洲最大成人网站 | 久久人妻内射无码一区三区 | 日韩少妇白浆无码系列 | 亚洲欧美日韩国产精品一区二区 | 香蕉久久久久久av成人 | 正在播放老肥熟妇露脸 | 久精品国产欧美亚洲色aⅴ大片 | 久久精品人人做人人综合 | 伊人色综合久久天天小片 | 日本爽爽爽爽爽爽在线观看免 | 国产美女极度色诱视频www | 秋霞特色aa大片 | 亚洲欧美国产精品久久 | 性做久久久久久久久 | 国产亚洲美女精品久久久2020 | 精品人妻中文字幕有码在线 | 日韩精品a片一区二区三区妖精 | 麻豆精品国产精华精华液好用吗 | 亚洲日韩av一区二区三区中文 | 色综合天天综合狠狠爱 | 国产精品久久久一区二区三区 | 国产成人av免费观看 | 高中生自慰www网站 | 久久精品人妻少妇一区二区三区 | 国产午夜手机精彩视频 | 天海翼激烈高潮到腰振不止 | 国产成人久久精品流白浆 | 国产极品视觉盛宴 | 国产激情精品一区二区三区 | av无码久久久久不卡免费网站 | 国产日产欧产精品精品app | 在线播放免费人成毛片乱码 | 国产又粗又硬又大爽黄老大爷视 | 日产精品99久久久久久 | 牲交欧美兽交欧美 | 捆绑白丝粉色jk震动捧喷白浆 | 一本加勒比波多野结衣 | 国产麻豆精品一区二区三区v视界 | 亚洲精品成人福利网站 | 欧美野外疯狂做受xxxx高潮 | 乌克兰少妇xxxx做受 | 99久久久国产精品无码免费 | 成熟女人特级毛片www免费 | 性啪啪chinese东北女人 | 国产精品沙发午睡系列 | 日韩欧美中文字幕在线三区 | 在线天堂新版最新版在线8 | 成人aaa片一区国产精品 | 高潮毛片无遮挡高清免费视频 | 99er热精品视频 | 扒开双腿吃奶呻吟做受视频 | 国产av无码专区亚洲awww | 精品国产麻豆免费人成网站 | 久久精品女人的天堂av | 欧美日本免费一区二区三区 | 亚洲国产精品久久久久久 | 76少妇精品导航 | 色综合久久久无码网中文 | 无码免费一区二区三区 | 色偷偷人人澡人人爽人人模 | 亚洲人成网站色7799 | 免费无码一区二区三区蜜桃大 | 亚洲成av人片在线观看无码不卡 | 国产亚洲精品久久久ai换 | 久久久婷婷五月亚洲97号色 | 无码纯肉视频在线观看 | 亚洲人成网站在线播放942 | 少妇的肉体aa片免费 | 99久久人妻精品免费二区 | 国产熟妇另类久久久久 | 熟妇人妻无乱码中文字幕 | 久久伊人色av天堂九九小黄鸭 | 在线а√天堂中文官网 | 三级4级全黄60分钟 | 97久久超碰中文字幕 | 日韩视频 中文字幕 视频一区 | 男女猛烈xx00免费视频试看 | 色婷婷av一区二区三区之红樱桃 | 乌克兰少妇性做爰 | 精品国产麻豆免费人成网站 | 中文字幕无线码 | 婷婷五月综合缴情在线视频 | 久久视频在线观看精品 | aⅴ亚洲 日韩 色 图网站 播放 | 久久精品无码一区二区三区 | 成人性做爰aaa片免费看 | 88国产精品欧美一区二区三区 | 又大又紧又粉嫩18p少妇 | 小泽玛莉亚一区二区视频在线 | 国产乱码精品一品二品 | 性啪啪chinese东北女人 | 无码乱肉视频免费大全合集 | 精品国产乱码久久久久乱码 | 国产av一区二区三区最新精品 | 国产午夜亚洲精品不卡下载 | 内射爽无广熟女亚洲 | 日本va欧美va欧美va精品 | 色欲久久久天天天综合网精品 | 亚洲精品中文字幕乱码 | 人妻少妇精品无码专区二区 | 日本精品久久久久中文字幕 | 成 人 免费观看网站 | 久久久久成人片免费观看蜜芽 | 天下第一社区视频www日本 | 午夜福利一区二区三区在线观看 | 欧美日韩色另类综合 | 国产精品va在线观看无码 | 国产精品内射视频免费 | 国产真实夫妇视频 | 正在播放东北夫妻内射 | 青青青爽视频在线观看 | 99视频精品全部免费免费观看 | 日本爽爽爽爽爽爽在线观看免 | 最近免费中文字幕中文高清百度 | 欧美国产日韩亚洲中文 | 久久亚洲精品成人无码 | 国产亚av手机在线观看 | 丰满少妇女裸体bbw | √天堂资源地址中文在线 | 97久久精品无码一区二区 | 色综合天天综合狠狠爱 | 全黄性性激高免费视频 | 撕开奶罩揉吮奶头视频 | 日韩人妻无码一区二区三区久久99 | 欧美日韩综合一区二区三区 | 色一情一乱一伦 | 欧美肥老太牲交大战 | 国产97人人超碰caoprom | 欧美国产日韩亚洲中文 | 国产激情一区二区三区 | 日本www一道久久久免费榴莲 | 国内少妇偷人精品视频 | 曰本女人与公拘交酡免费视频 | 无码福利日韩神码福利片 | 国产精品美女久久久网av | 久久国产精品_国产精品 | 十八禁视频网站在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 精品无码一区二区三区爱欲 | 成在人线av无码免观看麻豆 | 日韩精品乱码av一区二区 | 国产乱子伦视频在线播放 | 狠狠躁日日躁夜夜躁2020 | 色婷婷av一区二区三区之红樱桃 | 一本久道久久综合狠狠爱 | 免费看男女做好爽好硬视频 | 国产亚洲日韩欧美另类第八页 | 国产在线无码精品电影网 | 久久精品女人天堂av免费观看 | 日韩人妻少妇一区二区三区 | 欧美一区二区三区 | 在线а√天堂中文官网 | 日日摸夜夜摸狠狠摸婷婷 | 狂野欧美性猛xxxx乱大交 | 国产精品igao视频网 | 中文字幕亚洲情99在线 | 窝窝午夜理论片影院 | 日本一卡2卡3卡四卡精品网站 | 亚洲欧美精品aaaaaa片 | 男女性色大片免费网站 | 久久天天躁狠狠躁夜夜免费观看 | 九九综合va免费看 | 久久久精品人妻久久影视 | 天天摸天天透天天添 | 亚洲午夜久久久影院 | 少妇高潮喷潮久久久影院 | 中文字幕无码免费久久9一区9 | 97久久超碰中文字幕 | 全球成人中文在线 | 欧美自拍另类欧美综合图片区 | 一本色道久久综合亚洲精品不卡 | 国产亚洲精品久久久久久大师 | 国产精品成人av在线观看 | 永久黄网站色视频免费直播 | 欧美三级a做爰在线观看 | 97夜夜澡人人双人人人喊 | 伊人久久大香线蕉午夜 | 性欧美牲交xxxxx视频 | 国产激情艳情在线看视频 | av在线亚洲欧洲日产一区二区 | 色爱情人网站 | 日本精品人妻无码77777 天堂一区人妻无码 | 日韩av无码一区二区三区不卡 | 亚洲 激情 小说 另类 欧美 | 亚洲精品中文字幕久久久久 | 99精品久久毛片a片 | 亚洲成av人在线观看网址 | 亚洲欧美国产精品专区久久 | 国产性生交xxxxx无码 | 荫蒂被男人添的好舒服爽免费视频 | 对白脏话肉麻粗话av | 无码一区二区三区在线观看 | 18黄暴禁片在线观看 | 中文字幕中文有码在线 | 国产精品理论片在线观看 | 日韩欧美中文字幕公布 | 中文字幕人成乱码熟女app | 亚洲日本一区二区三区在线 | 久久亚洲中文字幕无码 | 一本久久a久久精品亚洲 | 久久久无码中文字幕久... | 性色欲情网站iwww九文堂 | 久久国产精品精品国产色婷婷 | 欧美 日韩 人妻 高清 中文 | 国产免费无码一区二区视频 | 国产明星裸体无码xxxx视频 | 无码人妻精品一区二区三区不卡 | 天海翼激烈高潮到腰振不止 | 一本色道久久综合狠狠躁 | 人人妻人人澡人人爽人人精品 | 国产黄在线观看免费观看不卡 | 在线a亚洲视频播放在线观看 | 亚洲中文字幕乱码av波多ji | 天天躁夜夜躁狠狠是什么心态 | 久久99精品国产麻豆 | 一本色道久久综合狠狠躁 | 国产午夜视频在线观看 | 天天躁夜夜躁狠狠是什么心态 | 性开放的女人aaa片 | 亚洲一区二区观看播放 | 久久精品人人做人人综合 | 99精品久久毛片a片 | 少妇高潮喷潮久久久影院 | v一区无码内射国产 | 一本久久a久久精品亚洲 | 欧美人与禽zoz0性伦交 | 亚洲国产精品久久久久久 | 久久精品国产99久久6动漫 | 精品熟女少妇av免费观看 | 精品无人区无码乱码毛片国产 | 无码av岛国片在线播放 | 久久亚洲a片com人成 | 婷婷丁香六月激情综合啪 | 久久伊人色av天堂九九小黄鸭 | 国产av剧情md精品麻豆 | 丰满少妇高潮惨叫视频 | 国内精品人妻无码久久久影院蜜桃 | 特大黑人娇小亚洲女 | 国产精品美女久久久网av | 国产精品欧美成人 | 欧洲精品码一区二区三区免费看 | 3d动漫精品啪啪一区二区中 | 青青久在线视频免费观看 | 成在人线av无码免观看麻豆 | 亚洲国产综合无码一区 | 国产成人精品优优av | 97资源共享在线视频 | 国产av无码专区亚洲awww | 欧美激情综合亚洲一二区 | 一本一道久久综合久久 | 日日摸夜夜摸狠狠摸婷婷 | 一二三四在线观看免费视频 | 少妇被粗大的猛进出69影院 | 精品久久久无码人妻字幂 | 亚洲精品www久久久 | 久久久久成人精品免费播放动漫 | 无码av岛国片在线播放 | 日本一区二区三区免费高清 | 国产精品对白交换视频 | 亚洲精品无码人妻无码 | 精品国产精品久久一区免费式 | 色婷婷香蕉在线一区二区 | 中文字幕无线码免费人妻 | 久久99热只有频精品8 | 300部国产真实乱 | 少妇太爽了在线观看 | 四虎影视成人永久免费观看视频 | v一区无码内射国产 | 国产欧美亚洲精品a | 国产亚洲欧美在线专区 | 扒开双腿吃奶呻吟做受视频 | 荫蒂被男人添的好舒服爽免费视频 | 国产国产精品人在线视 | 内射巨臀欧美在线视频 | 久久亚洲精品成人无码 | 18黄暴禁片在线观看 | 大肉大捧一进一出好爽视频 | 成人欧美一区二区三区 | 少妇无码吹潮 | 午夜男女很黄的视频 | 欧洲极品少妇 | av在线亚洲欧洲日产一区二区 | 国产一区二区三区精品视频 | 亚洲 激情 小说 另类 欧美 | 国产精品美女久久久久av爽李琼 | 中文字幕乱码人妻无码久久 | 久久精品视频在线看15 | 亚洲 欧美 激情 小说 另类 | 在线看片无码永久免费视频 | 少妇人妻偷人精品无码视频 | 欧美xxxxx精品 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 两性色午夜视频免费播放 | 成人精品视频一区二区三区尤物 | 精品人人妻人人澡人人爽人人 | 少妇邻居内射在线 | 又紧又大又爽精品一区二区 | 欧美黑人性暴力猛交喷水 | 又大又黄又粗又爽的免费视频 | 国产亚洲日韩欧美另类第八页 | 牲欲强的熟妇农村老妇女 | 岛国片人妻三上悠亚 | 色综合久久久无码中文字幕 | 日本饥渴人妻欲求不满 | 日韩欧美群交p片內射中文 | 国产精品无码久久av | 国产人妻精品午夜福利免费 | 久久99精品国产.久久久久 | 两性色午夜视频免费播放 | v一区无码内射国产 | 999久久久国产精品消防器材 | 无码人妻黑人中文字幕 | 狠狠色欧美亚洲狠狠色www | 久久精品成人欧美大片 | av人摸人人人澡人人超碰下载 | 欧美成人高清在线播放 | 亚洲精品国产第一综合99久久 | 色婷婷欧美在线播放内射 | 国产真人无遮挡作爱免费视频 | 亚洲狠狠色丁香婷婷综合 | 99久久精品午夜一区二区 | 国产偷自视频区视频 | 亚洲中文字幕在线观看 | 国产成人无码一二三区视频 | 国产精品丝袜黑色高跟鞋 | 免费人成网站视频在线观看 | 国产精品99爱免费视频 | 国产偷国产偷精品高清尤物 | 免费人成在线观看网站 | 蜜桃无码一区二区三区 | 免费人成在线观看网站 | 国色天香社区在线视频 | 中文字幕av日韩精品一区二区 | 大肉大捧一进一出视频出来呀 | 丰满人妻一区二区三区免费视频 | 精品国产乱码久久久久乱码 | 免费观看黄网站 | 国产亚洲欧美日韩亚洲中文色 | 午夜福利一区二区三区在线观看 | 国产精品久久久久久久影院 | 精品国产一区二区三区四区 | 西西人体www44rt大胆高清 | 麻豆av传媒蜜桃天美传媒 | 色 综合 欧美 亚洲 国产 | 美女极度色诱视频国产 | 中文字幕无码免费久久99 | 又色又爽又黄的美女裸体网站 | 国产99久久精品一区二区 | 国产婷婷色一区二区三区在线 | 一区二区传媒有限公司 | 国产精品久久久久9999小说 | 无套内射视频囯产 | 天堂久久天堂av色综合 | 国产精品香蕉在线观看 | 久久zyz资源站无码中文动漫 | 人人澡人人透人人爽 | 东京一本一道一二三区 | 亚洲欧洲日本综合aⅴ在线 | 精品国产麻豆免费人成网站 | 亚洲精品午夜国产va久久成人 | √8天堂资源地址中文在线 | 国产精品爱久久久久久久 | 女人色极品影院 | 俺去俺来也在线www色官网 | 大肉大捧一进一出视频出来呀 | 国産精品久久久久久久 | 亚洲成熟女人毛毛耸耸多 | 亚洲区欧美区综合区自拍区 | 欧美人妻一区二区三区 | 人妻aⅴ无码一区二区三区 | 精品偷自拍另类在线观看 | 国产人妻精品一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 色妞www精品免费视频 | 色诱久久久久综合网ywww | 人妻互换免费中文字幕 | 夜夜夜高潮夜夜爽夜夜爰爰 | 99久久精品日本一区二区免费 | 久久99热只有频精品8 | 中文毛片无遮挡高清免费 | 午夜精品久久久久久久 | www国产亚洲精品久久久日本 | 人人妻人人澡人人爽人人精品浪潮 | 好爽又高潮了毛片免费下载 | 男女超爽视频免费播放 | 亚洲中文字幕在线无码一区二区 | 欧洲精品码一区二区三区免费看 | 国产性生大片免费观看性 | 人人妻人人澡人人爽精品欧美 | 成人试看120秒体验区 | 国产一区二区三区精品视频 | 四虎永久在线精品免费网址 | 国产 浪潮av性色四虎 | аⅴ资源天堂资源库在线 | 免费看男女做好爽好硬视频 | 久久www免费人成人片 | 中文字幕日韩精品一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品怡红院永久免费 | 日韩视频 中文字幕 视频一区 | 国产日产欧产精品精品app | 大肉大捧一进一出视频出来呀 | 亚洲色欲色欲天天天www | 国产人妖乱国产精品人妖 | 国产激情一区二区三区 | 亚洲精品国产精品乱码不卡 | √天堂资源地址中文在线 | www国产精品内射老师 | 国产又爽又黄又刺激的视频 | 亚洲欧洲日本综合aⅴ在线 | 亚洲自偷自拍另类第1页 | 亚洲精品国产品国语在线观看 | 东京一本一道一二三区 | 亚洲国产精品一区二区第一页 | 亚洲天堂2017无码中文 | 精品久久久无码中文字幕 | 欧美一区二区三区视频在线观看 | 国产乱子伦视频在线播放 | 中国大陆精品视频xxxx | 欧美 丝袜 自拍 制服 另类 | 亚洲一区av无码专区在线观看 | 亚洲国产欧美在线成人 | 少妇一晚三次一区二区三区 | 又大又硬又爽免费视频 | 久久精品国产99久久6动漫 | 亚洲国产av美女网站 | 日本免费一区二区三区最新 | 亚洲欧美色中文字幕在线 | 国产精品免费大片 | 日本www一道久久久免费榴莲 | av人摸人人人澡人人超碰下载 | 欧美人与物videos另类 | 亚洲国产精品久久久天堂 | 亚洲午夜无码久久 | 少妇性l交大片欧洲热妇乱xxx | 久久久久久a亚洲欧洲av冫 | 国产三级久久久精品麻豆三级 | 大地资源中文第3页 | 欧美真人作爱免费视频 | 国产精品久久精品三级 | 99久久人妻精品免费二区 | 人妻人人添人妻人人爱 | 99久久无码一区人妻 | 婷婷综合久久中文字幕蜜桃三电影 | 国产两女互慰高潮视频在线观看 | 丰满岳乱妇在线观看中字无码 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品人人爽人人做我的可爱 | 欧美人与禽猛交狂配 | 久久zyz资源站无码中文动漫 | 日本www一道久久久免费榴莲 | 国产激情综合五月久久 | 一本大道久久东京热无码av | 亚洲色欲色欲欲www在线 | 99久久久无码国产aaa精品 | 久久综合激激的五月天 | 强奷人妻日本中文字幕 | 俄罗斯老熟妇色xxxx | 国产精品久免费的黄网站 | 国内揄拍国内精品人妻 | 熟妇人妻激情偷爽文 | 99国产精品白浆在线观看免费 | 人人妻人人藻人人爽欧美一区 | 黑人粗大猛烈进出高潮视频 | 7777奇米四色成人眼影 | 乱人伦人妻中文字幕无码久久网 | 中文字幕无码av激情不卡 | 妺妺窝人体色www在线小说 | 久久精品国产一区二区三区肥胖 | 亚洲一区二区三区香蕉 | 国产一区二区三区日韩精品 | 男人的天堂av网站 | 国产成人久久精品流白浆 | 精品水蜜桃久久久久久久 | 天天燥日日燥 | 麻豆精产国品 | 久久精品视频在线看15 | 国产97在线 | 亚洲 | 亚洲大尺度无码无码专区 | 亚洲精品久久久久久久久久久 | 亚洲精品欧美二区三区中文字幕 | 欧美阿v高清资源不卡在线播放 | 妺妺窝人体色www在线小说 | 国产亚av手机在线观看 | 欧美激情一区二区三区成人 | 男女作爱免费网站 | 国产成人精品无码播放 | 成熟妇人a片免费看网站 | 小sao货水好多真紧h无码视频 | 人妻互换免费中文字幕 | 亚洲中文字幕乱码av波多ji | 国产人妻精品一区二区三区 | 国产精品福利视频导航 | 国产精品资源一区二区 | 2020久久超碰国产精品最新 | 亚洲人成人无码网www国产 | 国产成人无码a区在线观看视频app | 亚洲熟妇自偷自拍另类 | 国产综合色产在线精品 | 人妻插b视频一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 国内丰满熟女出轨videos | 性做久久久久久久久 | 久久五月精品中文字幕 | 欧美日韩在线亚洲综合国产人 | 成年女人永久免费看片 | 草草网站影院白丝内射 | 亚洲中文字幕va福利 | 国产av无码专区亚洲a∨毛片 | 亚洲无人区一区二区三区 | 国内老熟妇对白xxxxhd | 久久综合激激的五月天 | 国产精品亚洲lv粉色 | 亚洲综合无码久久精品综合 | 久久久精品欧美一区二区免费 | 国产色在线 | 国产 | 国产亚洲日韩欧美另类第八页 | 人人妻人人藻人人爽欧美一区 | 永久黄网站色视频免费直播 | 久久精品一区二区三区四区 | 动漫av一区二区在线观看 | 国产精品办公室沙发 | 亚拍精品一区二区三区探花 | 欧美国产日韩亚洲中文 | 亚洲国产av精品一区二区蜜芽 | 日本va欧美va欧美va精品 | 成人女人看片免费视频放人 | 欧洲精品码一区二区三区免费看 | 国产精品久久精品三级 | 久久国产精品萌白酱免费 | 日本一本二本三区免费 | 亚洲精品欧美二区三区中文字幕 | 99re在线播放 | 国产综合色产在线精品 | 激情人妻另类人妻伦 | 男女猛烈xx00免费视频试看 | 国产在线精品一区二区三区直播 | 国产人妻精品一区二区三区不卡 | 亚洲の无码国产の无码影院 | 色五月丁香五月综合五月 | 熟妇激情内射com | 无码av岛国片在线播放 | √8天堂资源地址中文在线 | 人妻尝试又大又粗久久 | 全球成人中文在线 | 无码精品人妻一区二区三区av | 亚洲精品午夜无码电影网 | 亚洲人亚洲人成电影网站色 | 国产特级毛片aaaaaa高潮流水 | 亚洲国产精品毛片av不卡在线 | 中文字幕亚洲情99在线 | 日日夜夜撸啊撸 | 精品久久久无码人妻字幂 | 丰满肥臀大屁股熟妇激情视频 | a片在线免费观看 | 少妇的肉体aa片免费 | 蜜臀aⅴ国产精品久久久国产老师 | 午夜无码人妻av大片色欲 | 国产精品美女久久久网av | 中文字幕无码av波多野吉衣 | 精品人人妻人人澡人人爽人人 | 日韩人妻无码中文字幕视频 | 精品欧美一区二区三区久久久 | 偷窥日本少妇撒尿chinese | 国产精品成人av在线观看 | 强辱丰满人妻hd中文字幕 | 精品国偷自产在线视频 | 影音先锋中文字幕无码 | 国产又粗又硬又大爽黄老大爷视 | 国产乱码精品一品二品 | 性欧美牲交xxxxx视频 | 久久99精品国产.久久久久 | a片在线免费观看 | 久久久精品国产sm最大网站 | 色一情一乱一伦一视频免费看 | 日本爽爽爽爽爽爽在线观看免 | 无码人妻少妇伦在线电影 | 欧美老熟妇乱xxxxx | 国内精品久久毛片一区二区 | 大乳丰满人妻中文字幕日本 | 九九热爱视频精品 | 高清国产亚洲精品自在久久 | 67194成是人免费无码 | 精品熟女少妇av免费观看 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品高潮呻吟av久久4虎 | 欧美丰满老熟妇xxxxx性 | 丰满诱人的人妻3 | 性啪啪chinese东北女人 | 一本久久a久久精品亚洲 | 一本色道久久综合狠狠躁 | 国产精品美女久久久 | 十八禁视频网站在线观看 | 亚洲精品综合五月久久小说 | a国产一区二区免费入口 | 亚洲精品无码人妻无码 | 永久免费观看美女裸体的网站 | 亚洲成a人片在线观看无码3d | 狠狠综合久久久久综合网 | 国产欧美精品一区二区三区 | 任你躁国产自任一区二区三区 | 成人免费视频一区二区 | 亚洲日韩av一区二区三区四区 | 在线看片无码永久免费视频 | 麻豆国产人妻欲求不满谁演的 | 无码一区二区三区在线观看 | 2019nv天堂香蕉在线观看 | 国产在线精品一区二区三区直播 | 荡女精品导航 | 国产午夜精品一区二区三区嫩草 | 亚洲成av人影院在线观看 | 中文字幕无码热在线视频 | 日本大香伊一区二区三区 | 波多野结衣av一区二区全免费观看 | 色妞www精品免费视频 | 亚洲色成人中文字幕网站 | 日产精品高潮呻吟av久久 | a在线观看免费网站大全 | 亚洲国产精品久久久天堂 | 中文精品久久久久人妻不卡 | 性做久久久久久久免费看 | 色综合视频一区二区三区 | 中文字幕精品av一区二区五区 | 亚洲精品成人福利网站 | 俺去俺来也在线www色官网 | 亚洲色www成人永久网址 | 天下第一社区视频www日本 | 大肉大捧一进一出视频出来呀 | 欧美一区二区三区视频在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 久久久久人妻一区精品色欧美 | 黑人巨大精品欧美黑寡妇 | 亚洲日本va午夜在线电影 | 国内精品九九久久久精品 | 亚洲高清偷拍一区二区三区 | 在线播放无码字幕亚洲 | 国产在线无码精品电影网 | 国内综合精品午夜久久资源 | 中文字幕久久久久人妻 | 给我免费的视频在线观看 | 午夜福利一区二区三区在线观看 | 综合网日日天干夜夜久久 | 久久成人a毛片免费观看网站 | 亚洲精品综合一区二区三区在线 | 亚洲 a v无 码免 费 成 人 a v | 高潮毛片无遮挡高清免费视频 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲国产精品久久久天堂 | 精品无码国产一区二区三区av | 国产内射老熟女aaaa | 国产内射爽爽大片视频社区在线 | 兔费看少妇性l交大片免费 | 国产乱人伦av在线无码 | 久久人人爽人人人人片 | 中国大陆精品视频xxxx | 巨爆乳无码视频在线观看 | 国产精品免费大片 | 精品日本一区二区三区在线观看 | 免费观看黄网站 | 免费看少妇作爱视频 | 国产av一区二区三区最新精品 | 天堂а√在线地址中文在线 | 亚洲国精产品一二二线 | 国产人妻人伦精品 | 亚洲国产精品一区二区美利坚 | 东北女人啪啪对白 | 成人欧美一区二区三区黑人 | 免费人成网站视频在线观看 | 麻豆精品国产精华精华液好用吗 | 荫蒂添的好舒服视频囗交 | 动漫av一区二区在线观看 | 夜夜高潮次次欢爽av女 | 国产超碰人人爽人人做人人添 | 久久五月精品中文字幕 | 99久久久国产精品无码免费 | 麻豆果冻传媒2021精品传媒一区下载 | 波多野42部无码喷潮在线 | 国产成人一区二区三区在线观看 | 亚洲欧洲无卡二区视頻 | 国产小呦泬泬99精品 | 18精品久久久无码午夜福利 | 鲁大师影院在线观看 | 国产真实夫妇视频 | 午夜免费福利小电影 | 亚洲国产精品无码久久久久高潮 | 国产小呦泬泬99精品 | 久久精品女人的天堂av | 亚洲日本在线电影 | 欧美自拍另类欧美综合图片区 | 亚洲春色在线视频 | 亚洲热妇无码av在线播放 | 中文字幕中文有码在线 | 鲁大师影院在线观看 | 欧美怡红院免费全部视频 | 午夜无码人妻av大片色欲 | 国产精品久久久久久久9999 | 内射欧美老妇wbb | 亚洲а∨天堂久久精品2021 | 任你躁国产自任一区二区三区 | 无码人妻出轨黑人中文字幕 | 少妇激情av一区二区 | 久久久中文久久久无码 | 久久综合九色综合欧美狠狠 | 成人精品一区二区三区中文字幕 | 天干天干啦夜天干天2017 | 精品国产精品久久一区免费式 | 国产精品亚洲lv粉色 | 夜精品a片一区二区三区无码白浆 | 无码av免费一区二区三区试看 | 免费无码午夜福利片69 | 国产亚洲精品久久久久久久 | 午夜精品一区二区三区在线观看 | 特黄特色大片免费播放器图片 | 成人亚洲精品久久久久 | 131美女爱做视频 | 久久99精品国产麻豆 | 无码国内精品人妻少妇 | 国产成人综合在线女婷五月99播放 | 精品一区二区三区波多野结衣 | 国产av久久久久精东av | 日韩av无码中文无码电影 | 在线 国产 欧美 亚洲 天堂 | 国产精品对白交换视频 | 乱码午夜-极国产极内射 | 色五月五月丁香亚洲综合网 | 一本久久伊人热热精品中文字幕 | 好屌草这里只有精品 | 欧洲极品少妇 | 无码精品国产va在线观看dvd | 国产精品美女久久久久av爽李琼 | 国产精品多人p群无码 | 色一情一乱一伦 | 伊人久久婷婷五月综合97色 | 无码人妻av免费一区二区三区 | 成人女人看片免费视频放人 | 国产在线aaa片一区二区99 | 亚洲精品成a人在线观看 | 成熟妇人a片免费看网站 | 色老头在线一区二区三区 | 又大又黄又粗又爽的免费视频 | 国产亚洲精品久久久久久大师 | 亚洲精品一区国产 | 麻豆果冻传媒2021精品传媒一区下载 | 青青草原综合久久大伊人精品 | 永久免费观看美女裸体的网站 | 国语自产偷拍精品视频偷 | 国产精品久久久av久久久 | 国产真人无遮挡作爱免费视频 | 乌克兰少妇xxxx做受 | 亚洲欧美日韩国产精品一区二区 | 国产农村妇女高潮大叫 | 亚洲а∨天堂久久精品2021 | a在线观看免费网站大全 | 精品无码av一区二区三区 | 国产一区二区三区四区五区加勒比 | 亚洲gv猛男gv无码男同 | 国产亚洲精品久久久久久国模美 | 波多野结衣一区二区三区av免费 | 久久天天躁狠狠躁夜夜免费观看 | a在线亚洲男人的天堂 | 久久人人97超碰a片精品 | 国产97人人超碰caoprom | 中文字幕乱妇无码av在线 | 日本www一道久久久免费榴莲 | 久久综合九色综合欧美狠狠 | 少妇久久久久久人妻无码 | 久久精品国产99精品亚洲 | 精品一二三区久久aaa片 | 欧洲熟妇精品视频 | av在线亚洲欧洲日产一区二区 | 国产精品美女久久久久av爽李琼 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 精品亚洲韩国一区二区三区 | 久久午夜无码鲁丝片秋霞 | 人人妻人人澡人人爽人人精品浪潮 | 一本久久a久久精品亚洲 | 亚洲码国产精品高潮在线 | 老熟女乱子伦 | 两性色午夜视频免费播放 | 精品人妻人人做人人爽夜夜爽 | 亚洲精品久久久久中文第一幕 | 国产精品怡红院永久免费 | 午夜精品久久久久久久 | 女人被男人爽到呻吟的视频 | 人妻少妇被猛烈进入中文字幕 | 97久久精品无码一区二区 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲va中文字幕无码久久不卡 | 国内精品一区二区三区不卡 | 久久亚洲国产成人精品性色 | 人人妻人人澡人人爽人人精品浪潮 | 波多野42部无码喷潮在线 | 久久久www成人免费毛片 | 精品成人av一区二区三区 | 亚洲国产成人av在线观看 | 国产成人无码av在线影院 | 大肉大捧一进一出视频出来呀 | 妺妺窝人体色www婷婷 | av人摸人人人澡人人超碰下载 | yw尤物av无码国产在线观看 | 日韩亚洲欧美精品综合 | 亚洲精品无码人妻无码 | 永久免费观看美女裸体的网站 | 国内综合精品午夜久久资源 | 台湾无码一区二区 | 亚洲欧美综合区丁香五月小说 | 在线天堂新版最新版在线8 | 曰韩少妇内射免费播放 | 国产两女互慰高潮视频在线观看 | 成 人影片 免费观看 | 中文字幕久久久久人妻 | 18禁黄网站男男禁片免费观看 | 欧美 日韩 人妻 高清 中文 | 国产电影无码午夜在线播放 | 波多野结衣一区二区三区av免费 | 国产精品高潮呻吟av久久4虎 | 欧美怡红院免费全部视频 | 天堂а√在线地址中文在线 | 性欧美牲交在线视频 | 无码精品国产va在线观看dvd | 啦啦啦www在线观看免费视频 | 熟女俱乐部五十路六十路av | 亚洲а∨天堂久久精品2021 | av无码不卡在线观看免费 | 欧美喷潮久久久xxxxx | 国产乱人伦偷精品视频 | 丰满人妻精品国产99aⅴ | 亚洲色欲久久久综合网东京热 | √天堂中文官网8在线 | 特大黑人娇小亚洲女 | 正在播放东北夫妻内射 | 色综合久久久久综合一本到桃花网 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 黑人大群体交免费视频 | 免费无码一区二区三区蜜桃大 | 无码人中文字幕 | 精品夜夜澡人妻无码av蜜桃 | 国产av一区二区三区最新精品 | 少妇被黑人到高潮喷出白浆 | 2020久久超碰国产精品最新 | 波多野结衣av一区二区全免费观看 | a在线观看免费网站大全 | 国产舌乚八伦偷品w中 | 欧美黑人乱大交 | 欧美人与禽zoz0性伦交 | 国产高潮视频在线观看 | 色狠狠av一区二区三区 | 风流少妇按摩来高潮 | 黑人粗大猛烈进出高潮视频 | 国产精品无码久久av | 国产精品美女久久久久av爽李琼 | 免费乱码人妻系列无码专区 | 在线 国产 欧美 亚洲 天堂 | 四虎国产精品免费久久 | 成人无码影片精品久久久 | www成人国产高清内射 | 伊人久久大香线蕉av一区二区 | 亚洲熟妇色xxxxx欧美老妇 | 国产亚洲人成a在线v网站 | 中文字幕中文有码在线 | 中文字幕av无码一区二区三区电影 | 欧美日韩在线亚洲综合国产人 | 永久免费精品精品永久-夜色 | 麻豆md0077饥渴少妇 | 无码人妻黑人中文字幕 | 国产精品a成v人在线播放 | 中文字幕人妻无码一夲道 | 久久精品国产一区二区三区 | 国产免费观看黄av片 | 日本大乳高潮视频在线观看 | 亚洲码国产精品高潮在线 | 中文字幕无码热在线视频 | 国产明星裸体无码xxxx视频 | 一个人看的视频www在线 | 中文字幕av伊人av无码av | 国产超碰人人爽人人做人人添 | 性生交片免费无码看人 | 亚洲人成网站在线播放942 | 丰满少妇高潮惨叫视频 | 亚洲一区二区三区 | 亚洲人成无码网www | 黑人大群体交免费视频 | 波多野结衣一区二区三区av免费 | 少妇厨房愉情理9仑片视频 | 乱人伦人妻中文字幕无码久久网 | 国模大胆一区二区三区 | 久久99精品久久久久久动态图 | 波多野结衣乳巨码无在线观看 | 综合网日日天干夜夜久久 | 国产成人午夜福利在线播放 | 少妇性俱乐部纵欲狂欢电影 | 国产真实夫妇视频 | 日韩欧美中文字幕公布 | 亚洲精品一区二区三区大桥未久 | 在线а√天堂中文官网 | 又黄又爽又色的视频 | 亚洲国产午夜精品理论片 | 男女下面进入的视频免费午夜 | 97人妻精品一区二区三区 | 黑人玩弄人妻中文在线 | 精品偷自拍另类在线观看 | 男女性色大片免费网站 | 最新版天堂资源中文官网 | 四十如虎的丰满熟妇啪啪 | 中文无码成人免费视频在线观看 | 中文字幕无码人妻少妇免费 | 久久午夜夜伦鲁鲁片无码免费 | 中文字幕av伊人av无码av | 人妻熟女一区 | 国产97人人超碰caoprom | 亚洲熟妇自偷自拍另类 | 亚洲日韩av一区二区三区中文 | 亚洲乱码国产乱码精品精 | а√资源新版在线天堂 | 亚洲综合精品香蕉久久网 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久影院嫩草 | 麻豆国产丝袜白领秘书在线观看 | 国内少妇偷人精品视频 | 国产偷自视频区视频 | 国产特级毛片aaaaaa高潮流水 | 欧美日韩视频无码一区二区三 | 国产97在线 | 亚洲 | 日本熟妇大屁股人妻 | 国内精品久久毛片一区二区 | 欧洲欧美人成视频在线 | 高潮毛片无遮挡高清免费视频 | 一本久久a久久精品亚洲 | 国产精品高潮呻吟av久久 | 国产又粗又硬又大爽黄老大爷视 | 丰满少妇弄高潮了www | 国内精品人妻无码久久久影院蜜桃 | 天天av天天av天天透 | 国产成人无码av在线影院 | 成人影院yy111111在线观看 | 99riav国产精品视频 | 最新版天堂资源中文官网 | 给我免费的视频在线观看 | 中文精品久久久久人妻不卡 | 男女作爱免费网站 | 激情内射日本一区二区三区 | 国产精品丝袜黑色高跟鞋 | 久久久中文字幕日本无吗 | 国模大胆一区二区三区 | 狠狠综合久久久久综合网 | 老子影院午夜精品无码 | 日韩人妻无码中文字幕视频 | 初尝人妻少妇中文字幕 | 免费视频欧美无人区码 | 久久99热只有频精品8 | 国模大胆一区二区三区 | 亚洲熟妇自偷自拍另类 | 久久亚洲中文字幕无码 | 国产一区二区不卡老阿姨 | 中文字幕无码免费久久99 | 久久久久99精品国产片 | 麻豆国产人妻欲求不满 | 国产精品美女久久久 | 永久黄网站色视频免费直播 | 国产亚洲精品久久久久久久久动漫 | 国产美女精品一区二区三区 | 麻豆md0077饥渴少妇 | 国产乱子伦视频在线播放 | 色五月五月丁香亚洲综合网 | 国产成人人人97超碰超爽8 | 青春草在线视频免费观看 | 高清不卡一区二区三区 | 欧美色就是色 | 丝袜美腿亚洲一区二区 | 无码福利日韩神码福利片 | 55夜色66夜色国产精品视频 | 国产精品久久国产三级国 | 中文字幕精品av一区二区五区 | 在线亚洲高清揄拍自拍一品区 | 中文字幕无码av激情不卡 | 青春草在线视频免费观看 | 天堂а√在线地址中文在线 | 国产精品二区一区二区aⅴ污介绍 | 欧美成人高清在线播放 | www国产精品内射老师 | 色狠狠av一区二区三区 | 免费乱码人妻系列无码专区 | 国产精品视频免费播放 | 免费无码一区二区三区蜜桃大 | 爽爽影院免费观看 | 无套内谢老熟女 | 日韩人妻少妇一区二区三区 | 人妻少妇精品视频专区 | 国产在线精品一区二区高清不卡 | 久久午夜无码鲁丝片秋霞 | 日韩成人一区二区三区在线观看 | 午夜无码区在线观看 | 国产亚洲精品精品国产亚洲综合 | 荫蒂添的好舒服视频囗交 | 中文字幕乱码亚洲无线三区 | 国产乱子伦视频在线播放 | 国产黑色丝袜在线播放 | 亚洲一区二区三区国产精华液 | 国产办公室秘书无码精品99 | 少妇高潮喷潮久久久影院 | 精品无码国产自产拍在线观看蜜 | 黑人巨大精品欧美黑寡妇 | 国内精品一区二区三区不卡 | 国产三级精品三级男人的天堂 | 玩弄人妻少妇500系列视频 | 女人和拘做爰正片视频 | 性做久久久久久久免费看 | aⅴ在线视频男人的天堂 | a在线亚洲男人的天堂 | 樱花草在线社区www | 性生交片免费无码看人 | 欧美国产日韩亚洲中文 | 永久免费精品精品永久-夜色 | 精品国产成人一区二区三区 | 伊人久久大香线蕉av一区二区 | 久久精品国产日本波多野结衣 | 国产午夜精品一区二区三区嫩草 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 丰满护士巨好爽好大乳 | 高清国产亚洲精品自在久久 | 女人和拘做爰正片视频 | 国产精品久久久久9999小说 | 亚洲综合无码久久精品综合 | 乱人伦人妻中文字幕无码久久网 | 中文字幕av日韩精品一区二区 | 国产无遮挡又黄又爽又色 | 精品久久久无码中文字幕 | 国产激情精品一区二区三区 | 永久黄网站色视频免费直播 | 无码任你躁久久久久久久 | 欧美 亚洲 国产 另类 | 欧美激情综合亚洲一二区 | 桃花色综合影院 | 999久久久国产精品消防器材 | 国产精品第一国产精品 | 永久黄网站色视频免费直播 | 丝袜 中出 制服 人妻 美腿 | 欧美亚洲国产一区二区三区 | 中文字幕中文有码在线 | 久久精品国产一区二区三区 | 成人免费视频在线观看 | 色情久久久av熟女人妻网站 | 初尝人妻少妇中文字幕 | 亚洲日本va午夜在线电影 | 成人无码视频免费播放 | 97资源共享在线视频 | 国产色精品久久人妻 | 中文无码伦av中文字幕 | 狠狠亚洲超碰狼人久久 | 日日摸天天摸爽爽狠狠97 | 日日摸天天摸爽爽狠狠97 | 男人的天堂2018无码 | 99久久久国产精品无码免费 | 扒开双腿吃奶呻吟做受视频 | 亚洲色在线无码国产精品不卡 | 国内少妇偷人精品视频 | 少妇性l交大片欧洲热妇乱xxx | 免费网站看v片在线18禁无码 | 亚洲啪av永久无码精品放毛片 | 亚洲成av人综合在线观看 | 窝窝午夜理论片影院 | 亚洲熟妇色xxxxx亚洲 | 国产熟妇另类久久久久 | 又色又爽又黄的美女裸体网站 | 国产精品亚洲а∨无码播放麻豆 | 亚洲成熟女人毛毛耸耸多 | 午夜精品久久久内射近拍高清 | 久久人妻内射无码一区三区 | 国产成人一区二区三区在线观看 | 国产av一区二区精品久久凹凸 | 黑人玩弄人妻中文在线 | 国产精华av午夜在线观看 | 国产人妻人伦精品1国产丝袜 | 人妻少妇精品无码专区二区 | 少妇高潮一区二区三区99 | 激情爆乳一区二区三区 | 欧美怡红院免费全部视频 | 色窝窝无码一区二区三区色欲 | 最新版天堂资源中文官网 | 国产激情无码一区二区app | 国产精品18久久久久久麻辣 | 国产午夜无码精品免费看 | 亚洲国产高清在线观看视频 | 国产成人精品一区二区在线小狼 | 国产精品高潮呻吟av久久 | 好屌草这里只有精品 | 色偷偷人人澡人人爽人人模 | 青青久在线视频免费观看 | 久久亚洲国产成人精品性色 | 色偷偷人人澡人人爽人人模 | 国产成人无码一二三区视频 | 日韩欧美群交p片內射中文 | 久久亚洲日韩精品一区二区三区 | 伊人久久大香线蕉亚洲 | 色综合久久久无码网中文 | 蜜臀aⅴ国产精品久久久国产老师 | 人人妻人人澡人人爽精品欧美 | 中文字幕乱码人妻二区三区 | 西西人体www44rt大胆高清 | 久久伊人色av天堂九九小黄鸭 | 特级做a爰片毛片免费69 | 中文字幕人成乱码熟女app | 国产又粗又硬又大爽黄老大爷视 | 妺妺窝人体色www婷婷 | 久久久成人毛片无码 | 久久亚洲中文字幕无码 | 好男人社区资源 | 成人欧美一区二区三区黑人免费 | 对白脏话肉麻粗话av | √天堂资源地址中文在线 | 好男人www社区 | 亚洲伊人久久精品影院 | 欧美性生交xxxxx久久久 | 2020久久香蕉国产线看观看 | 小sao货水好多真紧h无码视频 | 亚洲日本va午夜在线电影 | 无码人妻丰满熟妇区毛片18 | 最新国产麻豆aⅴ精品无码 | 精品熟女少妇av免费观看 | 国产精品igao视频网 | 亚洲成av人片天堂网无码】 | 欧美野外疯狂做受xxxx高潮 | 久久www免费人成人片 | 亚洲自偷自拍另类第1页 | 18禁黄网站男男禁片免费观看 | 久久久久国色av免费观看性色 | 狠狠躁日日躁夜夜躁2020 | 黑人粗大猛烈进出高潮视频 | 亚洲精品欧美二区三区中文字幕 | 色综合久久中文娱乐网 | 亚洲狠狠婷婷综合久久 | 国产香蕉97碰碰久久人人 | 国产熟妇高潮叫床视频播放 | 高潮毛片无遮挡高清免费 | 老熟妇仑乱视频一区二区 | 亚洲人成无码网www | 亚洲欧美日韩国产精品一区二区 | 中文字幕久久久久人妻 | 国产亚洲人成在线播放 | 牲欲强的熟妇农村老妇女 | 熟女少妇人妻中文字幕 | 嫩b人妻精品一区二区三区 | 76少妇精品导航 | 亚洲欧洲无卡二区视頻 | av在线亚洲欧洲日产一区二区 | 国产精品-区区久久久狼 | 国产精品久久久一区二区三区 | 女人被男人躁得好爽免费视频 | 亚洲熟女一区二区三区 | 激情内射亚州一区二区三区爱妻 | 亚洲精品一区二区三区四区五区 | 99久久婷婷国产综合精品青草免费 | 午夜无码人妻av大片色欲 | 成人免费视频一区二区 | 一区二区传媒有限公司 | 亚洲男人av香蕉爽爽爽爽 | 精品国产av色一区二区深夜久久 | 国产欧美精品一区二区三区 | 久久久精品456亚洲影院 | 国产午夜亚洲精品不卡 | 亚洲中文字幕久久无码 | 国产97在线 | 亚洲 | 好男人社区资源 | 午夜不卡av免费 一本久久a久久精品vr综合 | 色婷婷综合中文久久一本 | 欧美人与牲动交xxxx | 亚洲色偷偷偷综合网 | 一区二区三区高清视频一 | 人人妻人人澡人人爽人人精品 | 国产精品内射视频免费 | 波多野结衣乳巨码无在线观看 | 国产口爆吞精在线视频 | 亚洲日韩av一区二区三区四区 | 日韩精品成人一区二区三区 | 97久久国产亚洲精品超碰热 | 亚洲一区二区三区四区 | 国产麻豆精品一区二区三区v视界 | 欧洲精品码一区二区三区免费看 | 精品国产精品久久一区免费式 | 欧洲vodafone精品性 | 无码国内精品人妻少妇 | 无遮挡啪啪摇乳动态图 | 国产精品-区区久久久狼 | 午夜精品久久久内射近拍高清 | 丝袜 中出 制服 人妻 美腿 | 国模大胆一区二区三区 | 伊人久久大香线蕉av一区二区 | 欧美日韩在线亚洲综合国产人 | 亚洲日韩一区二区三区 | 国内精品久久久久久中文字幕 | 中文毛片无遮挡高清免费 | 免费播放一区二区三区 | 久久精品一区二区三区四区 | 97人妻精品一区二区三区 | 久久久久亚洲精品男人的天堂 | 中文字幕色婷婷在线视频 | 无码毛片视频一区二区本码 | 久久综合九色综合97网 | 免费播放一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 51国偷自产一区二区三区 | 人妻无码久久精品人妻 | 亚洲精品无码人妻无码 | 无码国产色欲xxxxx视频 | 亚洲熟妇色xxxxx亚洲 | 国产香蕉尹人视频在线 | 国内丰满熟女出轨videos | 国产莉萝无码av在线播放 | 亚洲国产欧美国产综合一区 | 99国产精品白浆在线观看免费 | 荡女精品导航 | 夜先锋av资源网站 | 2020久久香蕉国产线看观看 | 精品熟女少妇av免费观看 | 日本饥渴人妻欲求不满 | 高清无码午夜福利视频 | 亚洲一区二区观看播放 | 午夜福利一区二区三区在线观看 | 久久午夜无码鲁丝片午夜精品 | 亚洲精品一区二区三区四区五区 | 国产69精品久久久久app下载 | 欧美放荡的少妇 | 国产亚洲欧美日韩亚洲中文色 | 亚洲小说图区综合在线 | 免费无码的av片在线观看 | 精品久久8x国产免费观看 | 亚洲精品国产精品乱码不卡 | 扒开双腿吃奶呻吟做受视频 | 国产精品亚洲综合色区韩国 | 精品偷自拍另类在线观看 | 欧美成人家庭影院 | 国产成人综合在线女婷五月99播放 | 免费人成在线视频无码 | 波多野42部无码喷潮在线 | 亚洲国产av美女网站 | 色一情一乱一伦 | 男女超爽视频免费播放 | 夫妻免费无码v看片 | 丁香啪啪综合成人亚洲 | 无码人妻精品一区二区三区下载 | 亚洲日本va中文字幕 | 国产精品人人爽人人做我的可爱 | 亚洲 另类 在线 欧美 制服 | 国产乱人无码伦av在线a | 中文字幕日产无线码一区 | 国产成人无码专区 | 免费网站看v片在线18禁无码 | 免费看少妇作爱视频 | 亚洲欧洲中文日韩av乱码 | 欧洲美熟女乱又伦 | 欧洲美熟女乱又伦 | 日韩av无码一区二区三区不卡 | 娇妻被黑人粗大高潮白浆 | 老司机亚洲精品影院 | 鲁鲁鲁爽爽爽在线视频观看 | 国产人妻人伦精品 | 成人女人看片免费视频放人 | 国产高清不卡无码视频 | 久久99精品久久久久久动态图 | 欧洲美熟女乱又伦 | 亚洲日韩av一区二区三区中文 | а天堂中文在线官网 | 亚洲人成人无码网www国产 | 精品国产青草久久久久福利 | 国产精品无套呻吟在线 | 青草视频在线播放 | 久久亚洲精品成人无码 | 人人爽人人澡人人人妻 | 漂亮人妻洗澡被公强 日日躁 | 婷婷色婷婷开心五月四房播播 | 亚洲国产精华液网站w | 日韩少妇白浆无码系列 | av无码久久久久不卡免费网站 | 激情人妻另类人妻伦 | 精品人妻人人做人人爽夜夜爽 | 300部国产真实乱 | 无人区乱码一区二区三区 | 婷婷六月久久综合丁香 | 成人精品视频一区二区三区尤物 | 亚洲欧洲中文日韩av乱码 | 无码国产激情在线观看 | 国产97在线 | 亚洲 | 久久99精品久久久久婷婷 | 亚洲国产精品成人久久蜜臀 | 99久久久无码国产aaa精品 | www国产亚洲精品久久网站 | √天堂资源地址中文在线 | 国产三级精品三级男人的天堂 | 精品国产乱码久久久久乱码 | 亚洲熟悉妇女xxx妇女av | 亚洲春色在线视频 | 中文字幕无码人妻少妇免费 | 日本精品人妻无码免费大全 | 日韩欧美中文字幕在线三区 | 蜜臀av在线播放 久久综合激激的五月天 | 秋霞特色aa大片 | 国产又粗又硬又大爽黄老大爷视 | 性欧美熟妇videofreesex | 奇米影视7777久久精品 | 在线观看欧美一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 99久久婷婷国产综合精品青草免费 | 久久人人爽人人爽人人片av高清 | 少妇被黑人到高潮喷出白浆 | 国产精品久久久久久亚洲毛片 | 中文字幕无码视频专区 | 国产后入清纯学生妹 | 香港三级日本三级妇三级 | 婷婷五月综合缴情在线视频 | 我要看www免费看插插视频 | 中文字幕乱妇无码av在线 | 少妇被黑人到高潮喷出白浆 | 亚洲中文字幕无码一久久区 | 国产精品手机免费 | 欧美 日韩 人妻 高清 中文 | 国产av无码专区亚洲a∨毛片 | 中文字幕无码av激情不卡 | 人人妻人人澡人人爽精品欧美 | 中文字幕+乱码+中文字幕一区 | 未满小14洗澡无码视频网站 | 精品无码av一区二区三区 | 精品乱子伦一区二区三区 | 亚洲精品一区二区三区大桥未久 | 九九在线中文字幕无码 | 欧美一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 国产精品人人爽人人做我的可爱 | 亚洲无人区午夜福利码高清完整版 | 呦交小u女精品视频 | 狠狠躁日日躁夜夜躁2020 | 亚洲人成网站在线播放942 | 亚洲春色在线视频 | 国产av无码专区亚洲a∨毛片 | 欧美刺激性大交 | 亚洲狠狠色丁香婷婷综合 | 国产成人av免费观看 | 国产成人无码一二三区视频 | 无码av岛国片在线播放 | 亚洲 日韩 欧美 成人 在线观看 | 欧美野外疯狂做受xxxx高潮 | 无码av免费一区二区三区试看 | 精品一区二区三区无码免费视频 | 日韩精品一区二区av在线 | 亚洲s色大片在线观看 | 亚洲人交乣女bbw | 亚洲中文字幕无码中字 | 国产欧美熟妇另类久久久 | 动漫av一区二区在线观看 | 久久人人爽人人人人片 | 日本熟妇大屁股人妻 | 中文字幕+乱码+中文字幕一区 | 亚洲精品综合五月久久小说 | 国产精品人妻一区二区三区四 | 国内精品九九久久久精品 | 久久久精品国产sm最大网站 | 久久久久久久人妻无码中文字幕爆 | 国产精品久久久久久久影院 | 中文字幕乱妇无码av在线 | 一本精品99久久精品77 | 18禁止看的免费污网站 | 成人一在线视频日韩国产 | 99久久亚洲精品无码毛片 | 亚洲精品久久久久中文第一幕 | 国产 浪潮av性色四虎 | 色妞www精品免费视频 | 中文字幕无码免费久久99 | 中文字幕av日韩精品一区二区 | 国产艳妇av在线观看果冻传媒 | 激情综合激情五月俺也去 | 小sao货水好多真紧h无码视频 | 欧美日韩一区二区综合 | 偷窥村妇洗澡毛毛多 | 熟女少妇在线视频播放 | 欧美人与善在线com | 亚洲国产精品无码一区二区三区 | 男女猛烈xx00免费视频试看 | 国产精品久久久久无码av色戒 | 日日躁夜夜躁狠狠躁 | 国产片av国语在线观看 | 婷婷丁香六月激情综合啪 | 国产精品自产拍在线观看 | 樱花草在线播放免费中文 | 成人精品视频一区二区三区尤物 | 国产成人人人97超碰超爽8 | 无码人妻少妇伦在线电影 | 青春草在线视频免费观看 | 日本乱偷人妻中文字幕 | 美女极度色诱视频国产 | 国产做国产爱免费视频 | 亚洲成av人片在线观看无码不卡 | 成人欧美一区二区三区黑人免费 | 中文字幕 人妻熟女 | 狂野欧美激情性xxxx | 中文字幕无线码免费人妻 | 久久婷婷五月综合色国产香蕉 | 一个人免费观看的www视频 | 女人被爽到呻吟gif动态图视看 | 国产精品人妻一区二区三区四 | 久久99精品国产麻豆蜜芽 | 国产在热线精品视频 | 又粗又大又硬毛片免费看 | 天堂а√在线地址中文在线 | 久久国产自偷自偷免费一区调 | 久久久久久亚洲精品a片成人 | av在线亚洲欧洲日产一区二区 | 国产精品久久久一区二区三区 | 又粗又大又硬又长又爽 | 理论片87福利理论电影 | 好爽又高潮了毛片免费下载 | 国产av无码专区亚洲awww | 欧美日韩色另类综合 | 在线欧美精品一区二区三区 | 久久久av男人的天堂 | 国产免费无码一区二区视频 | 亚洲精品成人福利网站 | 爽爽影院免费观看 | 亚洲精品综合一区二区三区在线 | 亚洲人成影院在线无码按摩店 | 国产黄在线观看免费观看不卡 | 亚无码乱人伦一区二区 | 午夜精品一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | 一本一道久久综合久久 | 国产亚洲tv在线观看 | 精品国产一区二区三区av 性色 | 国内精品人妻无码久久久影院蜜桃 | 国产精品爱久久久久久久 | 久久综合色之久久综合 | 亚洲 a v无 码免 费 成 人 a v | 亚洲熟女一区二区三区 | 亚洲精品久久久久avwww潮水 | 国产成人无码区免费内射一片色欲 | 黑人玩弄人妻中文在线 | 亚洲男人av香蕉爽爽爽爽 | 免费视频欧美无人区码 | 亚拍精品一区二区三区探花 | 亚洲色欲色欲天天天www | 亚洲日本一区二区三区在线 | 亚洲男人av香蕉爽爽爽爽 | 国产艳妇av在线观看果冻传媒 | 精品乱码久久久久久久 | 激情人妻另类人妻伦 | 狠狠综合久久久久综合网 | 亚洲综合无码久久精品综合 | 国产精品无码成人午夜电影 | 欧美兽交xxxx×视频 | 欧美放荡的少妇 | 狠狠躁日日躁夜夜躁2020 | а√天堂www在线天堂小说 | 亚洲精品久久久久久一区二区 | 免费国产黄网站在线观看 | 国产69精品久久久久app下载 | 欧洲vodafone精品性 | 亚洲爆乳大丰满无码专区 | 亚洲中文字幕无码一久久区 | 偷窥村妇洗澡毛毛多 | 玩弄中年熟妇正在播放 | 亚洲综合另类小说色区 | 成 人 免费观看网站 | 图片小说视频一区二区 | 人人妻人人藻人人爽欧美一区 | 娇妻被黑人粗大高潮白浆 | 狠狠色噜噜狠狠狠7777奇米 | 天天做天天爱天天爽综合网 | 国产成人无码av片在线观看不卡 | 97资源共享在线视频 | 国产情侣作爱视频免费观看 | 国色天香社区在线视频 | 天堂а√在线地址中文在线 | 久久国产精品二国产精品 | 久久熟妇人妻午夜寂寞影院 | 99久久久无码国产精品免费 | 国内精品九九久久久精品 | 少妇被黑人到高潮喷出白浆 | 帮老师解开蕾丝奶罩吸乳网站 | 最新版天堂资源中文官网 | 国内丰满熟女出轨videos | 久久人妻内射无码一区三区 | 九九久久精品国产免费看小说 | 久久精品国产日本波多野结衣 | 欧美国产亚洲日韩在线二区 | 色噜噜亚洲男人的天堂 | 久激情内射婷内射蜜桃人妖 | 乱码av麻豆丝袜熟女系列 | 免费播放一区二区三区 | 天天摸天天碰天天添 | 丰满诱人的人妻3 | 中文字幕无线码 | 国产人妻人伦精品1国产丝袜 | 黑人玩弄人妻中文在线 | 清纯唯美经典一区二区 | 免费无码肉片在线观看 | 日韩精品久久久肉伦网站 | 国产精品高潮呻吟av久久4虎 | 在线成人www免费观看视频 | 欧美老妇交乱视频在线观看 | 无码人妻久久一区二区三区不卡 | 久久婷婷五月综合色国产香蕉 | 97久久超碰中文字幕 | 亚洲欧美综合区丁香五月小说 | 国产美女精品一区二区三区 | 亚洲精品综合五月久久小说 | 亚洲 激情 小说 另类 欧美 | 未满小14洗澡无码视频网站 | 无码国产色欲xxxxx视频 | 日日橹狠狠爱欧美视频 | 亚洲精品一区二区三区婷婷月 | 免费无码av一区二区 | 日日干夜夜干 | 亚洲色无码一区二区三区 | 国产精品久久久久7777 | 最新版天堂资源中文官网 | 青草视频在线播放 | a在线亚洲男人的天堂 | 日日噜噜噜噜夜夜爽亚洲精品 | 成人精品一区二区三区中文字幕 | 欧美freesex黑人又粗又大 | 成人免费视频在线观看 | 高潮毛片无遮挡高清免费 | 无码午夜成人1000部免费视频 | 图片区 小说区 区 亚洲五月 | 久久综合久久自在自线精品自 | 日韩人妻无码一区二区三区久久99 | 樱花草在线播放免费中文 | 玩弄人妻少妇500系列视频 | 国产精品国产三级国产专播 | 亚洲无人区午夜福利码高清完整版 | 日韩亚洲欧美中文高清在线 | 久久精品国产日本波多野结衣 | aⅴ在线视频男人的天堂 | 性欧美熟妇videofreesex | 岛国片人妻三上悠亚 | 国产真实乱对白精彩久久 | 最新国产乱人伦偷精品免费网站 | 亚洲精品一区二区三区大桥未久 | 久久www免费人成人片 | 国产乱子伦视频在线播放 | 国语精品一区二区三区 | 又湿又紧又大又爽a视频国产 | 无码av免费一区二区三区试看 | 熟女少妇在线视频播放 | 波多野结衣高清一区二区三区 | 久久综合给合久久狠狠狠97色 | 人人妻人人澡人人爽欧美一区 | 久久99热只有频精品8 | 国产绳艺sm调教室论坛 | 亚洲日韩av一区二区三区四区 | 女人被男人爽到呻吟的视频 | 亚洲中文字幕乱码av波多ji | 无码精品人妻一区二区三区av | 亚洲色偷偷偷综合网 | 四虎永久在线精品免费网址 | 国精品人妻无码一区二区三区蜜柚 | 久久人人爽人人爽人人片ⅴ | 中文毛片无遮挡高清免费 | 俺去俺来也www色官网 | 成年美女黄网站色大免费全看 | 日本欧美一区二区三区乱码 | 欧美自拍另类欧美综合图片区 | 成人免费视频一区二区 | 精品偷拍一区二区三区在线看 | 国产午夜精品一区二区三区嫩草 | 国产一精品一av一免费 | 成人一区二区免费视频 |