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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux内核中的GPIO系统之(3):pin controller driver代码分析

發布時間:2025/4/16 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内核中的GPIO系统之(3):pin controller driver代码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

對于一個嵌入式軟件工程師,我們的軟件模塊經常和硬件打交道,pin control subsystem也不例外,被它驅動的硬件叫做pin controller(一般ARM soc的datasheet會把pin controller的內容放入GPIO controller的章節中),主要功能包括:

(1)pin multiplexing。基于ARM core的嵌入式處理器一般會提供豐富的功能,例如camera interface、LCD interface、USB、I2C、SPI等等。雖然處理器有幾百個pin,但是這些pin還是不夠分配,因此有些pin需要復用。例如:127號GPIO可以做一個普通的GPIO控制LED,也可以配置成I2C的clock信號,也可以配置成SPI的data out信號。當然,這些功能不可能同時存在,因為硬件信號只有一個。

(2)pin configuration。這些配置參數包括:pull-up/down電阻的設定, tri-state設定,drive-strength的設定。

本文主要描述pin control subsystem中的low level driver,也就是驅動pin controller的driver。具體的硬件選用的是S3C2416的硬件平臺。既然是代碼分析,本文不是非常多的描述框架性的內容,關于整個pin control subsystem軟件結構的描述請參考Linux內核中的GPIO系統之(2)。

閱讀本文需要device tree的知識,建議首先閱讀device tree代碼分析。

?

二、pin controller相關的DTS描述

類似其他的硬件,pin controller這個HW block需要是device tree中的一個節點。此外,各個其他的HW block在驅動之前也需要先配置其引腳復用功能,因此,這些device(我們稱pin controller是host,那么這些使用pin controller進行引腳配置的device叫做client device)也需要在它自己的device tree node中描述pin control的相關內容

1、S3C2416 pin controller DTS結構

下面的偽代碼描述了S3C2416 pin controller 的DTS結構:

pinctrl@56000000 {??
??????? 定義S3C2416 pin controller自己的屬性

??????? 定義屬于S3C2416 pin controller的pin configurations

}

每個pin configuration都是pin controller的child node,描述了client device要使用到的一組pin的配置信息。具體如何定義pin configuration是和具體的pin controller相關的。

在pin controller node中定義pin configuration其目的是為了讓client device引用。所謂client device其實就是使用pin control subsystem提供服務的那些設備,例如串口設備。在使用之前,我們一般會在初始化代碼中配置相關的引腳功能是串口功能。有了device tree,我們可以通過device tree來傳遞這樣的信息。也就是說,各個device可以通過自己節點的屬性來指向pin controller的某個child node,也就是pin configuration了。samsung 24xx系列SOC的pin controller的pin configurations包括兩類,一類是定義pin bank,另外一類是定義功能復用配置。

2、pin configuration定義

我們舉兩個簡單的例子(當然一個是pin bank,另外一個是定義功能復用配置)來理解pin configuration第一個例子是描述pin bank:

pinctrl@56000000 {??
??????? 定義S3C2416 pin controller自己的屬性

……

??????? gpf {?
??????????? gpio-controller;?
??????????? #gpio-cells = <0x2>;?
??????????? interrupt-controller;?
??????????? #interrupt-cells = <0x2>;?
??????????? linux,phandle = <0xc>;?
??????????? phandle = <0xc>;?
??????? };

……

}

其實S3C2416 pin controller定義了gpa到gpm共計11個sub node,每個sub node是描述S3C2416 GPIO controller的各個bank信息。S3C2416有138個I/O 端口(或者叫做pin、finger、pad)這些端口分成了11個bank(這里沒有用group這個術語,為了和pin group這個概念區分開,pin group的概念下面會具體描述):

Port A(GPA) : 25-output port?
Port B(GPB) : 9-input/output port?
Port C(GPC) : 16-input/output port?
Port D(GPD) : 16-input/output port?
Port E(GPE) : 16-input/output port?
Port F(GPF) : 8-input/output port?
Port G(GPG) : 8-input/output port?
Port H(GPH) : 15-input/output port?
Port K(GPK) : 16-input/output port?
Port L(GPL) : 7-input/output port?
Port M(GPM) : 2-input port

之所以分成bank,主要是把特性相同的GPIO進行分組,方便控制。例如:這些bank中,只有GPF和GPG這兩個bank上的引腳有中斷功能,其他的都沒有。interrupt-controller這個屬性相信大家已經熟悉,就是說明該node是一個interrupt controller。gpio-controller類似,說明該device node是一個GPIO controller。#gpio-cells屬性是一個GPIO controller的必須定義的屬性,它描述了需要多少個cell來具體描述一個GPIO(這是和具體的GPIO controller相關的)。#interrupt-cells的概念類似,不再贅述。phandle(linux,phandle這個屬性和phandle是一樣的,只不過linux,phandle是old-style,多定義一個屬性是為了兼容)定義了一個句柄,當其他的device node想要引用這個node的時候就可以使用該句柄。具體的例子參考下節client device的DTS的描述。

另外一個例子是uart的pin configuration,代碼如下:

pinctrl@56000000 {??
??????? 定義S3C2416 pin controller自己的屬性

……

uart0-data {?
??? samsung,pins = "gph-0", "gph-1";?
??? samsung,pin-function = <0x2>;?
??? linux,phandle = <0x2>;?
??? phandle = <0x2>;?
};

uart0-fctl {?
??? samsung,pins = "gph-8", "gph-9";?
??? samsung,pin-function = <0x2>;?
??? linux,phandle = <0x3>;?
??? phandle = <0x3>;?
};

……

}

samsung,pins這個屬性定義了一個pin configuration所涉及到的引腳定義。對于uart0-data這個node,該配置涉及了gph bank中的第一個和第二個GPIO pin。一旦選擇了一個功能,那么samsung,pins定義的所有的引腳都需要做相應的功能設定,那么具體設定什么值呢?這就是samsung,pin-function定義的內容了。而具體設定哪個值則需要去查閱datasheet了。對于uart0-data,向gph bank中的第一個和第二個GPIO pin對應的配置寄存器中寫入2就可以把這兩個pin定義為uart功能。

3.client device的DTS

一個典型的device tree中的外設node定義如下:

device-node-name {??
??????? 定義該device自己的屬性??

??????? pinctrl-names = "sleep", "active";------(1)?
??????? pinctrl-0 =?<pin-config-0-a>;--------------(2)?
??????? pinctrl-1 =?<pin-config-1-a pin-config-1-b>;?????????
??? };

(1)pinctrl-names定義了一個state列表。那么什么是state呢?具體說應該是pin state,對于一個client device,它使用了一組pin,這一組pin應該同時處于某種狀態,畢竟這些pin是屬于一個具體的設備功能。state的定義和電源管理關系比較緊密,例如當設備active的時候,我們需要pin controller將相關的一組pin設定為具體的設備功能,而當設備進入sleep狀態的時候,需要pin controller將相關的一組pin設定為普通GPIO,并精確的控制GPIO狀態以便節省系統的功耗。state有兩種,標識,一種就是pinctrl-names定義的字符串列表,另外一種就是ID。ID從0開始,依次加一。根據例子中的定義,state ID等于0(名字是active)的state對應pinctrl-0屬性,state ID等于1(名字是idle)的state對應pinctrl-1屬性。具體設備state的定義和各個設備相關,具體參考在自己的device bind。

(2)pinctrl-x的定義。pinctrl-x是一個句柄(phandle)列表,每個句柄指向一個pin configuration。有時候,一個state對應多個pin configure。例如在active的時候,I2C功能有兩種配置,一種是從pin ID{7,8}引出,另外一個是從pin ID{69,103}引出。

我們選取samsung串口的dts定義如下:

serial@50000000 {??
??????? ……?
??????? pinctrl-names = "default";?
??????? pinctrl-0 = <0x2 0x3>;?
??? };

該serial device只定義了一個state就是default,對應pinctrl-0屬性定義。pinctrl-0是一個句柄(phandle)列表,每個句柄指向一個pin configuration。0x2對應上節中的uart0-data節點,0x03對應uart0-fctl 節點,也就是說,這個串口有兩種配置,一種是從gph bank中的第一個和第二個GPIO pin引出,另外一個是從gph bank中的第8個和第9個GPIO pin引出。

?

三、 pin controller driver初始化

1、注冊pin control device

舊的內核一般是在machine相關的代碼中建立靜態的platform device的數據結構,然后在machine初始化的時候,將靜態定義的platform device注冊到系統。不過在引入device tree之后,事情發生了變化。

根據device tree代碼分析,我們知道,在系統初始化的時候,dts描述的device node會形成一個樹狀結構,在machine初始化的過程中,會scan device node的樹狀結構,將真正的硬件device node變成一個個的設備模型中的device結構(比如struct platform_device)并加入到系統中。我們看看具體2416描述pin controller的dts code,如下:

pinctrl@56000000 {?
??????? reg = <0x56000000 0x1000="">;?
??????? compatible = "samsung,s3c2416-pinctrl";

……省略wakeup的pin configuration

……省略gpb~gpm這些pink bank的pin configuration

……省略Pin groups的相關描述

}

reg屬性描述pin controller硬件的地址信息,開始地址是0x56000000 ,地址長度是0x1000。compatible屬性用來描述pin controller的programming model。該屬性的值是string list,定義了一系列的modle(每個string是一個model)。這些字符串列表被操作系統用來選擇用哪一個pin controller driver來驅動該設備,后面的代碼會更詳細的描述。 pin control subsystem要想進行控制,必須首先了解自己控制的對象,也就是說軟件需要提供一個方法將各種硬件信息(total有多少可控的pin,有多少bank,pin的復用情況以及pin的配置情況)注冊到pin control subsystem中,這也是pin controller driver的初始化的主要內容。這些信息當然可以通過定義靜態的表格(參考linux/drivers/pinctrl目錄下的pinctrl-u300.c文件,該文件定義了一個大數組u300_pads來描述每一個pin),也可以通過dts加上靜態表格的方式(2416采用的方式)。

2、注冊pin controller driver

當然,pinctrl@56000000這個device node也會變成一個platform device加入系統。有了device,那么對應的platform driver是如何注冊到系統中的呢?代碼如下:

static int __init samsung_pinctrl_drv_register(void)?
{?
?? ……

??? return platform_driver_register(&samsung_pinctrl_driver);?
}

系統初始化的時候,該函數會執行,向系統注冊了samsung_pinctrl_driver:

static struct platform_driver samsung_pinctrl_driver = {?
??? .probe??????? = samsung_pinctrl_probe, ----該driver的初始化函數?
??? .driver = {?
??????? .name??? = "samsung-pinctrl",?
??????? .owner??? = THIS_MODULE,?
??????? .of_match_table = samsung_pinctrl_dt_match, ----匹配列表?
??? },?
};

?

3、probe過程(driver初始化過程)

在linux kernel引入統一設備模型之后,bus、driver和device形成了設備模型中的鐵三角。對于platform這種類型的bus,其鐵三角數據是platform_bus_type(表示platform這種類型的bus)、struct platform_device(platform bus上的device)、struct platform_driver(platform bus上的driver)。統一設備模型大大降低了驅動工程師的工作量,驅動工程師只要將driver注冊到系統即可,剩余的事情交給統一設備模型來完成。每次系統增加一個platform_driver,platform_bus_type都會啟動scan過程,讓新加入的driver掃描整個platform bus上的device的鏈表,看看是否有device讓該driver驅動。同樣的,每次系統增加一個platform_device,platform_bus_type也會啟動scan過程,遍歷整個platform bus上的driver的鏈表,看看是否有適合驅動該device的driver。具體匹配的代碼是platform bus上的match函數,如下:

static int platform_match(struct device *dev, struct device_driver *drv)?
{?
??? struct platform_device *pdev = to_platform_device(dev);?
??? struct platform_driver *pdrv = to_platform_driver(drv);

??? /* Attempt an OF style match first */?
??? if (of_driver_match_device(dev, drv))?
??????? return 1;

??? /* Then try ACPI style match */?
??? if (acpi_driver_match_device(dev, drv))?
??????? return 1;

??? /* Then try to match against the id table */?
??? if (pdrv->id_table)?
??????? return platform_match_id(pdrv->id_table, pdev) != NULL;

??? /* fall-back to driver name match */?
??? return (strcmp(pdev->name, drv->name) == 0);?
}

舊的的platform的匹配函數就是簡單的比較device和driver的名字,多么簡單,多么清晰,真是有點懷念過去單純而美好的生活。當然,事情沒有那么糟糕,我們這里只要關注OF style的匹配過程即可,思路很簡單,解鈴還需系鈴人,把匹配過程推給device tree模塊,代碼如下:

const struct of_device_id *of_match_device(const struct of_device_id *matches,?
?????????????????????? const struct device *dev)?
{?
??? if ((!matches) || (!dev->of_node))?
??????? return NULL;?
??? return of_match_node(matches, dev->of_node);?
}

platform driver提供了match table(struct device_driver 中的of_match_table的成員)。platform device提供了device tree node(struct device中的of_node成員)。對于我們這個場景,match table是samsung_pinctrl_dt_match,代碼如下:

static const struct of_device_id samsung_pinctrl_dt_match[] = {?
……?
??? { .compatible = "samsung,s3c2416-pinctrl",?
??????? .data = s3c2416_pin_ctrl },?
……?
??? {},?
};

再去看看dts中pin controller的節點compatible屬性的定義,你會禁不住感慨:啊,終于遇到對的人。這里還要特別說明的是data成員被設定為s3c2416_pin_ctrl ,它描述了2416的HW pin controller,我們稱之samsung pin controller的描述符,初始化的過程中需要這個數據結構,后面還會詳細介紹它。一旦pin controller這個device遇到了適當的driver,就會調用probe函數進行具體的driver初始化的動作了,代碼如下:

static int samsung_pinctrl_probe(struct platform_device *pdev)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;?
??? struct device *dev = &pdev->dev;?
??? struct samsung_pin_ctrl *ctrl;?
??? struct resource *res;?
??? int ret;

??? drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); ------(1)

??? ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev); ----------(2)?
??? drvdata->ctrl = ctrl;?
??? drvdata->dev = dev;

??? res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -----分配memory資源?
??? drvdata->virt_base = devm_ioremap_resource(&pdev->dev, res);?
??? if (IS_ERR(drvdata->virt_base))?
??????? return PTR_ERR(drvdata->virt_base);

??? res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ------分配IRQ資源?
??? if (res)?
??????? drvdata->irq = res->start;

??? ret = samsung_gpiolib_register(pdev, drvdata); -------------(3)

??? ret = samsung_pinctrl_register(pdev, drvdata); -------------(4)

??? if (ctrl->eint_gpio_init) ------------------(5)?
??????? ctrl->eint_gpio_init(drvdata);?
??? if (ctrl->eint_wkup_init)?
??????? ctrl->eint_wkup_init(drvdata);

??? platform_set_drvdata(pdev, drvdata); -設定platform device的私有數據為samsung_pinctrl_drv_data

??? /* Add to the global list */?
??? list_add_tail(&drvdata->node, &drvdata_list); --掛入全局鏈表

??? return 0;?
}

(1)devm_kzalloc函數是為struct samsung_pinctrl_drv_data數據結構分配內存。每當driver probe一個具體的device實例的時候,都需要建立一些私有的數據結構來保存該device的一些具體的硬件信息(本場景中,這個數據結構就是struct samsung_pinctrl_drv_data)。在過去,驅動工程師多半使用kmalloc或者kzalloc來分配內存,但這會帶來一些潛在的問題。例如:在初始化過程中,有各種各樣可能的失敗情況,這時候就依靠driver工程師小心的撰寫代碼,釋放之前分配的內存。當然,初始化過程中,除了memory,driver會為probe的device分配各種資源,例如IRQ 號,io memory map、DMA等等。當初始化需要管理這么多的資源分配和釋放的時候,很多驅動程序都出現了資源管理的issue。而且,由于這些issue是異常路徑上的issue,不是那么容易測試出來,更加重了解決這個issue的必要性。內核解決這個問題的模式(所謂解決一類問題的設計方法就叫做設計模式)是Devres,即device resource management軟件模塊。更細節的內容就不介紹了,其核心思想就是資源是設備的資源,那么資源的管理歸于device,也就是說不需要driver過多的參與。當device和driver detach的時候,device會自動的釋放其所有的資源。

(2)分配了struct samsung_pinctrl_drv_data數據結構的內存,當然下一步就是初始化這個數據結構了。我們先看看2416的pin controller driver是如何定義該數據結構的:

struct samsung_pinctrl_drv_data {?
??? struct list_head??????? node;---------多個pin controller的描述符可以形成鏈表?
??? void __iomem??????????? *virt_base;---------訪問硬件寄存器的基地址?
??? struct device??????????? *dev;-----------和platform device建立聯系?
??? int??????????????? irq; --------irq number,對于2416 pin control硬件而言,不需要irq資源

??? struct samsung_pin_ctrl??????? *ctrl;----samsung pin controller描述符?
??? struct pinctrl_desc??????? pctl; ------指向pin control subsystem中core driver中抽象的

????????????????????????????????????????????????????????????? pin controller描述符。?
??? struct pinctrl_dev??????? *pctl_dev; ------指向core driver的pin controller class device

??? const struct samsung_pin_group??? *pin_groups; -描述samsung pin controller中pin groups的信息?
??? unsigned int??????????? nr_groups; --------描述samsung pin controller中pin groups的數目?
??? const struct samsung_pmx_func??? *pmx_functions; --描述samsung pin controller中function信息
??? unsigned int??????????? nr_functions; --------描述samsung pin controller中function的數目?
};

struct pinctrl_desc和struct pinctrl_dev 都是pin control subsystem中core driver的概念。各個具體硬件的pin controller可能會各不相同,但是可以抽取其共同的部分來形成一個HW independent的數據結構,這個數據就是pin controller描述符,在core driver中用struct pinctrl_desc表示,具體該數據結構的定義如下:

struct pinctrl_desc {?
??? const char *name;?
??? struct pinctrl_pin_desc const *pins;---指向npins個pin描述符,每個描述符描述一個pin?
??? unsigned int npins;------------該pin controller中有多少個可控的pin?
??? const struct pinctrl_ops *pctlops;------callback函數,是core driver和底層driver的接口?
??? const struct pinmux_ops *pmxops;-----callback函數,是core driver和底層driver的接口?
??? const struct pinconf_ops *confops;-----callback函數,是core driver和底層driver的接口?
??? struct module *owner;?
};

其實整個初始化過程的核心思想就是low level的driver定義一個pinctrl_desc ,設定pin相關的定義和callback函數,注冊到pin control subsystem中。我們用引腳描述符(pin descriptor)來描述一個pin。在pin control subsystem中,struct pinctrl_pin_desc用來描述一個可以控制的引腳,我們稱之引腳描述符,代碼如下:

struct pinctrl_pin_desc {?
??? unsigned number;-------ID,在本pin controller中唯一標識該引腳?
??? const char *name;-------user friedly name?
??? void *drv_data;?
};

冰冷的pin ID是給機器用的,而name是給用戶使用的,是ascii字符。

struct pinctrl_dev在pin control subsystem的core driver中抽象一個pin control device。其實我們可以通過多個層面來定義一個device。在這個場景下,pin control subsystem的core driver關注的是一類pin controller的硬件設備,具體其底層是什么硬件連接方式,使用什么硬件協議它不關心,它關心的是pin controller這類設備所有的通用特性和功能。當然2416的pin controller是通過platform bus連接的,因此,在low level的層面,需要一個platform device來標識2416的pin controller(需要注意的是:pin controller class device和platform device都是基于一個驅動模型中的device派生而來的,這里struct device是基類,struct pinctrl_dev和struct platform_device都是派生類,當然c本身不支持class,但面向對象的概念是同樣的)。為了充分理解class這個概念,我們再舉一個例子。對于audio的硬件抽象層,它應該管理所有的audio設備,因此這個軟件模塊應該有一個audio class的鏈表,連接了所有的系統中的audio設備。但這些具體的audio設備可能是PCI接口的audio設備,也可能是usb接口的audio設備,從具體的總線層面來看,也會有PCI或者USB設備來抽象對應的聲卡設備。

OK,我們再看看samsung_pinctrl_drv_data底部四個成員,要理解該數據結構底部的四個成員,還要理解什么是pin mux function,什么是pin group。對于SOC而言,其引腳除了配置成普通GPIO之外,若干個引腳還可以組成一個pin group,形成特定的功能。例如pin number是{ 0, 8, 16, 24 }這四個引腳組合形成一個pin group,提供SPI的功能。既然有了pin group的概念,為何又有function這個概念呢?什么是function呢?SPI是function,I2C也是一個function,當然GPIO也是一個function。一個function有可能對應一組或者多組pin。例如:為了設計靈活,芯片內部的SPI0的功能可能引出到pin group { A8, A7, A6, A5 },也可能引出到另外一個pin group{ G4, G3, G2, G1 },但毫無疑問,這兩個pin group不能同時active,畢竟芯片內部的SPI0的邏輯功能電路只有一個。 從這個角度看,pin control subsystem要進行功能設定的時候必須要給出function以及function的pin group才能確定所有的物理pin的位置。

我們前面已經說過了,struct samsung_pinctrl_drv_data數據結構就是2416的pin controller driver要驅動2416的HW pin controller的私有數據結構。這個數據結構中最重要的就是samsung pin controller描述符了。關于pin controller有兩個描述符,一個是struct pinctrl_desc,是具體硬件無關的pin controller的描述符。struct samsung_pin_ctrl描述的具體samsung pin controller硬件相關的信息,比如說:pin bank的信息,不是所有的pin controller都是分bank的,因此pin bank的信息只能封裝在low level的samsung pin controller driver中。這個數據結構定義如下:

struct samsung_pin_ctrl {?
??? struct samsung_pin_bank??? *pin_banks;----定義具體的pin bank信息?
??? u32??????? nr_banks; ---------number of pin bank

??? u32??????? base;----該pin controller的pin ID base。?
??? u32??????? nr_pins; -----總的可以控制的pin的數目

其他成員和本場景無關,和GPIO type的中斷控制器驅動代碼有關?
};

關于上面的base可以多說兩句。實際上,系統支持多個pin controller設備,這時候,系統要管理多個pin controller控制下的多個pin。每個pin有自己的pin ID,是唯一的,假設系統中有兩個pin controller,一個是A,控制32個,另外一個是B,控制64個pin,我們可以統一編號,對A,pin ID從0~31,對于B,pin ID是從32~95。對于B,其pin base就是32。

samsung_pinctrl_probe->samsung_pinctrl_get_soc_data函數中會根據device tree的信息和靜態定義的table來初始化該描述符,具體的代碼如下:

static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(?
??????????????? struct samsung_pinctrl_drv_data *d,?
??????????????? struct platform_device *pdev)?
{?
??? int id;?
??? const struct of_device_id *match;?
??? struct device_node *node = pdev->dev.of_node; ---獲取device tree中的device node指針?
??? struct device_node *np;?
??? struct samsung_pin_ctrl *ctrl;?
??? struct samsung_pin_bank *bank;?
??? int i;

??? id = of_alias_get_id(node, "pinctrl");?
??? match = of_match_node(samsung_pinctrl_dt_match, node);?
??? ctrl = (struct samsung_pin_ctrl *)match->data + id; --------A

??? bank = ctrl->pin_banks;?
??? for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {------------B??
??????? spin_lock_init(&bank->slock);?
??????? bank->drvdata = d;?
??????? bank->pin_base = ctrl->nr_pins; ---ctrl->nr_pins初始的時候等于0,最后完成bank初始化后,

??????????????????????????????????????????????????????????????? 該值等于total的pin number。?
??????? ctrl->nr_pins += bank->nr_pins;?
??? }

for_each_child_of_node(node, np) {? ----------------C?
??????? if (!of_find_property(np, "gpio-controller", NULL))?
??????????? continue;?
??????? bank = ctrl->pin_banks;?
??????? for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {?
??????????? if (!strcmp(bank->name, np->name)) {?
??????????????? bank->of_node = np;?
??????????????? break;?
??????????? }?
??????? }?
??? }?

ctrl->base = pin_base; ----------------------D?
??? pin_base += ctrl->nr_pins;

??? return ctrl;?
}

samsung_pinctrl_get_soc_data這個函數名字基本反應了其功能,2416是samsung的一個具體的SOC型號,調用該函數可以返回一個表示2416 SOC的samsung pin controller的描述符。

A:這段代碼主要是獲取具體的2416的HW pin controller的信息,該數據結構在上文中出現過(具體參考pin controller的device tree match table:samsung_pinctrl_dt_match),就是s3c2416_pin_ctrl這個變量。這個變量定義了2416的pin controller的信息(S3C2416的pin controller的pin bank信息是定義在pin controller driver的靜態數據,其實最好在dts中定義)如下:

struct samsung_pin_ctrl s3c2416_pin_ctrl[] = {?
??? {?
??????? .pin_banks??? = s3c2416_pin_banks,------靜態定義的2416的pin bank的信息?
??????? .nr_banks??? = ARRAY_SIZE(s3c2416_pin_banks),?
??????? .eint_wkup_init = s3c24xx_eint_init,?
??????? .label??????? = "S3C2416-GPIO",?
??? },?
};

這個變量中包含了2416的pin bank的信息,包括:有多少個pin bank,每個bank中有多少個pin,pin bank的名字是什么,寄存器的offset是多少。這些信息用來初始化pin controller描述符數據結構。

B:初始化2416 samsung pin controller中各個bank的描述符。

C:device tree中表示pin controller的device node有若干的child node,分別表示gpa~gpl這11個bank,每個bank都是一個gpio controller。下面的代碼遍歷各個child node,并初始化各個bank描述符中的device tree node成員。 這里需要注意的是靜態定義的pin bank的名字要和dts文件中定義的pin bank node的名字一樣。

D:系統中有可能有多個pin controller,多個pin controller上的pin ID 應該是系統唯一的,ctrl->base表示本pin controller中的pin ID的起始值。

(3)本來pin control subsystem和GPIO subsystem應該是無關的兩個子系統,應該各自進行自己的初始化過程。但實際中,由于硬件的復雜性,這兩個子系統耦合性非常高。這里samsung_gpiolib_register函數就是把各個bank代表的gpio chip注冊到GPIO subsystem中。更具體的信息請參考GPIO subsystem軟件框架文檔。

(4)samsung_pinctrl_register函數的主要功能是將本pin controller注冊到pin control subsystem。代碼如下:

static int samsung_pinctrl_register(struct platform_device *pdev,?
??????????????????? struct samsung_pinctrl_drv_data *drvdata)?
{?
??? struct pinctrl_desc *ctrldesc = &drvdata->pctl;?
??? struct pinctrl_pin_desc *pindesc, *pdesc;?
??? struct samsung_pin_bank *pin_bank;?
??? char *pin_names;?
??? int pin, bank, ret;

??? ctrldesc->name = "samsung-pinctrl";--------A?
??? ctrldesc->owner = THIS_MODULE;?
??? ctrldesc->pctlops = &samsung_pctrl_ops; ---call 函數,具體參考第四章的內容?
??? ctrldesc->pmxops = &samsung_pinmux_ops;?
??? ctrldesc->confops = &samsung_pinconf_ops;

??? pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *-------B?
??????????? drvdata->ctrl->nr_pins, GFP_KERNEL);?
??? ctrldesc->pins = pindesc;?
??? ctrldesc->npins = drvdata->ctrl->nr_pins;??
??? for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)---C?
??????? pdesc->number = pin + drvdata->ctrl->base;


??? pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *---B?
??????????????????? drvdata->ctrl->nr_pins, GFP_KERNEL);


??? for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) { ---------C?
??????? pin_bank = &drvdata->ctrl->pin_banks[bank];?
??????? for (pin = 0; pin < pin_bank->nr_pins; pin++) {?
??????????? sprintf(pin_names, "%s-%d", pin_bank->name, pin);?
??????????? pdesc = pindesc + pin_bank->pin_base + pin;?
??????????? pdesc->name = pin_names;?
??????????? pin_names += PIN_NAME_LENGTH;?
??????? }?
??? }

??? ret = samsung_pinctrl_parse_dt(pdev, drvdata);------D

??? drvdata->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, drvdata);---E

??? for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {-----F?
??????? pin_bank = &drvdata->ctrl->pin_banks[bank];?
??????? pin_bank->grange.name = pin_bank->name;?
??????? pin_bank->grange.id = bank;?
??????? pin_bank->grange.pin_base = pin_bank->pin_base;?
??????? pin_bank->grange.base = pin_bank->gpio_chip.base;?
??????? pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;?
??????? pin_bank->grange.gc = &pin_bank->gpio_chip;?
??????? pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);?
??? }

??? return 0;?
}

A:初始化硬件無關的pin controller描述符(struct samsung_pinctrl_drv_data中的pctl成員)。該數據結構中還包含了所有pin的描述符的信息,這些pin descriptor所需要的內存在步驟B中分配

B:初始化過程中涉及不少內存分配,這些內存主要用于描述每一個pin(術語叫做pin descriptor)以及pin name。

C:初始化每一個pin 描述符的名字和ID。對于samsung的pin描述符,其名字使用pin-bank name + pin ID的形式。 ID的分配是從該pin controller的pin base開始分配ID的,逐個加一。

D:初始化pin group和function(具體內容在下節描述)

E:調用pinctrl_register注冊到pin control subsystem 。這是pin control subsystem的核心函數,可以參考GPIO系統之2的描述。

F:在這里又不得不進行pin control subsystem和GPIO系統的耦合了。每個bank都是一個GPIO controller,但是pin bank使用的ID是pin control space中的ID,GPIO 子系統中使用的是GPIO space的ID,對于pin control subsystem而言,它需要建立這兩個ID的映射關系。pinctrl_add_gpio_range就是起這個作用的。更具體的內容請參考pin control subsystem軟件結構文檔。 需要注意的是直接在pin controller driver中調用pinctrl_add_gpio_range是不推薦的,建議使用dts的方式在GPIO controller設備節點中描述。

(5)這里的代碼是向kernel中的中斷子系統注冊interrupt controller。對于2416,有兩個bank有中斷功能,gpf和gpg,本質上gpf和gpg就是兩個interrupt controller,掛接在2416真正的那個interrupt contrller之下,形成樹狀結構。具體的代碼就不分析了,請參考GPIO類型的中斷控制器代碼分析。

?

4、pin control subsystem如何獲取pin group的信息

具體的代碼如下:

static int samsung_pinctrl_parse_dt(struct platform_device *pdev,?
??????????????????? struct samsung_pinctrl_drv_data *drvdata)?
{?
??? struct device *dev = &pdev->dev;?
??? struct device_node *dev_np = dev->of_node;?
??? struct device_node *cfg_np;?
??? struct samsung_pin_group *groups, *grp;?
??? struct samsung_pmx_func *functions, *func;?
??? unsigned *pin_list;?
??? unsigned int npins, grp_cnt, func_idx = 0;?
??? char *gname, *fname;?
??? int ret;

??? grp_cnt = of_get_child_count(dev_np); ------(1)

??? groups = devm_kzalloc(dev, grp_cnt * sizeof(*groups), GFP_KERNEL); ----(2)?
??? grp = groups;

??? functions = devm_kzalloc(dev, grp_cnt * sizeof(*functions), GFP_KERNEL); ---(2)?
??? func = functions;


??? for_each_child_of_node(dev_np, cfg_np) { ----遍歷pin control的所有的child node?
??????? u32 function;??
????? if (!of_find_property(cfg_np, "samsung,pins", NULL)) -忽略掉那些沒有samsung,pins屬性的node?
??????????? continue;

??????? ret = samsung_pinctrl_parse_dt_pins(pdev, cfg_np, --------(3)?
??????????????????? &drvdata->pctl,??? &pin_list, &npins);?
??????? if (ret)?
??????????? return ret;

??????? /* derive pin group name from the node name */??
? gname = devm_kzalloc(dev, strlen(cfg_np->name) + GSUFFIX_LEN, -分配pin group名字需要的內存
??????????????????? GFP_KERNEL);

??? sprintf(gname, "%s%s", cfg_np->name, GROUP_SUFFIX);--添加“-grp”的后綴

??????? grp->name = gname; ----------------(4)?
??????? grp->pins = pin_list;?
??????? grp->num_pins = npins;?
??????? of_property_read_u32(cfg_np, "samsung,pin-function", &function);?
??????? grp->func = function;?
??????? grp++;

??????? if (!of_find_property(cfg_np, "samsung,pin-function", NULL))??
??????????? continue; ----忽略掉那些沒有samsung,pin-function屬性的node

??????? /* derive function name from the node name */?
??????? fname = devm_kzalloc(dev, strlen(cfg_np->name) + FSUFFIX_LEN,?
??????????????????? GFP_KERNEL);??
??????? sprintf(fname, "%s%s", cfg_np->name, FUNCTION_SUFFIX); -----(5)

??????? func->name = fname;?
??????? func->groups = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL); ----(6)?
??????? if (!func->groups) {?
??????????? dev_err(dev, "failed to alloc memory for group list "?
??????????????????? "in pin function");?
??????????? return -ENOMEM;?
??????? }?
??????? func->groups[0] = gname;?
??????? func->num_groups = 1;?
??????? func++;?
??????? func_idx++;?
??? }

??? drvdata->pin_groups = groups; ----最終,pin group和function的信息被copy到pin controller

??????????????????????????????????????????????????????????? driver的私有數據結構struct samsung_pinctrl_drv_data 中?
??? drvdata->nr_groups = grp_cnt;?
??? drvdata->pmx_functions = functions;?
??? drvdata->nr_functions = func_idx;

??? return 0;?
}

(1)pin controller的device node有若干個child node,每個child node都描述了一個pin configuration。of_get_child_count函數可以獲取pin configuration的數目。

(2)根據pin configuration的數目分配內存。在這里共計分配了兩片內存,一片保存了所有pin group的信息(struct samsung_pin_group ),一片保存了pin mux function的信息(struct samsung_pmx_func)。實際上,分配pin configuration的數目的內存有些浪費,因為不是每一個pin control的child node都是和pin group相關(例如pin bank node就是和pin group無關)。對于function,就更浪費了,因為有可能多個pin group對應一個function。

(3)samsung_pinctrl_parse_dt_pins函數主要分析samsung,pins這個屬性,并根據屬性值返回一個pin list,該list中每個entry是一個pin ID。

(4)初始化samsung pin group的描述符。具體的數據結構解釋如下:

struct samsung_pin_group {?
??? const char??????? *name;---------pin group的名字,名字是device tree node name+-grp?
??? const unsigned int??? *pins;-------pin list的信息?
??? u8??????????? num_pins;----------pin list中的數目?
??? u8??????????? func;------------對應samsung,pin-function屬性的值,用來配置pin list中各個pin的功能設定寄存器?
};

(5)一個pin configuration的device tree node被解析成兩個描述符,一個是samsung pin group的描述符,另外一個是samsung pin mux function描述符。這兩個描述符的名字都是根據dts file中的pin configuration的device node name生成,只不過pin group的名字附加-grp的后綴,而function描述符的名字后面附加-mux的后綴。

(6)對于samsung pin mux function描述符解釋如下:

struct samsung_pmx_func {?
??? const char??????? *name;------pin function的名字,名字是device tree node name+-mux

??? const char??????? **groups;-----指向pin groups的指針數組?
??? u8??????????? num_groups;------屬于該function的pin group的個數?
};

在具體的代碼實現中num_groups總是等于1。

?

四、S3C2416 pin controller driver的操作函數

1、操作函數概述

pin controller描述符中包括了三類操作函數:pctlops是一些全局的控制函數,pmxops是復用引腳相關的操作函數,confops操作函數是用來配置引腳的特性(例如:pull-up/down)。這些callback函數都是和具體的底層pin controller的操作相關。

本章節主要描述這些call back函數的邏輯,這些callback的調用時機不會在這里描述,那些內容請參考pin control subsystem的描述。

2、struct pinctrl_ops中各個callback函數的具體的解釋如下:

(1)samsung_get_group_count

該函數的代碼如下:

static int samsung_get_group_count(struct pinctrl_dev *pctldev)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? return drvdata->nr_groups;?
}

該函數主要是用來獲取指定pin control device的pin group的數目。邏輯很簡單,通過pin control的class device的driver_data成員可以獲得samsung pin control driver的私有數據(struct samsung_pinctrl_drv_data),可以nr_groups成員返回group的數目。

(2)samsung_get_group_name

該函數的代碼如下:

static const char *samsung_get_group_name(struct pinctrl_dev *pctldev,?
??????????????????????? unsigned selector)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? return drvdata->pin_groups[selector].name;?
}

該函數主要用來獲取指定group selector的pin group信息。

(3)samsung_get_group_pins

該函數的代碼如下:

static int samsung_get_group_pins(struct pinctrl_dev *pctldev,?
??????? unsigned selector, const unsigned **pins, unsigned *num_pins)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? *pins = drvdata->pin_groups[selector].pins;?
??? *num_pins = drvdata->pin_groups[selector].num_pins;?
??? return 0;?
}

該函數的主要功能是給定一個group selector(index),獲取該pin group中pin的信息(該pin group包括多少個pin,每個pin的ID是什么) 。

(4)samsung_dt_node_to_map

該函數的代碼如下:

static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev,?
??????????? struct device_node *np, struct pinctrl_map **maps,?
??????????? unsigned *nmaps)?
{?
??? struct device *dev = pctldev->dev;?
??? struct pinctrl_map *map;?
??? unsigned long *cfg = NULL;?
??? char *gname, *fname;?
??? int cfg_cnt = 0, map_cnt = 0, idx = 0;

??? /* count the number of config options specfied in the node */?
??? for (idx = 0; idx < ARRAY_SIZE(pcfgs); idx++) {?
??????? if (of_find_property(np, pcfgs[idx].prop_cfg, NULL))?
??????????? cfg_cnt++;?
??? }

??? /*?
???? * Find out the number of map entries to create. All the config options?
???? * can be accomadated into a single config map entry.?
???? */?
??? if (cfg_cnt)?
??????? map_cnt = 1;?
??? if (of_find_property(np, "samsung,pin-function", NULL))?
??????? map_cnt++;?
??? if (!map_cnt) {?
??????? dev_err(dev, "node %s does not have either config or function "?
??????????????? "configurations\n", np->name);?
??????? return -EINVAL;?
??? }

??? /* Allocate memory for pin-map entries */?
??? map = kzalloc(sizeof(*map) * map_cnt, GFP_KERNEL);?
??? if (!map) {?
??????? dev_err(dev, "could not alloc memory for pin-maps\n");?
??????? return -ENOMEM;?
??? }?
??? *nmaps = 0;

??? /*?
???? * Allocate memory for pin group name. The pin group name is derived?
???? * from the node name from which these map entries are be created.?
???? */?
??? gname = kzalloc(strlen(np->name) + GSUFFIX_LEN, GFP_KERNEL);?
??? if (!gname) {?
??????? dev_err(dev, "failed to alloc memory for group name\n");?
??????? goto free_map;?
??? }?
??? sprintf(gname, "%s%s", np->name, GROUP_SUFFIX);

??? /*?
???? * don't have config options? then skip over to creating function?
???? * map entries.?
???? */?
??? if (!cfg_cnt)?
??????? goto skip_cfgs;

??? /* Allocate memory for config entries */?
??? cfg = kzalloc(sizeof(*cfg) * cfg_cnt, GFP_KERNEL);?
??? if (!cfg) {?
??????? dev_err(dev, "failed to alloc memory for configs\n");?
??????? goto free_gname;?
??? }

??? /* Prepare a list of config settings */?
??? for (idx = 0, cfg_cnt = 0; idx < ARRAY_SIZE(pcfgs); idx++) {?
??????? u32 value;?
??????? if (!of_property_read_u32(np, pcfgs[idx].prop_cfg, &value))?
??????????? cfg[cfg_cnt++] =?
??????????????? PINCFG_PACK(pcfgs[idx].cfg_type, value);?
??? }

??? /* create the config map entry */?
??? map[*nmaps].data.configs.group_or_pin = gname;?
??? map[*nmaps].data.configs.configs = cfg;?
??? map[*nmaps].data.configs.num_configs = cfg_cnt;?
??? map[*nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;?
??? *nmaps += 1;

skip_cfgs:?
??? /* create the function map entry */?
??? if (of_find_property(np, "samsung,pin-function", NULL)) {?
??????? fname = kzalloc(strlen(np->name) + FSUFFIX_LEN,??? GFP_KERNEL);?
??????? if (!fname) {?
??????????? dev_err(dev, "failed to alloc memory for func name\n");?
??????????? goto free_cfg;?
??????? }?
??????? sprintf(fname, "%s%s", np->name, FUNCTION_SUFFIX);

??????? map[*nmaps].data.mux.group = gname;?
??????? map[*nmaps].data.mux.function = fname;?
??????? map[*nmaps].type = PIN_MAP_TYPE_MUX_GROUP;?
??????? *nmaps += 1;?
??? }

??? *maps = map;?
??? return 0;

free_cfg:?
??? kfree(cfg);?
free_gname:?
??? kfree(gname);?
free_map:?
??? kfree(map);?
??? return -ENOMEM;?
}

具體分析TODO

(5)samsung_dt_free_map

該函數的代碼如下:

static void samsung_dt_free_map(struct pinctrl_dev *pctldev,?
???????????????? struct pinctrl_map *map, unsigned num_maps)?
{?
??? int idx;

??? for (idx = 0; idx < num_maps; idx++) {?
??????? if (map[idx].type == PIN_MAP_TYPE_MUX_GROUP) {?
??????????? kfree(map[idx].data.mux.function);?
??????????? if (!idx)?
??????????????? kfree(map[idx].data.mux.group);?
??????? } else if (map->type == PIN_MAP_TYPE_CONFIGS_GROUP) {?
??????????? kfree(map[idx].data.configs.configs);?
??????????? if (!idx)?
??????????????? kfree(map[idx].data.configs.group_or_pin);?
??????? }?
??? };

??? kfree(map);?
}

具體分析TODO

3、復用引腳相關的操作函數struct pinmux_ops的具體解釋如下:

(1)samsung_get_functions_count

該函數的代碼如下:

static int samsung_get_functions_count(struct pinctrl_dev *pctldev)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? return drvdata->nr_functions;?
}

該函數的主要功能是就是返回pin controller device支持的function的數目


(2)samsung_pinmux_get_fname

該函數的代碼如下:

static const char *samsung_pinmux_get_fname(struct pinctrl_dev *pctldev,?
??????????????????????? unsigned selector)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? return drvdata->pmx_functions[selector].name;?
}

該函數的主要功能是就是:給定一個function selector(index),獲取指定function的name??
??
(3)samsung_pinmux_get_groups

該函數的代碼如下:

static int samsung_pinmux_get_groups(struct pinctrl_dev *pctldev,?
??????? unsigned selector, const char * const **groups,?
??????? unsigned * const num_groups)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? *groups = drvdata->pmx_functions[selector].groups;?
??? *num_groups = drvdata->pmx_functions[selector].num_groups;?
??? return 0;?
}

該函數的主要功能是就是:給定一個function selector(index),獲取指定function的pin groups信息?
??
(4)samsung_pinmux_enable和samsung_pinmux_disable

這個兩個callback函數都是通過samsung_pinmux_setup實現,該函數的代碼如下:

static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,?
??????????????????? unsigned group, bool enable)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;?
??? const unsigned int *pins;?
??? struct samsung_pin_bank *bank;?
??? void __iomem *reg;?
??? u32 mask, shift, data, pin_offset, cnt;?
??? unsigned long flags;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? pins = drvdata->pin_groups[group].pins;

??? /*?
???? * for each pin in the pin group selected, program the correspoding pin?
???? * pin function number in the config register.?
???? */?
??? for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++) {?
??????? struct samsung_pin_bank_type *type;

??????? pin_to_reg_bank(drvdata, pins[cnt] - drvdata->ctrl->base,?
??????????????? ?, &pin_offset, &bank);?
??????? type = bank->type;?
??????? mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;?
??????? shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];?
??????? if (shift >= 32) {?
??????????? /* Some banks have two config registers */?
??????????? shift -= 32;?
??????????? reg += 4;?
??????? }

??????? spin_lock_irqsave(&bank->slock, flags);

??????? data = readl(reg + type->reg_offset[PINCFG_TYPE_FUNC]);?
??????? data &= ~(mask << shift);?
??????? if (enable)?
??????????? data |= drvdata->pin_groups[group].func << shift;?
??????? writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]);

??????? spin_unlock_irqrestore(&bank->slock, flags);?
??? }?
}

該函數主要用來enable一個指定function。具體指定function的時候要給出function selector和pin group的selector 。具體的操作涉及很多底層的寄存器操作(TODO)。?
??
??
(5)samsung_pinmux_gpio_set_direction

該函數的代碼如下:

static int samsung_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,?
??????? struct pinctrl_gpio_range *range, unsigned offset, bool input)?
{?
??? struct samsung_pin_bank_type *type;?
??? struct samsung_pin_bank *bank;?
??? struct samsung_pinctrl_drv_data *drvdata;?
??? void __iomem *reg;?
??? u32 data, pin_offset, mask, shift;?
??? unsigned long flags;

??? bank = gc_to_pin_bank(range->gc);?
??? type = bank->type;?
??? drvdata = pinctrl_dev_get_drvdata(pctldev);

??? pin_offset = offset - bank->pin_base;?
??? reg = drvdata->virt_base + bank->pctl_offset +?
??????????????????? type->reg_offset[PINCFG_TYPE_FUNC];

??? mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;?
??? shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];?
??? if (shift >= 32) {?
??????? /* Some banks have two config registers */?
??????? shift -= 32;?
??????? reg += 4;?
??? }

??? spin_lock_irqsave(&bank->slock, flags);

??? data = readl(reg);?
??? data &= ~(mask << shift);?
??? if (!input)?
??????? data |= FUNC_OUTPUT << shift;?
??? writel(data, reg);

??? spin_unlock_irqrestore(&bank->slock, flags);

??? return 0;?
}

該函數用來設定GPIO的方向。?
?

4、配置引腳的特性的struct pinconf_ops數據結構的各個成員定義如下:

(1)samsung_pinconf_get?
(2)samsung_pinconf_set?
(3)samsung_pinconf_group_get?
(4)samsung_pinconf_group_set

(1)和(2)是對單個pin的配置進行讀取或者設定,(3)和(4)是對pin group中的所有pin進行配置進行讀取或者設定。這些函數的底層都是samsung_pinconf_rw,該函數代碼如下:

static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,?
??????????????? unsigned long *config, bool set)?
{?
??? struct samsung_pinctrl_drv_data *drvdata;?
??? struct samsung_pin_bank_type *type;?
??? struct samsung_pin_bank *bank;?
??? void __iomem *reg_base;?
??? enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);?
??? u32 data, width, pin_offset, mask, shift;?
??? u32 cfg_value, cfg_reg;?
??? unsigned long flags;

??? drvdata = pinctrl_dev_get_drvdata(pctldev);?
??? pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, ?_base,?
??????????????????? &pin_offset, &bank);?
??? type = bank->type;

??? if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type])?
??????? return -EINVAL;

??? width = type->fld_width[cfg_type];?
??? cfg_reg = type->reg_offset[cfg_type];

??? spin_lock_irqsave(&bank->slock, flags);

??? mask = (1 << width) - 1;?
??? shift = pin_offset * width;?
??? data = readl(reg_base + cfg_reg);

??? if (set) {?
??????? cfg_value = PINCFG_UNPACK_VALUE(*config);?
??????? data &= ~(mask << shift);?
??????? data |= (cfg_value << shift);?
??????? writel(data, reg_base + cfg_reg);?
??? } else {?
??????? data >>= shift;?
??????? data &= mask;?
??????? *config = PINCFG_PACK(cfg_type, data);?
??? }

??? spin_unlock_irqrestore(&bank->slock, flags);

??? return 0;?
}

具體分析TODO

?

原創文章,轉發請注明出處。蝸窩科技。http://www.wowotech.net/linux_kenrel/pin-controller-driver.html

總結

以上是生活随笔為你收集整理的Linux内核中的GPIO系统之(3):pin controller driver代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久天天躁狠狠躁夜夜免费观看 | 欧美 丝袜 自拍 制服 另类 | 久久久久成人片免费观看蜜芽 | 色欲人妻aaaaaaa无码 | 日本欧美一区二区三区乱码 | 久久国产36精品色熟妇 | 亚洲国产精品一区二区第一页 | 国产午夜福利亚洲第一 | 欧美老人巨大xxxx做受 | 国产午夜手机精彩视频 | 中文字幕+乱码+中文字幕一区 | 日产精品99久久久久久 | 国产免费久久精品国产传媒 | 国产亚洲tv在线观看 | 天天做天天爱天天爽综合网 | 亚洲人成影院在线无码按摩店 | 日日天干夜夜狠狠爱 | 久久99精品久久久久婷婷 | 亚洲日本va中文字幕 | 色老头在线一区二区三区 | 强奷人妻日本中文字幕 | 又色又爽又黄的美女裸体网站 | 国产明星裸体无码xxxx视频 | 欧美性生交xxxxx久久久 | 国产免费观看黄av片 | 青春草在线视频免费观看 | 蜜桃视频韩日免费播放 | 精品人妻中文字幕有码在线 | 夜夜夜高潮夜夜爽夜夜爰爰 | 一本久道久久综合婷婷五月 | 亚洲国产综合无码一区 | 国产成人人人97超碰超爽8 | 欧美日韩人成综合在线播放 | 国产性生交xxxxx无码 | 2019午夜福利不卡片在线 | 久久精品人妻少妇一区二区三区 | 国产美女极度色诱视频www | 国产成人av免费观看 | 午夜熟女插插xx免费视频 | 高清无码午夜福利视频 | 无码人妻精品一区二区三区下载 | 欧美性色19p | 日本xxxx色视频在线观看免费 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美日韩一区二区综合 | 男女下面进入的视频免费午夜 | 人人澡人人透人人爽 | 亚洲无人区午夜福利码高清完整版 | 高潮毛片无遮挡高清免费视频 | 色综合久久久久综合一本到桃花网 | 无套内射视频囯产 | 亚洲人成人无码网www国产 | 澳门永久av免费网站 | 捆绑白丝粉色jk震动捧喷白浆 | 久久午夜无码鲁丝片 | 久久国产自偷自偷免费一区调 | 九月婷婷人人澡人人添人人爽 | 成人无码精品一区二区三区 | 久久久www成人免费毛片 | 中文字幕无码日韩专区 | 亚洲区欧美区综合区自拍区 | 国产精品理论片在线观看 | 少妇人妻偷人精品无码视频 | 亚洲热妇无码av在线播放 | 亚洲综合精品香蕉久久网 | 2020久久香蕉国产线看观看 | 狠狠亚洲超碰狼人久久 | 兔费看少妇性l交大片免费 | 天天做天天爱天天爽综合网 | 日本乱人伦片中文三区 | √8天堂资源地址中文在线 | 久久国产自偷自偷免费一区调 | 欧洲熟妇色 欧美 | 国产精品成人av在线观看 | 樱花草在线社区www | 51国偷自产一区二区三区 | 扒开双腿疯狂进出爽爽爽视频 | 欧美精品在线观看 | 久久久久人妻一区精品色欧美 | 人妻少妇被猛烈进入中文字幕 | 99riav国产精品视频 | 成人精品天堂一区二区三区 | 亚洲人成网站在线播放942 | 性欧美熟妇videofreesex | а√资源新版在线天堂 | 精品国偷自产在线视频 | 精品人妻人人做人人爽夜夜爽 | 国产又爽又猛又粗的视频a片 | 日本乱偷人妻中文字幕 | 亚洲国产精品毛片av不卡在线 | 大乳丰满人妻中文字幕日本 | 国产精品久久久久久亚洲影视内衣 | 欧美日本精品一区二区三区 | 欧美精品在线观看 | 亚洲乱码日产精品bd | 巨爆乳无码视频在线观看 | 亚洲码国产精品高潮在线 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久精品中文闷骚内射 | 成人性做爰aaa片免费看 | 精品人妻人人做人人爽 | 久久久久久久女国产乱让韩 | 人人妻人人藻人人爽欧美一区 | 高潮毛片无遮挡高清免费 | 亚洲人成无码网www | 亚洲色www成人永久网址 | 精品一区二区不卡无码av | 日本va欧美va欧美va精品 | 国产精品久久久久久亚洲影视内衣 | 女人被爽到呻吟gif动态图视看 | 丰满人妻被黑人猛烈进入 | 六月丁香婷婷色狠狠久久 | aⅴ亚洲 日韩 色 图网站 播放 | 免费观看又污又黄的网站 | 人妻夜夜爽天天爽三区 | 狠狠色噜噜狠狠狠7777奇米 | 国产午夜福利亚洲第一 | 国产精品亚洲а∨无码播放麻豆 | 无码吃奶揉捏奶头高潮视频 | 国产福利视频一区二区 | 欧美老熟妇乱xxxxx | 99精品无人区乱码1区2区3区 | 亚洲午夜福利在线观看 | 波多野结衣高清一区二区三区 | 国产真实乱对白精彩久久 | 亚洲人成影院在线观看 | 黑人巨大精品欧美一区二区 | 东京一本一道一二三区 | 又大又硬又爽免费视频 | 国产卡一卡二卡三 | 2020久久超碰国产精品最新 | 骚片av蜜桃精品一区 | 国产超级va在线观看视频 | 国产精品久久久久影院嫩草 | 无码帝国www无码专区色综合 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 免费人成在线观看网站 | 日本精品久久久久中文字幕 | 亚洲精品久久久久久久久久久 | 精品国产av色一区二区深夜久久 | 亚洲国产精品成人久久蜜臀 | 清纯唯美经典一区二区 | 狂野欧美性猛xxxx乱大交 | 成人精品视频一区二区三区尤物 | 精品乱码久久久久久久 | 久久无码中文字幕免费影院蜜桃 | 成熟人妻av无码专区 | 国产激情精品一区二区三区 | 国产内射老熟女aaaa | 精品国产青草久久久久福利 | 天堂а√在线中文在线 | 在线观看国产午夜福利片 | 丝袜美腿亚洲一区二区 | 少妇久久久久久人妻无码 | 久久久国产一区二区三区 | 男女作爱免费网站 | 国产成人综合美国十次 | 天天摸天天碰天天添 | 国产一区二区三区精品视频 | 欧美成人午夜精品久久久 | 76少妇精品导航 | 内射白嫩少妇超碰 | 欧美日韩亚洲国产精品 | 亚洲精品国产精品乱码视色 | 国产精品无码一区二区桃花视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久人人爽人人爽人人片ⅴ | 亚洲人交乣女bbw | 日本护士xxxxhd少妇 | 2020久久香蕉国产线看观看 | 欧美人与物videos另类 | 日本高清一区免费中文视频 | 中文字幕无码乱人伦 | 欧美老人巨大xxxx做受 | 亚洲s码欧洲m码国产av | 精品国产乱码久久久久乱码 | 日韩欧美群交p片內射中文 | 亚洲a无码综合a国产av中文 | 亚洲娇小与黑人巨大交 | 日产精品高潮呻吟av久久 | 亚洲精品成人av在线 | 少妇无码一区二区二三区 | 激情内射日本一区二区三区 | 久久精品女人天堂av免费观看 | 精品亚洲成av人在线观看 | 亚洲欧美综合区丁香五月小说 | 国产人妻精品一区二区三区不卡 | 18禁止看的免费污网站 | 亚洲码国产精品高潮在线 | 99精品久久毛片a片 | 99久久久无码国产aaa精品 | 曰本女人与公拘交酡免费视频 | 精品国产一区二区三区四区在线看 | 欧美 丝袜 自拍 制服 另类 | 中文字幕+乱码+中文字幕一区 | 欧美日韩一区二区综合 | 2020久久香蕉国产线看观看 | 国产在线精品一区二区三区直播 | 伊人久久大香线焦av综合影院 | 国产特级毛片aaaaaaa高清 | 日韩欧美中文字幕在线三区 | 日本熟妇浓毛 | 欧美日韩一区二区综合 | 青青久在线视频免费观看 | 国产精品丝袜黑色高跟鞋 | 亚洲国产精品毛片av不卡在线 | 美女张开腿让人桶 | 精品国产一区二区三区四区 | 久久久久人妻一区精品色欧美 | 四虎永久在线精品免费网址 | 在线亚洲高清揄拍自拍一品区 | 无码免费一区二区三区 | 99久久99久久免费精品蜜桃 | 人妻无码αv中文字幕久久琪琪布 | 精品国产一区二区三区av 性色 | 久久久久se色偷偷亚洲精品av | 中文字幕+乱码+中文字幕一区 | 国产成人无码午夜视频在线观看 | 亚洲欧洲中文日韩av乱码 | 狂野欧美性猛xxxx乱大交 | 精品乱码久久久久久久 | 精品一二三区久久aaa片 | 秋霞成人午夜鲁丝一区二区三区 | 夜精品a片一区二区三区无码白浆 | 中文字幕久久久久人妻 | 成在人线av无码免观看麻豆 | 天干天干啦夜天干天2017 | 欧美丰满老熟妇xxxxx性 | 性史性农村dvd毛片 | 中文字幕无码免费久久99 | 中文字幕无码免费久久99 | 人妻中文无码久热丝袜 | 欧美35页视频在线观看 | 国产成人一区二区三区别 | 两性色午夜视频免费播放 | 无码人中文字幕 | 亚洲欧美综合区丁香五月小说 | 影音先锋中文字幕无码 | 成人无码影片精品久久久 | 在线观看欧美一区二区三区 | 久激情内射婷内射蜜桃人妖 | 蜜桃av抽搐高潮一区二区 | 少妇的肉体aa片免费 | 无码国产乱人伦偷精品视频 | 欧美国产日韩亚洲中文 | 性色欲情网站iwww九文堂 | 欧美老妇交乱视频在线观看 | 国产亚洲精品久久久ai换 | 精品国产国产综合精品 | 久久久久国色av免费观看性色 | 亚洲热妇无码av在线播放 | 蜜臀aⅴ国产精品久久久国产老师 | 久久人人97超碰a片精品 | 色情久久久av熟女人妻网站 | 中文亚洲成a人片在线观看 | 妺妺窝人体色www在线小说 | 人人澡人人妻人人爽人人蜜桃 | 久热国产vs视频在线观看 | 色综合久久88色综合天天 | 中国女人内谢69xxxx | 午夜肉伦伦影院 | 高潮喷水的毛片 | 亚洲精品一区二区三区大桥未久 | 国产亚洲人成a在线v网站 | 小泽玛莉亚一区二区视频在线 | 图片区 小说区 区 亚洲五月 | 日本熟妇乱子伦xxxx | 国产精品无码一区二区三区不卡 | 久久99精品久久久久久动态图 | 日本一卡2卡3卡四卡精品网站 | 精品久久久久久人妻无码中文字幕 | 在线播放无码字幕亚洲 | 精品国偷自产在线 | 亚洲成色在线综合网站 | 久久久久国色av免费观看性色 | 成人欧美一区二区三区黑人免费 | 久久精品女人的天堂av | 高清国产亚洲精品自在久久 | 久久精品国产99精品亚洲 | 麻豆蜜桃av蜜臀av色欲av | 国产黑色丝袜在线播放 | 免费看男女做好爽好硬视频 | 亚洲理论电影在线观看 | 国产精品.xx视频.xxtv | 日韩人妻系列无码专区 | 日本又色又爽又黄的a片18禁 | 国产麻豆精品精东影业av网站 | 亚洲成av人片天堂网无码】 | 国产婷婷色一区二区三区在线 | 免费无码的av片在线观看 | 国产无遮挡又黄又爽免费视频 | 久久精品国产一区二区三区 | 精品偷自拍另类在线观看 | 老子影院午夜伦不卡 | 曰本女人与公拘交酡免费视频 | 欧美老熟妇乱xxxxx | 中文字幕乱码人妻二区三区 | 精品无人国产偷自产在线 | 日韩精品成人一区二区三区 | 亚洲精品成a人在线观看 | 久久久久久亚洲精品a片成人 | 又湿又紧又大又爽a视频国产 | 久久亚洲日韩精品一区二区三区 | 中文字幕无码av波多野吉衣 | 一个人免费观看的www视频 | 久久国产精品_国产精品 | 国产精品亚洲五月天高清 | 日日躁夜夜躁狠狠躁 | 免费无码一区二区三区蜜桃大 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩精品久久久肉伦网站 | 精品亚洲成av人在线观看 | 丰满妇女强制高潮18xxxx | 又黄又爽又色的视频 | 亚洲熟妇色xxxxx欧美老妇y | 精品乱码久久久久久久 | 67194成是人免费无码 | 一本加勒比波多野结衣 | 国模大胆一区二区三区 | 精品国偷自产在线视频 | 四虎国产精品免费久久 | 国产麻豆精品一区二区三区v视界 | 在线播放无码字幕亚洲 | 亚洲自偷精品视频自拍 | 日本精品人妻无码免费大全 | 欧美性生交xxxxx久久久 | 国产色视频一区二区三区 | 国产精品久久久久无码av色戒 | 爆乳一区二区三区无码 | 又粗又大又硬毛片免费看 | 无码国产乱人伦偷精品视频 | 丰满诱人的人妻3 | 色婷婷综合中文久久一本 | 5858s亚洲色大成网站www | 国产美女精品一区二区三区 | 蜜桃视频韩日免费播放 | 人妻体内射精一区二区三四 | 日韩无套无码精品 | 一二三四在线观看免费视频 | 少女韩国电视剧在线观看完整 | 无码国模国产在线观看 | 国产午夜无码精品免费看 | 亚洲自偷自拍另类第1页 | 日本精品人妻无码77777 天堂一区人妻无码 | 精品无人国产偷自产在线 | 特黄特色大片免费播放器图片 | 鲁大师影院在线观看 | 久久99国产综合精品 | aⅴ亚洲 日韩 色 图网站 播放 | 少妇人妻偷人精品无码视频 | 亚洲乱亚洲乱妇50p | 久久久国产精品无码免费专区 | 久久久久久国产精品无码下载 | 亚洲国产精品一区二区第一页 | 久久亚洲精品成人无码 | 亚洲日韩av一区二区三区中文 | 国产网红无码精品视频 | 帮老师解开蕾丝奶罩吸乳网站 | 国产美女精品一区二区三区 | 精品人妻人人做人人爽夜夜爽 | 无码人妻丰满熟妇区五十路百度 | 在线观看国产一区二区三区 | 高潮喷水的毛片 | 久久精品国产一区二区三区 | 又黄又爽又色的视频 | 国产乱人伦偷精品视频 | 国产精品毛多多水多 | 国产乱子伦视频在线播放 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 久久综合香蕉国产蜜臀av | 99久久精品无码一区二区毛片 | 99久久人妻精品免费二区 | 亚洲欧美中文字幕5发布 | 成年美女黄网站色大免费视频 | 少妇邻居内射在线 | 国内老熟妇对白xxxxhd | 九一九色国产 | 久久国产自偷自偷免费一区调 | 国产99久久精品一区二区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产69精品久久久久app下载 | 狠狠色丁香久久婷婷综合五月 | 欧美日韩色另类综合 | 国产莉萝无码av在线播放 | 婷婷五月综合缴情在线视频 | 国产片av国语在线观看 | 亚洲中文字幕无码中字 | 精品偷拍一区二区三区在线看 | 日韩欧美中文字幕公布 | 国产成人无码a区在线观看视频app | 又紧又大又爽精品一区二区 | 高清国产亚洲精品自在久久 | 丝袜人妻一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 国产成人精品久久亚洲高清不卡 | 一本久道高清无码视频 | 无码av免费一区二区三区试看 | 欧美日韩精品 | 久久人人爽人人爽人人片av高清 | 日日碰狠狠丁香久燥 | 亚洲男人av天堂午夜在 | 亚洲gv猛男gv无码男同 | 国产精品无套呻吟在线 | 午夜肉伦伦影院 | 亚洲七七久久桃花影院 | 国产午夜视频在线观看 | 久久国产自偷自偷免费一区调 | 亚洲乱码中文字幕在线 | 久久国产自偷自偷免费一区调 | 97无码免费人妻超级碰碰夜夜 | 强伦人妻一区二区三区视频18 | 人人爽人人爽人人片av亚洲 | 久久精品国产日本波多野结衣 | 日韩精品无码一区二区中文字幕 | 国产精品无码一区二区桃花视频 | 国产真实伦对白全集 | 亚洲狠狠色丁香婷婷综合 | 波多野42部无码喷潮在线 | 久久久久se色偷偷亚洲精品av | 丰满人妻精品国产99aⅴ | 一本无码人妻在中文字幕免费 | 国产精品视频免费播放 | 久久久久免费精品国产 | 亚洲码国产精品高潮在线 | 人人澡人摸人人添 | 中文字幕无码日韩欧毛 | 一本一道久久综合久久 | 性做久久久久久久久 | 少妇人妻av毛片在线看 | 国产亚洲人成在线播放 | 两性色午夜免费视频 | 国产色xx群视频射精 | 精品乱子伦一区二区三区 | 色妞www精品免费视频 | 亚洲区小说区激情区图片区 | 欧美黑人巨大xxxxx | 日本精品少妇一区二区三区 | 国产乱人伦av在线无码 | 日韩视频 中文字幕 视频一区 | 日日躁夜夜躁狠狠躁 | 亚洲一区二区三区偷拍女厕 | 熟妇人妻中文av无码 | 久久久久se色偷偷亚洲精品av | 国产一区二区三区影院 | 国产 浪潮av性色四虎 | 性开放的女人aaa片 | 日韩欧美中文字幕公布 | 久久久精品国产sm最大网站 | 无码精品国产va在线观看dvd | 日韩精品无码一区二区中文字幕 | 欧美一区二区三区 | 国产成人无码av在线影院 | 女人被爽到呻吟gif动态图视看 | 99国产精品白浆在线观看免费 | 国产麻豆精品精东影业av网站 | 又大又黄又粗又爽的免费视频 | 十八禁真人啪啪免费网站 | 亚拍精品一区二区三区探花 | 性色欲网站人妻丰满中文久久不卡 | 亚洲无人区一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 任你躁国产自任一区二区三区 | 国色天香社区在线视频 | 鲁大师影院在线观看 | 国产熟女一区二区三区四区五区 | 成在人线av无码免观看麻豆 | 大肉大捧一进一出视频出来呀 | 国产精品视频免费播放 | 国产香蕉尹人视频在线 | av在线亚洲欧洲日产一区二区 | 好爽又高潮了毛片免费下载 | 东北女人啪啪对白 | 人人澡人人透人人爽 | 国内揄拍国内精品人妻 | 99久久久无码国产精品免费 | 老子影院午夜精品无码 | 色欲久久久天天天综合网精品 | 国产综合久久久久鬼色 | 免费人成在线观看网站 | 精品国产乱码久久久久乱码 | 狠狠噜狠狠狠狠丁香五月 | 麻豆国产97在线 | 欧洲 | 国产性生交xxxxx无码 | 久久精品国产一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 狠狠色欧美亚洲狠狠色www | 国产成人综合在线女婷五月99播放 | 国产卡一卡二卡三 | 亚洲自偷精品视频自拍 | 国产乱人无码伦av在线a | 99国产欧美久久久精品 | 国产精品亚洲专区无码不卡 | 久久久久久九九精品久 | 嫩b人妻精品一区二区三区 | 久久国产精品二国产精品 | 久久精品女人天堂av免费观看 | 一个人看的视频www在线 | 久久无码专区国产精品s | 国产在热线精品视频 | 色综合久久中文娱乐网 | 国产精品美女久久久久av爽李琼 | 老头边吃奶边弄进去呻吟 | 精品乱码久久久久久久 | 亚洲成av人片在线观看无码不卡 | 亚洲成av人片天堂网无码】 | 人人澡人人妻人人爽人人蜜桃 | 久久久久亚洲精品中文字幕 | 国产精品.xx视频.xxtv | 国产精品久久久久无码av色戒 | 免费观看黄网站 | 我要看www免费看插插视频 | 国产精品成人av在线观看 | 精品无码国产自产拍在线观看蜜 | 欧美国产日韩亚洲中文 | 亚洲日韩一区二区三区 | 国产激情综合五月久久 | 亚洲小说春色综合另类 | 正在播放老肥熟妇露脸 | 色 综合 欧美 亚洲 国产 | 久久综合给久久狠狠97色 | 国产区女主播在线观看 | 亚欧洲精品在线视频免费观看 | 国产成人无码av一区二区 | 亚洲欧美日韩国产精品一区二区 | 亚洲精品国产精品乱码视色 | 无码人妻精品一区二区三区不卡 | 国产精品无套呻吟在线 | 少妇被黑人到高潮喷出白浆 | 国产免费无码一区二区视频 | 2020久久超碰国产精品最新 | 欧美人与动性行为视频 | 国产两女互慰高潮视频在线观看 | 免费看少妇作爱视频 | 久久熟妇人妻午夜寂寞影院 | 性史性农村dvd毛片 | 内射爽无广熟女亚洲 | 国产女主播喷水视频在线观看 | 成人性做爰aaa片免费看不忠 | 强辱丰满人妻hd中文字幕 | 国内丰满熟女出轨videos | 99久久亚洲精品无码毛片 | 亚洲国产精品久久久久久 | 无遮无挡爽爽免费视频 | 18禁止看的免费污网站 | 亚洲一区二区三区无码久久 | 亚洲精品国产精品乱码不卡 | 日韩av无码中文无码电影 | 18禁止看的免费污网站 | 俄罗斯老熟妇色xxxx | 日日碰狠狠丁香久燥 | 十八禁视频网站在线观看 | 亚洲精品久久久久久一区二区 | 精品国偷自产在线视频 | 伊人久久大香线蕉av一区二区 | 在线 国产 欧美 亚洲 天堂 | 日韩无套无码精品 | 国产三级久久久精品麻豆三级 | √天堂资源地址中文在线 | 成人精品天堂一区二区三区 | 大胆欧美熟妇xx | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 日产国产精品亚洲系列 | 久久99热只有频精品8 | 国产精品无码一区二区三区不卡 | 欧美一区二区三区 | 国产精品永久免费视频 | 少妇邻居内射在线 | 国产热a欧美热a在线视频 | 欧美亚洲日韩国产人成在线播放 | 欧美激情综合亚洲一二区 | 人人妻人人澡人人爽欧美精品 | 婷婷丁香六月激情综合啪 | 国产精品欧美成人 | 亚洲成a人片在线观看无码3d | 永久免费观看美女裸体的网站 | 国产一区二区三区精品视频 | 国产成人无码一二三区视频 | 欧美日韩视频无码一区二区三 | 一本色道婷婷久久欧美 | 色欲av亚洲一区无码少妇 | 亚洲人成无码网www | 亚洲色欲色欲天天天www | 国产亚洲欧美在线专区 | 99久久久国产精品无码免费 | 国产精品-区区久久久狼 | 国产精品美女久久久久av爽李琼 | 久久五月精品中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | 麻豆果冻传媒2021精品传媒一区下载 | 久久久久久a亚洲欧洲av冫 | 国产精品美女久久久 | √8天堂资源地址中文在线 | 中文字幕人妻无码一区二区三区 | 欧美精品免费观看二区 | 无码人妻精品一区二区三区不卡 | 亚洲男人av香蕉爽爽爽爽 | 婷婷六月久久综合丁香 | 久久国产精品精品国产色婷婷 | 亚洲欧美中文字幕5发布 | 无码av最新清无码专区吞精 | 中文字幕无码免费久久99 | 377p欧洲日本亚洲大胆 | 久久久久国色av免费观看性色 | 亚洲高清偷拍一区二区三区 | 宝宝好涨水快流出来免费视频 | 成人精品天堂一区二区三区 | 九九综合va免费看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 色欲人妻aaaaaaa无码 | 在线成人www免费观看视频 | 免费无码肉片在线观看 | 蜜臀av无码人妻精品 | 亚洲精品午夜无码电影网 | 亚洲一区二区三区播放 | 久久国产精品_国产精品 | 免费无码肉片在线观看 | 日日碰狠狠躁久久躁蜜桃 | 中文字幕无码免费久久9一区9 | 蜜桃无码一区二区三区 | 国产亚洲精品久久久久久国模美 | 久久zyz资源站无码中文动漫 | 丁香花在线影院观看在线播放 | 丰满少妇弄高潮了www | 色婷婷香蕉在线一区二区 | 国产69精品久久久久app下载 | 亚洲精品一区二区三区大桥未久 | 久久久久亚洲精品男人的天堂 | 人妻有码中文字幕在线 | 爆乳一区二区三区无码 | a在线亚洲男人的天堂 | 偷窥村妇洗澡毛毛多 | 我要看www免费看插插视频 | 国内精品人妻无码久久久影院蜜桃 | 精品久久综合1区2区3区激情 | 午夜无码人妻av大片色欲 | 男女性色大片免费网站 | 日产国产精品亚洲系列 | 精品久久久中文字幕人妻 | 中文字幕无线码免费人妻 | 久久精品女人的天堂av | 久久婷婷五月综合色国产香蕉 | 中文字幕人成乱码熟女app | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 色诱久久久久综合网ywww | 亚洲精品国产第一综合99久久 | 乱码av麻豆丝袜熟女系列 | 精品久久8x国产免费观看 | 欧美野外疯狂做受xxxx高潮 | 东京无码熟妇人妻av在线网址 | 中文字幕乱妇无码av在线 | 人人爽人人爽人人片av亚洲 | 亚洲色欲久久久综合网东京热 | 欧美精品无码一区二区三区 | 最新国产麻豆aⅴ精品无码 | 国产手机在线αⅴ片无码观看 | 亚洲欧美综合区丁香五月小说 | 免费无码肉片在线观看 | 奇米影视888欧美在线观看 | yw尤物av无码国产在线观看 | 中文字幕av日韩精品一区二区 | 久久无码中文字幕免费影院蜜桃 | 亚洲国产精品无码久久久久高潮 | 啦啦啦www在线观看免费视频 | 国产亚洲人成a在线v网站 | 欧美日韩一区二区综合 | 日本熟妇乱子伦xxxx | 欧美成人家庭影院 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 夜精品a片一区二区三区无码白浆 | 久久99热只有频精品8 | 性欧美牲交在线视频 | 国产精品无码久久av | 色婷婷久久一区二区三区麻豆 | 粉嫩少妇内射浓精videos | 自拍偷自拍亚洲精品10p | 麻豆av传媒蜜桃天美传媒 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 成 人 免费观看网站 | 久久国产36精品色熟妇 | 久久精品一区二区三区四区 | 亚洲乱码国产乱码精品精 | 纯爱无遮挡h肉动漫在线播放 | 99麻豆久久久国产精品免费 | 精品一区二区三区无码免费视频 | 欧美真人作爱免费视频 | 欧美阿v高清资源不卡在线播放 | 国产人妻精品一区二区三区 | 高潮毛片无遮挡高清免费 | 亚洲成av人片在线观看无码不卡 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 一本久道高清无码视频 | 两性色午夜免费视频 | 人妻尝试又大又粗久久 | 高潮毛片无遮挡高清免费 | 免费无码一区二区三区蜜桃大 | 狂野欧美性猛xxxx乱大交 | 丰满人妻翻云覆雨呻吟视频 | 亚洲国产av精品一区二区蜜芽 | 亚洲国产精品成人久久蜜臀 | 成人性做爰aaa片免费看 | 久久国产36精品色熟妇 | 老太婆性杂交欧美肥老太 | 在线а√天堂中文官网 | 自拍偷自拍亚洲精品被多人伦好爽 | 免费中文字幕日韩欧美 | 九九在线中文字幕无码 | 国产99久久精品一区二区 | 欧美freesex黑人又粗又大 | 国产在热线精品视频 | 亚洲色www成人永久网址 | 又大又硬又爽免费视频 | 性欧美疯狂xxxxbbbb | 国内精品九九久久久精品 | 日韩人妻无码一区二区三区久久99 | 亚洲 激情 小说 另类 欧美 | 国产成人综合美国十次 | 一本久道高清无码视频 | 国产一区二区三区精品视频 | 亚洲爆乳大丰满无码专区 | 丰满肥臀大屁股熟妇激情视频 | a片在线免费观看 | 成人亚洲精品久久久久 | 亚洲熟妇自偷自拍另类 | 少妇被粗大的猛进出69影院 | 国产热a欧美热a在线视频 | 国产人妻精品午夜福利免费 | 国内揄拍国内精品少妇国语 | 欧美老熟妇乱xxxxx | 欧洲熟妇色 欧美 | 国产一区二区三区精品视频 | 999久久久国产精品消防器材 | 亚洲综合无码一区二区三区 | 欧美放荡的少妇 | 精品久久久中文字幕人妻 | 国产疯狂伦交大片 | 亚洲男女内射在线播放 | 领导边摸边吃奶边做爽在线观看 | 久久人人爽人人爽人人片ⅴ | 88国产精品欧美一区二区三区 | 日日躁夜夜躁狠狠躁 | 国产猛烈高潮尖叫视频免费 | 激情综合激情五月俺也去 | 国产xxx69麻豆国语对白 | 最近中文2019字幕第二页 | 国语精品一区二区三区 | 国产欧美熟妇另类久久久 | 亚洲日本一区二区三区在线 | 欧洲欧美人成视频在线 | 国产午夜无码视频在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产成人午夜福利在线播放 | 日日碰狠狠躁久久躁蜜桃 | 爽爽影院免费观看 | 天天拍夜夜添久久精品 | 亚洲大尺度无码无码专区 | 日日天干夜夜狠狠爱 | 久久97精品久久久久久久不卡 | 亚洲性无码av中文字幕 | 国产午夜精品一区二区三区嫩草 | 国产精华av午夜在线观看 | 久久精品成人欧美大片 | 欧美丰满老熟妇xxxxx性 | 久久久久se色偷偷亚洲精品av | 偷窥日本少妇撒尿chinese | 在线а√天堂中文官网 | 国产成人无码av一区二区 | 一本久久a久久精品亚洲 | 亚洲区欧美区综合区自拍区 | 欧美 丝袜 自拍 制服 另类 | 高潮毛片无遮挡高清免费视频 | 久久久久久久久蜜桃 | 国产成人综合色在线观看网站 | 国产精品理论片在线观看 | 久久久久se色偷偷亚洲精品av | 久久久精品456亚洲影院 | 又粗又大又硬毛片免费看 | 撕开奶罩揉吮奶头视频 | 欧美35页视频在线观看 | 亚洲综合无码久久精品综合 | 中文字幕精品av一区二区五区 | 爆乳一区二区三区无码 | 无遮挡国产高潮视频免费观看 | 亚洲精品中文字幕 | 国产成人精品必看 | 天堂亚洲2017在线观看 | 免费观看激色视频网站 | 天天av天天av天天透 | 动漫av网站免费观看 | 黄网在线观看免费网站 | 国产亚av手机在线观看 | 一本久久a久久精品vr综合 | 亚洲狠狠婷婷综合久久 | 国产亚洲精品久久久ai换 | 中国女人内谢69xxxxxa片 | 思思久久99热只有频精品66 | 在线精品国产一区二区三区 | 国精产品一区二区三区 | 黑人玩弄人妻中文在线 | 亚洲精品午夜国产va久久成人 | 国产精品人人妻人人爽 | 国内少妇偷人精品视频免费 | 国产猛烈高潮尖叫视频免费 | 久久99久久99精品中文字幕 | 久久精品女人天堂av免费观看 | 亚洲成av人在线观看网址 | 亚洲综合无码久久精品综合 | 成人精品视频一区二区三区尤物 | 国产肉丝袜在线观看 | 久久久av男人的天堂 | 色婷婷综合中文久久一本 | 麻豆av传媒蜜桃天美传媒 | 国产精品99爱免费视频 | 男女下面进入的视频免费午夜 | 国产精品二区一区二区aⅴ污介绍 | 欧美人与动性行为视频 | 成人精品一区二区三区中文字幕 | 国产成人无码av在线影院 | 国产亲子乱弄免费视频 | 强伦人妻一区二区三区视频18 | 欧美人与禽zoz0性伦交 | 纯爱无遮挡h肉动漫在线播放 | 亚洲色www成人永久网址 | 国产精品内射视频免费 | 国产成人精品视频ⅴa片软件竹菊 | 精品一区二区三区波多野结衣 | 午夜福利电影 | 亚洲日本一区二区三区在线 | 亚洲日韩中文字幕在线播放 | 少妇邻居内射在线 | 一区二区三区乱码在线 | 欧洲 | 牲欲强的熟妇农村老妇女 | 午夜福利一区二区三区在线观看 | 精品日本一区二区三区在线观看 | 99精品视频在线观看免费 | 色综合久久中文娱乐网 | 精品无码国产一区二区三区av | 性欧美牲交xxxxx视频 | 无码一区二区三区在线 | 国产偷国产偷精品高清尤物 | 久久久国产一区二区三区 | 成人动漫在线观看 | www成人国产高清内射 | 久久综合给久久狠狠97色 | 无码精品国产va在线观看dvd | 男女爱爱好爽视频免费看 | 久久精品人妻少妇一区二区三区 | 国产舌乚八伦偷品w中 | 亚洲男人av香蕉爽爽爽爽 | 无遮挡国产高潮视频免费观看 | 婷婷综合久久中文字幕蜜桃三电影 | 国产区女主播在线观看 | 国产电影无码午夜在线播放 | 久久精品国产日本波多野结衣 | 99国产欧美久久久精品 | 无码吃奶揉捏奶头高潮视频 | 色一情一乱一伦一区二区三欧美 | 乱码午夜-极国产极内射 | 小sao货水好多真紧h无码视频 | 在线精品国产一区二区三区 | 黄网在线观看免费网站 | 熟妇人妻中文av无码 | 国产精品人人爽人人做我的可爱 | 99久久久国产精品无码免费 | 国产成人精品一区二区在线小狼 | 免费国产成人高清在线观看网站 | 国产艳妇av在线观看果冻传媒 | 国产午夜无码视频在线观看 | 亚洲熟妇色xxxxx亚洲 | 国产精品资源一区二区 | 亚洲啪av永久无码精品放毛片 | 77777熟女视频在线观看 а天堂中文在线官网 | 国内精品一区二区三区不卡 | 日本丰满护士爆乳xxxx | 欧美freesex黑人又粗又大 | 国产亚洲欧美在线专区 | 九九综合va免费看 | 欧美成人高清在线播放 | 妺妺窝人体色www婷婷 | 激情亚洲一区国产精品 | 欧美激情综合亚洲一二区 | 精品无码国产自产拍在线观看蜜 | 九九热爱视频精品 | 午夜精品久久久久久久久 | 天天拍夜夜添久久精品大 | 又粗又大又硬又长又爽 | 日韩精品久久久肉伦网站 | 国产在线aaa片一区二区99 | 国产精品永久免费视频 | 一区二区三区高清视频一 | 国产亚洲日韩欧美另类第八页 | 波多野结衣一区二区三区av免费 | 久久久国产精品无码免费专区 | 性色av无码免费一区二区三区 | 成人一在线视频日韩国产 | 国产精品久久久一区二区三区 | 国产精品无套呻吟在线 | 婷婷色婷婷开心五月四房播播 | 欧美怡红院免费全部视频 | 亚洲中文字幕在线观看 | 丰满人妻一区二区三区免费视频 | 荫蒂添的好舒服视频囗交 | 欧美激情一区二区三区成人 | 亚洲精品综合五月久久小说 | 熟妇人妻中文av无码 | 中文字幕 人妻熟女 | 色婷婷香蕉在线一区二区 | 色五月五月丁香亚洲综合网 | 欧美老妇交乱视频在线观看 | 欧美怡红院免费全部视频 | 少妇性l交大片 | 欧美freesex黑人又粗又大 | 免费中文字幕日韩欧美 | 欧美熟妇另类久久久久久多毛 | 亚洲欧洲日本综合aⅴ在线 | 国产精品资源一区二区 | 欧美日韩一区二区免费视频 | 无码人妻久久一区二区三区不卡 | 最新国产乱人伦偷精品免费网站 | 日本高清一区免费中文视频 | 国产精品无码成人午夜电影 | 亚洲精品久久久久avwww潮水 | 国产精品无码永久免费888 | 中文字幕乱码人妻无码久久 | 大色综合色综合网站 | 2020久久香蕉国产线看观看 | 无码中文字幕色专区 | 国产成人人人97超碰超爽8 | 国产午夜福利100集发布 | 日本va欧美va欧美va精品 | 国产精品久久久av久久久 | 澳门永久av免费网站 | 97久久精品无码一区二区 | 真人与拘做受免费视频一 | 久久国产自偷自偷免费一区调 | 无人区乱码一区二区三区 | 97se亚洲精品一区 | 精品国精品国产自在久国产87 | 亚洲无人区午夜福利码高清完整版 | 无码免费一区二区三区 | 四虎国产精品免费久久 | 77777熟女视频在线观看 а天堂中文在线官网 | 娇妻被黑人粗大高潮白浆 | 国产精品无码一区二区三区不卡 | 给我免费的视频在线观看 | 亚洲区小说区激情区图片区 | 国产精品亚洲а∨无码播放麻豆 | 玩弄人妻少妇500系列视频 | 无码精品人妻一区二区三区av | 中文精品久久久久人妻不卡 | 牲欲强的熟妇农村老妇女视频 | 久久精品视频在线看15 | 亚洲经典千人经典日产 | a在线观看免费网站大全 | 99精品视频在线观看免费 | 国产热a欧美热a在线视频 | 嫩b人妻精品一区二区三区 | 免费乱码人妻系列无码专区 | 日欧一片内射va在线影院 | 日本www一道久久久免费榴莲 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品美女久久久网av | 中文字幕色婷婷在线视频 | 东京热男人av天堂 | 精品国产乱码久久久久乱码 | 中文字幕av伊人av无码av | 黑人大群体交免费视频 | 午夜嘿嘿嘿影院 | 国产精品无码一区二区三区不卡 | 国产成人精品无码播放 | 国产极品视觉盛宴 | 偷窥村妇洗澡毛毛多 | 国内少妇偷人精品视频免费 | 大肉大捧一进一出视频出来呀 | 300部国产真实乱 | 无码中文字幕色专区 | 兔费看少妇性l交大片免费 | 欧洲欧美人成视频在线 | 国产在线精品一区二区三区直播 | 人人澡人人透人人爽 | 中文字幕 人妻熟女 | 噜噜噜亚洲色成人网站 | 国产真实夫妇视频 | 久久国产精品精品国产色婷婷 | 成人亚洲精品久久久久 | 最新国产麻豆aⅴ精品无码 | 熟妇人妻中文av无码 | 中文字幕无码视频专区 | 中文字幕人妻丝袜二区 | 无码人妻出轨黑人中文字幕 | 初尝人妻少妇中文字幕 | 人人妻人人澡人人爽人人精品 | 大地资源中文第3页 | 欧美人与禽zoz0性伦交 | 国产一区二区三区精品视频 | 亚洲熟妇色xxxxx亚洲 | 国产av久久久久精东av | 亚洲国产精品美女久久久久 | 伦伦影院午夜理论片 | 日韩av无码中文无码电影 | 国产麻豆精品一区二区三区v视界 | 亚洲熟妇色xxxxx亚洲 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久久久se色偷偷亚洲精品av | 少妇久久久久久人妻无码 | 精品欧美一区二区三区久久久 | 欧美一区二区三区视频在线观看 | 国产热a欧美热a在线视频 | 中文字幕无线码 | 夫妻免费无码v看片 | 999久久久国产精品消防器材 | 亚洲欧洲日本综合aⅴ在线 | 国产精品久久久av久久久 | 国产高潮视频在线观看 | 无码精品国产va在线观看dvd | 国产后入清纯学生妹 | 人人妻人人澡人人爽欧美一区 | 男人和女人高潮免费网站 | 精品国产一区av天美传媒 | 黄网在线观看免费网站 | 女人被男人爽到呻吟的视频 | 小泽玛莉亚一区二区视频在线 | 欧美日韩亚洲国产精品 | 任你躁在线精品免费 | 成年女人永久免费看片 | 人妻互换免费中文字幕 | 久久综合久久自在自线精品自 | 国产真实伦对白全集 | 人妻无码αv中文字幕久久琪琪布 | 麻豆成人精品国产免费 | www国产亚洲精品久久网站 | 激情爆乳一区二区三区 | 国产乱子伦视频在线播放 | 欧美xxxxx精品 | 成 人 免费观看网站 | 鲁一鲁av2019在线 | 在线看片无码永久免费视频 | 狠狠cao日日穞夜夜穞av | 亚洲色大成网站www | 国产一区二区三区影院 | 97资源共享在线视频 | 中国女人内谢69xxxxxa片 | 丰满少妇人妻久久久久久 | 夜夜高潮次次欢爽av女 | 一区二区三区高清视频一 | 国产精品美女久久久久av爽李琼 | 午夜无码人妻av大片色欲 | 国内精品一区二区三区不卡 | 婷婷丁香六月激情综合啪 | 国产精品高潮呻吟av久久 | 99视频精品全部免费免费观看 | 精品久久8x国产免费观看 | 天天躁夜夜躁狠狠是什么心态 | 国产午夜视频在线观看 | 亚洲成a人一区二区三区 | 欧美老人巨大xxxx做受 | 日韩欧美中文字幕在线三区 | 丰满少妇弄高潮了www | 日本va欧美va欧美va精品 | 国产区女主播在线观看 | 国内精品九九久久久精品 | 日韩欧美中文字幕公布 | 国产精品久免费的黄网站 | 色综合久久88色综合天天 | 人人妻人人澡人人爽人人精品 | 久久无码人妻影院 | 亚洲s码欧洲m码国产av | 欧美国产日产一区二区 | 老熟女乱子伦 | www成人国产高清内射 | 国产乱子伦视频在线播放 | 亚洲区小说区激情区图片区 | 久久久久亚洲精品男人的天堂 | 成人片黄网站色大片免费观看 | 国产一区二区三区四区五区加勒比 | 国产午夜亚洲精品不卡 | 天下第一社区视频www日本 | 亚洲熟妇色xxxxx欧美老妇 | 国产suv精品一区二区五 | 亚洲精品无码人妻无码 | 成人影院yy111111在线观看 | 亚洲国产精品成人久久蜜臀 | 999久久久国产精品消防器材 | 人人妻人人澡人人爽人人精品浪潮 | 欧美午夜特黄aaaaaa片 | 中文字幕 人妻熟女 | 国内精品人妻无码久久久影院蜜桃 | 亚洲中文字幕无码中文字在线 | 天堂亚洲免费视频 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲精品美女久久久久久久 | 免费观看激色视频网站 | 水蜜桃色314在线观看 | 好爽又高潮了毛片免费下载 | 亚洲乱亚洲乱妇50p | 久久综合九色综合97网 | 桃花色综合影院 | 亚洲 高清 成人 动漫 | 久久视频在线观看精品 | 亚洲熟妇自偷自拍另类 | 亚洲色成人中文字幕网站 | 99在线 | 亚洲 | 亚洲国产综合无码一区 | 中文字幕无码日韩欧毛 | a国产一区二区免费入口 | 亚洲中文字幕在线无码一区二区 | 男女性色大片免费网站 | 中文字幕av日韩精品一区二区 | 成人无码精品1区2区3区免费看 | 波多野结衣高清一区二区三区 | 久久视频在线观看精品 | 亚洲精品一区二区三区四区五区 | 亚洲欧美日韩成人高清在线一区 | 欧美 日韩 人妻 高清 中文 | 精品国产精品久久一区免费式 | 中文字幕乱码人妻二区三区 | 国产精品久久久久久久影院 | 亚洲午夜久久久影院 | 日日摸天天摸爽爽狠狠97 | 男女下面进入的视频免费午夜 | 中文字幕无码av激情不卡 | 国产真实夫妇视频 | 久久无码中文字幕免费影院蜜桃 | 亚洲人成人无码网www国产 | 精品无码av一区二区三区 | 国产69精品久久久久app下载 | 波多野结衣aⅴ在线 | 亚洲男人av天堂午夜在 | 亚洲日韩乱码中文无码蜜桃臀网站 | 波多野结衣乳巨码无在线观看 | 野外少妇愉情中文字幕 | 色婷婷av一区二区三区之红樱桃 | 国产农村妇女高潮大叫 | 熟妇人妻无乱码中文字幕 | 中文字幕av无码一区二区三区电影 | 亚洲va欧美va天堂v国产综合 | 亚洲欧洲日本综合aⅴ在线 | 国产香蕉尹人视频在线 | 国产精品成人av在线观看 | 最新国产乱人伦偷精品免费网站 | 日日躁夜夜躁狠狠躁 | 人妻天天爽夜夜爽一区二区 | 中文字幕av无码一区二区三区电影 | 在线欧美精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 人人妻人人澡人人爽精品欧美 | 亚洲成av人综合在线观看 | 狠狠cao日日穞夜夜穞av | 成人免费视频在线观看 | 亚洲 激情 小说 另类 欧美 | 国产av人人夜夜澡人人爽麻豆 | 精品熟女少妇av免费观看 | 熟妇人妻激情偷爽文 | 精品人妻人人做人人爽夜夜爽 | 亚洲综合伊人久久大杳蕉 | 人人妻人人澡人人爽人人精品浪潮 | 成人三级无码视频在线观看 | 爱做久久久久久 | 欧美野外疯狂做受xxxx高潮 | 成人欧美一区二区三区黑人免费 | 全球成人中文在线 | 蜜臀aⅴ国产精品久久久国产老师 | 欧美 丝袜 自拍 制服 另类 | 一本久道高清无码视频 | 国产后入清纯学生妹 | 国产精品久久久午夜夜伦鲁鲁 | 99视频精品全部免费免费观看 | 国产成人无码av一区二区 | 3d动漫精品啪啪一区二区中 | 日本精品高清一区二区 | 67194成是人免费无码 | 久久久久亚洲精品中文字幕 | 乱人伦人妻中文字幕无码久久网 | 内射后入在线观看一区 | 强辱丰满人妻hd中文字幕 | 精品无码一区二区三区爱欲 | 久久这里只有精品视频9 | 国产精品久久久久久亚洲毛片 | 亚洲欧美日韩综合久久久 | 日本大香伊一区二区三区 | 高清国产亚洲精品自在久久 | 亚洲精品中文字幕 | 国产精品美女久久久 | 亚洲乱码国产乱码精品精 | 国产人妻大战黑人第1集 | 99久久人妻精品免费二区 | 日本大香伊一区二区三区 | 日本熟妇乱子伦xxxx | 丁香花在线影院观看在线播放 | 久久久久久亚洲精品a片成人 | 国产精品第一国产精品 | 精品无人区无码乱码毛片国产 | 亚洲精品成人av在线 | 国产成人无码av一区二区 | 亚洲色欲色欲天天天www | 国模大胆一区二区三区 | 久久久精品国产sm最大网站 | 99国产欧美久久久精品 | 免费观看激色视频网站 | 精品偷拍一区二区三区在线看 | 最近的中文字幕在线看视频 | 黑森林福利视频导航 | 亚洲成熟女人毛毛耸耸多 | 水蜜桃色314在线观看 | 51国偷自产一区二区三区 | 久久久国产精品无码免费专区 | 精品欧美一区二区三区久久久 | 正在播放老肥熟妇露脸 | 亚洲码国产精品高潮在线 | 色婷婷综合激情综在线播放 | 国产综合色产在线精品 | 亚洲精品国产a久久久久久 | 久久久av男人的天堂 | 欧美老妇与禽交 | 久久精品中文字幕一区 | 香港三级日本三级妇三级 | 中文字幕av伊人av无码av | 亚洲va中文字幕无码久久不卡 | 亚洲男女内射在线播放 | 熟妇人妻无乱码中文字幕 | 色婷婷久久一区二区三区麻豆 | 中文字幕av伊人av无码av | 樱花草在线社区www | 亚洲最大成人网站 | 亚洲自偷自拍另类第1页 | 麻豆国产人妻欲求不满谁演的 | 日韩人妻无码一区二区三区久久99 | 亚洲成av人综合在线观看 | 国产乡下妇女做爰 | 久久精品国产大片免费观看 | 亚洲区小说区激情区图片区 | 夜夜高潮次次欢爽av女 | 麻豆人妻少妇精品无码专区 | 日韩精品无码一本二本三本色 | 欧美人与禽zoz0性伦交 | 中文字幕人妻丝袜二区 | 麻豆国产97在线 | 欧洲 | 欧美黑人巨大xxxxx | 亚洲日韩av一区二区三区四区 | 天天躁夜夜躁狠狠是什么心态 | 精品偷拍一区二区三区在线看 | 欧美日韩人成综合在线播放 | 亚洲熟熟妇xxxx | 熟妇人妻无乱码中文字幕 | 日本丰满熟妇videos | 国内精品一区二区三区不卡 | 国产午夜视频在线观看 | 国产成人无码专区 | 日韩av无码中文无码电影 | 国产精品香蕉在线观看 | 国产精品亚洲一区二区三区喷水 | 偷窥日本少妇撒尿chinese | 欧美激情综合亚洲一二区 | 亚洲中文字幕av在天堂 | 秋霞成人午夜鲁丝一区二区三区 | 乱码午夜-极国产极内射 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲码国产精品高潮在线 | 装睡被陌生人摸出水好爽 | 日本一区二区更新不卡 | 免费无码av一区二区 | 国产人妖乱国产精品人妖 | 欧美亚洲日韩国产人成在线播放 | 久久久久99精品成人片 | 亚洲色欲色欲欲www在线 | 日韩少妇白浆无码系列 | 国产精品无码一区二区三区不卡 | 亚洲一区二区三区在线观看网站 | 精品一区二区三区无码免费视频 | 成人免费视频一区二区 | 人人澡人人透人人爽 | 免费看少妇作爱视频 | 亚洲一区二区三区国产精华液 | 欧美freesex黑人又粗又大 | av在线亚洲欧洲日产一区二区 | 免费男性肉肉影院 | 久久国内精品自在自线 | 国产精品美女久久久网av | 欧美国产日韩久久mv | 人人澡人人妻人人爽人人蜜桃 | 国产成人综合在线女婷五月99播放 | 国产超级va在线观看视频 | 激情综合激情五月俺也去 | 国产在线aaa片一区二区99 | 久久精品国产日本波多野结衣 | 55夜色66夜色国产精品视频 | 国产亚洲视频中文字幕97精品 | 扒开双腿吃奶呻吟做受视频 | 天堂а√在线地址中文在线 | 67194成是人免费无码 | 妺妺窝人体色www婷婷 | 亚洲熟悉妇女xxx妇女av | 桃花色综合影院 | 国精品人妻无码一区二区三区蜜柚 | 野外少妇愉情中文字幕 | 国产成人无码av片在线观看不卡 | 亚洲aⅴ无码成人网站国产app | 性色av无码免费一区二区三区 | 亚洲精品综合一区二区三区在线 | 国产一精品一av一免费 | 色综合久久久无码中文字幕 | 给我免费的视频在线观看 | 女人被男人躁得好爽免费视频 | 亚洲国产欧美国产综合一区 | 天天躁夜夜躁狠狠是什么心态 | 97久久精品无码一区二区 | 性欧美牲交在线视频 | 日产精品99久久久久久 | 久久久成人毛片无码 | 国产极品美女高潮无套在线观看 | 国产肉丝袜在线观看 | 久久99精品国产麻豆蜜芽 | 中文字幕乱码人妻无码久久 | 亚洲狠狠色丁香婷婷综合 | 性生交大片免费看女人按摩摩 | 日本xxxx色视频在线观看免费 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日韩人妻无码一区二区三区久久99 | 国产成人无码av在线影院 | 欧美亚洲国产一区二区三区 | 国产区女主播在线观看 | 久久99精品国产麻豆 | 日韩精品a片一区二区三区妖精 | 天堂а√在线中文在线 | 欧美成人午夜精品久久久 | 精品国产福利一区二区 | 成在人线av无码免观看麻豆 | 欧美成人午夜精品久久久 | 久久久久亚洲精品中文字幕 | 99精品久久毛片a片 | 蜜臀aⅴ国产精品久久久国产老师 | 少妇高潮一区二区三区99 | 纯爱无遮挡h肉动漫在线播放 | 亚洲人成人无码网www国产 | 国产亚洲精品久久久久久大师 | 呦交小u女精品视频 | 成人无码影片精品久久久 | 精品国产av色一区二区深夜久久 | 色 综合 欧美 亚洲 国产 | 青青草原综合久久大伊人精品 | 黑人玩弄人妻中文在线 | 国产手机在线αⅴ片无码观看 | 无码人妻丰满熟妇区毛片18 | 亚洲国产高清在线观看视频 | 欧洲vodafone精品性 | 久精品国产欧美亚洲色aⅴ大片 | 成人影院yy111111在线观看 | 未满成年国产在线观看 | 亚洲娇小与黑人巨大交 | 国产美女精品一区二区三区 | 国产农村乱对白刺激视频 | 在线 国产 欧美 亚洲 天堂 | 欧美人与禽猛交狂配 | 欧美色就是色 | 日本乱偷人妻中文字幕 | 日本xxxx色视频在线观看免费 | 久久综合激激的五月天 | 在线播放免费人成毛片乱码 | 国产sm调教视频在线观看 | 亚洲国产成人av在线观看 | 国产亚洲欧美日韩亚洲中文色 | 99精品国产综合久久久久五月天 | 综合人妻久久一区二区精品 | 国产免费久久精品国产传媒 | www成人国产高清内射 | 亚洲人成无码网www | 欧美人与动性行为视频 | 国内精品人妻无码久久久影院蜜桃 | 又大又黄又粗又爽的免费视频 | 久久伊人色av天堂九九小黄鸭 | 成人女人看片免费视频放人 | 亚洲色成人中文字幕网站 | 亚洲欧美中文字幕5发布 | 在线天堂新版最新版在线8 | 一本色道久久综合狠狠躁 | av香港经典三级级 在线 | 老熟妇仑乱视频一区二区 | 亚洲va欧美va天堂v国产综合 | 少妇性俱乐部纵欲狂欢电影 | 特黄特色大片免费播放器图片 | 中文字幕无码av波多野吉衣 | 小sao货水好多真紧h无码视频 | 中文字幕无线码 | 丰满肥臀大屁股熟妇激情视频 | 国产情侣作爱视频免费观看 | 亚洲小说图区综合在线 | 久久99国产综合精品 | 97夜夜澡人人爽人人喊中国片 | 老子影院午夜精品无码 | 丝袜美腿亚洲一区二区 | 国产麻豆精品精东影业av网站 | 国产成人无码区免费内射一片色欲 | 丝袜 中出 制服 人妻 美腿 | 亚洲大尺度无码无码专区 | 2020久久超碰国产精品最新 | 国产亚洲精品精品国产亚洲综合 | 娇妻被黑人粗大高潮白浆 | 青草青草久热国产精品 | 玩弄人妻少妇500系列视频 | 蜜桃无码一区二区三区 | 少妇人妻av毛片在线看 | 亚洲成a人片在线观看无码 | 免费男性肉肉影院 | 99re在线播放 | www一区二区www免费 | 午夜熟女插插xx免费视频 | 日本欧美一区二区三区乱码 | av无码久久久久不卡免费网站 | 国产午夜无码视频在线观看 | 亚洲va中文字幕无码久久不卡 | 中文毛片无遮挡高清免费 | 日欧一片内射va在线影院 | 亚洲の无码国产の无码影院 | 国产办公室秘书无码精品99 | 久久人妻内射无码一区三区 | a在线亚洲男人的天堂 | 色婷婷欧美在线播放内射 | 高中生自慰www网站 | 爱做久久久久久 | 国内精品人妻无码久久久影院 | 国产人妻人伦精品1国产丝袜 | 搡女人真爽免费视频大全 | 亚洲天堂2017无码 | av无码不卡在线观看免费 | 色综合久久久无码网中文 | 亚洲自偷自偷在线制服 | 久久久久亚洲精品中文字幕 | 无码av岛国片在线播放 | 荡女精品导航 | 东北女人啪啪对白 | 97资源共享在线视频 | 一本大道伊人av久久综合 | 亚洲色无码一区二区三区 | 黑人巨大精品欧美一区二区 | 国产特级毛片aaaaaaa高清 | 少妇厨房愉情理9仑片视频 | 天天拍夜夜添久久精品 | 漂亮人妻洗澡被公强 日日躁 | 国产av一区二区精品久久凹凸 | 成人性做爰aaa片免费看不忠 | 鲁大师影院在线观看 | 国产一区二区三区四区五区加勒比 | 国内少妇偷人精品视频免费 | 国产色在线 | 国产 | 人人澡人人透人人爽 | 少妇性l交大片欧洲热妇乱xxx | 波多野结衣乳巨码无在线观看 | 装睡被陌生人摸出水好爽 | 国产成人无码av在线影院 | 99riav国产精品视频 | 对白脏话肉麻粗话av | 欧美激情一区二区三区成人 | 女人和拘做爰正片视频 | 成在人线av无码免费 | 香港三级日本三级妇三级 | 亚洲精品中文字幕久久久久 | 亚洲日韩中文字幕在线播放 | 欧美日韩一区二区综合 | 婷婷五月综合激情中文字幕 | 欧美精品国产综合久久 | 波多野结衣av一区二区全免费观看 | 色综合久久久无码中文字幕 | 永久黄网站色视频免费直播 | 精品久久久中文字幕人妻 | 欧美老熟妇乱xxxxx | 久久亚洲精品中文字幕无男同 | 亚洲 欧美 激情 小说 另类 | 国产精品a成v人在线播放 | 亚洲国产日韩a在线播放 | 亚洲精品一区二区三区在线观看 | 国产精品沙发午睡系列 | 3d动漫精品啪啪一区二区中 | 久久久久久久久蜜桃 | 国产一精品一av一免费 | 精品aⅴ一区二区三区 | 2020久久超碰国产精品最新 | 99久久久国产精品无码免费 | 国色天香社区在线视频 | 内射白嫩少妇超碰 | 蜜臀av在线播放 久久综合激激的五月天 | 99麻豆久久久国产精品免费 | 国产人妻精品一区二区三区 | 国产成人无码a区在线观看视频app | 亚洲啪av永久无码精品放毛片 | 国产sm调教视频在线观看 | 欧美高清在线精品一区 | 久久久av男人的天堂 | 高潮毛片无遮挡高清免费视频 | 无码国产激情在线观看 | 国产亚洲精品久久久久久 | 久久精品成人欧美大片 | 正在播放老肥熟妇露脸 | www一区二区www免费 | 国产精品内射视频免费 | 亚洲精品国偷拍自产在线麻豆 | 乱中年女人伦av三区 | 色欲人妻aaaaaaa无码 | 帮老师解开蕾丝奶罩吸乳网站 | 老熟女乱子伦 | 亚洲精品无码人妻无码 | 精品国产成人一区二区三区 | 青青青爽视频在线观看 | 4hu四虎永久在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 国产成人一区二区三区在线观看 | 欧美老人巨大xxxx做受 | 亚洲成a人片在线观看无码3d | 国产精品高潮呻吟av久久4虎 | 国产亚洲精品精品国产亚洲综合 | 老熟女重囗味hdxx69 | 亚洲熟女一区二区三区 | 少妇人妻大乳在线视频 | 国产三级精品三级男人的天堂 | 国产做国产爱免费视频 | 内射欧美老妇wbb | 久久国产精品偷任你爽任你 | 精品久久8x国产免费观看 | 欧美成人高清在线播放 | 久久久久久a亚洲欧洲av冫 | 久久人妻内射无码一区三区 | 成熟人妻av无码专区 | 久久精品国产大片免费观看 | av香港经典三级级 在线 | 欧美精品免费观看二区 | av无码不卡在线观看免费 | 日韩人妻少妇一区二区三区 | 日本精品高清一区二区 | 国产真实乱对白精彩久久 | 国内揄拍国内精品少妇国语 | 精品人妻中文字幕有码在线 | 日韩欧美中文字幕公布 | 在线成人www免费观看视频 | 无码精品人妻一区二区三区av | 国产农村妇女高潮大叫 | 国产精品亚洲专区无码不卡 | 激情内射日本一区二区三区 | 精品午夜福利在线观看 | 精品久久久久久人妻无码中文字幕 | 日韩精品无码一本二本三本色 | 精品国产福利一区二区 | 国产成人精品无码播放 | 欧美大屁股xxxxhd黑色 | 永久免费观看美女裸体的网站 | 国产香蕉97碰碰久久人人 | 婷婷五月综合激情中文字幕 | 国产性生大片免费观看性 | 波多野结衣高清一区二区三区 | 国产农村妇女高潮大叫 | 国产超级va在线观看视频 | 久久成人a毛片免费观看网站 | 九九综合va免费看 | 国产精品国产三级国产专播 | 小泽玛莉亚一区二区视频在线 | 国产成人综合在线女婷五月99播放 | 在线亚洲高清揄拍自拍一品区 | 国产精品18久久久久久麻辣 | 2020久久香蕉国产线看观看 | 在线精品国产一区二区三区 | 久久亚洲日韩精品一区二区三区 | 国内揄拍国内精品少妇国语 | 无套内谢的新婚少妇国语播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久久中文久久久无码 | 在教室伦流澡到高潮hnp视频 | 97精品人妻一区二区三区香蕉 | 东京热无码av男人的天堂 | 高中生自慰www网站 | 狠狠亚洲超碰狼人久久 | 性色av无码免费一区二区三区 | 中文字幕 亚洲精品 第1页 | 一本一道久久综合久久 | 国产av无码专区亚洲awww | 理论片87福利理论电影 | 伊人久久大香线焦av综合影院 | 日韩亚洲欧美中文高清在线 | 亚洲の无码国产の无码影院 | 久久久久成人精品免费播放动漫 | 国产97在线 | 亚洲 | 精品成人av一区二区三区 | 免费看少妇作爱视频 | 天天躁夜夜躁狠狠是什么心态 | 无码精品国产va在线观看dvd | 人妻少妇精品视频专区 | 国产精品理论片在线观看 | 无码av最新清无码专区吞精 | 狠狠亚洲超碰狼人久久 | 大肉大捧一进一出好爽视频 | 久久精品国产99久久6动漫 | 久久精品成人欧美大片 | 大肉大捧一进一出好爽视频 | 国产成人无码专区 | 1000部啪啪未满十八勿入下载 | 亚洲成av人片天堂网无码】 | 国产免费久久精品国产传媒 | 久久亚洲中文字幕无码 | 麻豆人妻少妇精品无码专区 | 亚洲の无码国产の无码步美 | 日本精品高清一区二区 | 精品一区二区不卡无码av | 日韩av无码一区二区三区不卡 | 啦啦啦www在线观看免费视频 | 亚洲中文字幕成人无码 | 亚洲码国产精品高潮在线 | 一本加勒比波多野结衣 | 久久久久久久女国产乱让韩 | 成 人 免费观看网站 | 俺去俺来也在线www色官网 | www一区二区www免费 | 成人一在线视频日韩国产 | 国产成人综合在线女婷五月99播放 | 东京一本一道一二三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 久久亚洲中文字幕无码 | 精品欧洲av无码一区二区三区 | 亚洲成av人片在线观看无码不卡 | 永久黄网站色视频免费直播 | 精品亚洲成av人在线观看 | 亚洲日本va中文字幕 | 精品久久久久久亚洲精品 | 午夜福利试看120秒体验区 | 精品国产成人一区二区三区 | 久久久无码中文字幕久... | 男女性色大片免费网站 | 内射白嫩少妇超碰 | 特大黑人娇小亚洲女 | 亚洲无人区午夜福利码高清完整版 | 色综合天天综合狠狠爱 | 亚洲国产精品久久人人爱 | 国产乱人伦偷精品视频 | 亚洲一区二区三区偷拍女厕 | 色综合天天综合狠狠爱 | 午夜精品久久久内射近拍高清 | 青青青爽视频在线观看 | 无码国产乱人伦偷精品视频 | 领导边摸边吃奶边做爽在线观看 | 中文字幕精品av一区二区五区 | 国产精华av午夜在线观看 | 成人无码视频在线观看网站 | 亚洲自偷精品视频自拍 | 中文字幕乱码中文乱码51精品 | av无码不卡在线观看免费 | 精品国产一区av天美传媒 | 欧美日韩一区二区免费视频 | 欧美刺激性大交 | 妺妺窝人体色www婷婷 | 性啪啪chinese东北女人 | 国产av人人夜夜澡人人爽麻豆 | 色综合久久中文娱乐网 | 久久久久久av无码免费看大片 | 亚洲va中文字幕无码久久不卡 | 荫蒂被男人添的好舒服爽免费视频 | 中文字幕乱码人妻无码久久 | 男人扒开女人内裤强吻桶进去 | 精品国产青草久久久久福利 | 噜噜噜亚洲色成人网站 | 亚洲一区二区三区播放 | 国产精品久久久av久久久 | 鲁大师影院在线观看 | 男女下面进入的视频免费午夜 | 欧美激情一区二区三区成人 | 亚洲国产综合无码一区 | 色 综合 欧美 亚洲 国产 | 男人的天堂2018无码 | 亚洲成av人片在线观看无码不卡 | a国产一区二区免费入口 | 国产成人无码午夜视频在线观看 | 国产 浪潮av性色四虎 | 国产亚洲日韩欧美另类第八页 | 狠狠躁日日躁夜夜躁2020 | 香港三级日本三级妇三级 | 无码av最新清无码专区吞精 | 国产成人无码a区在线观看视频app | 国产xxx69麻豆国语对白 | 激情亚洲一区国产精品 | 亚洲区欧美区综合区自拍区 | 久久人人爽人人爽人人片ⅴ |