999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

RT-Thread的SPI總線驅動結構分析、移植及應用*

2018-01-04 02:55:15,,,
單片機與嵌入式系統應用 2017年12期
關鍵詞:結構設備系統

,,,

(1.福建商學院,福州 350012;2.福建工程學院)

RT-Thread的SPI總線驅動結構分析、移植及應用*

高培1,何棟煒2,李文翔1,林丹楠1

(1.福建商學院,福州 350012;2.福建工程學院)

介紹了串行外設接口SPI的通信原理,對RT-Thread操作系統下的SPI總線驅動結構進行了詳細的研究與分析。以STM32F407ZG對W25Q64的讀寫為例,介紹了硬件SPI總線驅動的移植步驟,并詳細介紹了SPI應用程序設計及技術實施細節。最后通過實驗,對SPI驅動移植及程序設計的可行性及有效性進行驗證,實驗結果表明,RT-Thread操作系統下的SPI總線驅動結構設計合理,移植方便且應用程序設計簡單,本文所介紹的移植與應用方法可行有效。

RT-Thread;SPI;驅動結構;分析;移植;應用

引 言

RT-Thread是開源的嵌入式實時操作系統,由國內一些專業開發人員開發、維護,主要優點是實時、小型、可裁剪以及支持的處理器平臺廣泛[1]。RT-thread不僅是一款高效、穩定的實時核心,也是一套面向嵌入式系統的軟件平臺,在借鑒其他實時操作系統優點的基礎上又具有自己的特點,被廣泛應用在工業控制和物聯網應用等領域[2-4]。由于SPI在芯片的引腳上只占用4根線,節約了芯片的引腳,同時為PCB的布局節省空間,提供方便。正是出于這種簡單易用的特性,如今越來越多的芯片集成了這種通信協議,被廣泛應用在嵌入式系統中[5]。

本文介紹了SPI驅動的通信原理,對RT-Thread操作系統下SPI驅動結構進行了分析,以STM32F407ZG讀寫64 Mb的串行Flash存儲器W25Q64為例,對SPI總線驅動移植步驟及應用程序設計進行了詳細的描述。

1 SPI通信原理

1.1 SPI總線架構

SPI系統可以直接與各個廠家生產的多種標準外圍器件直接連接,它以主從方式工作,通常有一個主設備和一個或多個從設備,一般使用4條線,分別是:總線主機輸入/從機輸出MISO、總線主機輸出/從機輸入MOSI、時鐘信號SCLK、使能信號CS。其中,MISO信號是一個單向信號,它將數據由從設備傳輸到主設備,MOSI信號也是一個單向信號,它則將數據從主設備傳輸到從設備。時鐘信號SCLK由主設備產生,從設備接收,用于同步SPI接口間數據傳輸的時鐘信號。圖1所示為SPI總線架構圖,只有片選信號為預先規定的使能信號時(高電位或低電位),對該芯片的操作才有效,這就允許在同一總線上連接多個SPI設備。

圖1 SPI總線架構圖

1.2 SPI數據傳輸

SPI通信是通過數據交換完成的,SPI是串行通信協議,數據是一位一位傳輸的。SCLK提供時鐘脈沖,MOSI和MISO基于此脈沖完成數據傳輸。主設備數據輸出通過MOSI線,數據在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被從設備讀取,經過8個時鐘周期完成1個字節的發送。主設備通過對SCLK時鐘線的控制可以完成對通信的控制,當沒有時鐘跳變時,從設備不采集或傳送數據。常用CPOL (Clock Polarity)表示時鐘極性,CPHA(Clock Phase)表示時鐘相位,CPOL和CPHA可以是0或是1,對應有4種組合及說明,如表1所列。[6]

表1 SPI數據與時鐘相位關系

圖2為CPHA=0時,SPI的數據傳輸格式時序圖,圖3為CPHA=1時SPI的數據傳輸格式時序圖。

圖2 CPHA=0時SPI的數據傳輸格式時序圖

圖3 CPHA=1時SPI的數據傳輸格式時序圖

2 SPI驅動結構分析

RT-Thread下的SPI總線驅動架構(如圖4所示)可分為:SPI外設驅動層/應用程序(需要根據所使用硬件設備自行設計或移植)、設備層(spi_dev.c,位于DeviceDrivers目錄下)、總線核心層(spi_core.c,位于DeviceDrivers目錄下)、SPI硬件驅動層(移植目標,本項目中為stm32_i2c.c)[7-8]。

圖4 RT-Thread下SPI總線驅動架構

各層間通過結構體聯系,主要結構體之間的關系如圖5所示。

rt_spi_device結構體用來描述SPI虛擬總線(SPI總線允許在同一總線上連接多個SPI設備,每個SPI設備對應一個CS引腳,使用虛擬總線可以簡化設備層及上層驅動和應用程序設計);rt_spi_bus結構體用來描述設備對應的物理SPI總線,其主要功能是提供具體的SPI總線配置與操作接口;rt_spi_ops結構體用來描述物理總線的操作,主要包括總線的配置(configure)與數據傳輸接口(xfer)。

2.1 SPI設備層(spi_dev.c)

設備層(spi_dev.c)是操作系統與總線核心層間的接口,它規范了SPI設備的讀寫接口,使得SPI設備驅動或程序可以通過標準接口實現總線配置及操作,在RT-Thread 1.2.0版本中將設備接口分為總線接口(如:_spi_bus_device_init等)和總線設備接口(如_spidev_device_init等),其中_spi_bus_device_control、_spidev_device_control等并沒有實現具體的功能,僅僅是為了兼容RT-Thread低版本(如0.3.x、1.0.x等)。

圖5 SPI驅動結構體關系圖

設備層(spi_dev.c)將SPI設備的操作分為:總線與設備兩種,其操作抽象為4種基本操作:初始化、讀操作、寫操作、控制等,主要函數見表2。

表2 spi_dev.c主要函數

常用的接口函數如下所示:

① rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name)。其中,bus為被初始化SPI總線的rt_spi_bus類型結構體指針,name指向注冊到系統中的SPI總線的名稱,應用程序或驅動可以通過name向系統查找、申請和訪問對應的總線。

② rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)。其中,dev為被初始化SPI總線設備的rt_spi_device類型結構體指針,name指向注冊到系統中的SPI總線設備名稱,應用程序或驅動可以通過name向系統查找、申請和訪問對應的總線設備,該函數僅由spi_core.c中的rt_spi_bus_attach_device函數調用,完成總線設備向系統注冊。

2.2 SPI核心層(spi_core.c)

核心層(spi_core.c)作為應用程序或者SPI外設驅動的接口,規定了SPI總線的初始化、配置及通信的標準接口,是SPI設備驅動及應用程序與SPI硬件驅動層的媒介,主要函數見表3。

表3 核心層(spi_core.c)主要函數

常用的接口函數如下所示:

① rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops)。該函數是系統提供給硬件驅動層或應用程序實現向系統注冊SPI硬件操作函數的接口。其中,name指向注冊到系統中的SPI總線名稱,該名稱由用戶決定并最終通過rt_spi_bus_device_init函數注冊到系統中;ops結構體指針用來將移植好的SPI操作接口傳遞給SPI核心層,具體結構如圖5所示。

② rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data)。SPI總線通過使用多個CS及復用總線的方式實現在同一總線上連接多個SPI設備,即每個CS引腳對應一個SPI設備。因此,在SPI核心層中在對SPI總線進行注冊的基礎上還需要使用rt_spi_bus_attach_device函數對各個SPI設備進行注冊。函數中device指向當前初始化SPI設備對應的rt_spi_device結構體;name指向要向系統進行注冊的SPI設備總線的名稱;bus_name指向當前設備對應的SPI總線名稱,系統可以根據bus_name查找并訪問該總線;user_data指向需要傳遞給系統設備層的自定義用戶數據。

③ rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)。該函數是SPI設備配置接口函數。其中device指向要進行配置的SPI設備;cfg為SPI設備的配置參數,包括:SPI時鐘極性、時鐘相位和比特序(MSB或LSB),驅動中分別用mode的第0~2位表示,詳見spi.h;data_width表示數據幀長度(8或16bits);max_hz為SCLK頻率,該結構體如下所示:

struct rt_spi_configuration{

rt_uint8_t mode;

rt_uint8_t data_width;

rt_uint16_t reserved;

rt_uint32_t max_hz;

};

此外,在SPI核心層中沒有提供總線或總線設備申請函數,用戶向系統申請總線或總線設備需要使用rt_device_find函數來實現,其具體形式為:rt_device_t rt_device_find(const char *name),其中name指向要申請的總線或總線設備名稱對應的字符串,該函數返回結果為rt_device_t類型,因此,對于SPI總線或總線設備申請需要進行強制類型轉換。

在數據傳輸方面,SPI核心層提供了rt_spi_send_then_send等4種模式。其中,rt_spi_send_then_send為連續數據段發送操作,rt_spi_send_then_recv為數據段發送后再接收操作,這兩種方式較為簡單、直接,具體見spi_core.c。rt_spi_transfer提供收發同步操作,即發送數據段的同時進行接收,其接口函數具體為:rt_size_t rt_spi_transfer(struct rt_spi_device *device, const void *send_buf, void *recv_buf, rt_size_t length),該接口形式簡潔,不做詳細說明。rt_spi_transfer_message提供message數據包形式的數據傳輸,message數據包結構為:

struct rt_spi_message{

const void *send_buf;

void *recv_buf;

rt_size_t length;

struct rt_spi_message *next;

unsigned cs_take : 1;

unsigned cs_release : 1;

};

其中,send_buf和recv_buf分別指向發送和接收緩沖區;length為發送數據的長度;next指向存儲的下一個message數據包,用來實現隊列化數據包傳輸。message數據包形式的SPI數據傳輸接口函數為:struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device *device, struct rt_spi_message *message),只需要根據發送的內容組織message數據結構,然后調用該函數即可快速完成數據傳輸。message數據包形式的SPI數據傳輸,實際可以看作對transfer形式進行了對象化,transfer形式程序實現過程中實際上使用了message數據包(詳見spi_core.c)。

2.3 SPI硬件驅動層

SPI硬件驅動層是SPI核心層與硬件間的接口,是SPI操作的具體實現部分,也是驅動移植時的主要部分。RT-Thread將具體SPI操作抽象并封裝為SPI總線設備配置(configure)和SPI數據傳輸(xfer)。對用戶來說,只需要完成硬件初始化和所需基本操作的驅動編寫即可完成驅動的移植工作[9-10]。

SPI總線一般用于高速數據通信,大都采用硬件實現。對于硬件SPI,SPI總線的讀寫等具體操作都是通過對寄存器的讀寫來完成的,驅動移植時只需要參照接口格式,依照寄存器手冊,即可完成程序編寫[11-13]。

若使用軟件SPI,則需要根據SPI通信時序規則來編寫模擬程序再通過I/O口的輸入/輸出操作實現通信,并根據SPI核心層接口格式編寫操作接口函數,軟件SPI的硬件驅動層可以參考軟件I2C驅動移植過程,但RT-Thread操作系統并未提供軟件SPI標準接口層,因此軟件SPI驅動移植工作量相對較大。

3 SPI總線驅動移植及應用

本節將詳細介紹RT-Thread下的SPI總線驅動移植,以STM32F407ZG連接W25Q64的讀寫為例介紹硬件SPI總線驅動移植與應用,實驗電路連接如圖6所示。

圖6 實驗電路圖

W25Q64是64 Mb的串行Flash存儲器,支持2.7~3.6 V的電壓,支持標準的SPI,同時支持雙輸出/四輸出的SPI,最大SPI時鐘可達80 MHz。為便于描述,SPI總線驅動不使用DMA模式,本文使用STM32F407ZG的SPI2,以主模式連接W25Q64,W25Q64的其他引腳(VCC等)連接較為簡單,詳見參考文獻[11]。

3.1 SPI總線驅動移植

首先,為了使用RT-Thread 1.2.0版本中提供的SPI模塊,需要將spi_dev.c、spi_core.c兩個文件添加到工程項目中,并在rtconfig.h添加宏定義:#define RT_USING_SPI。接下來進行SPI硬件驅動層的移植,SPI硬件驅動層移植主要工作分為兩部分:①SPI硬件初始化;②SPI硬件驅動接口函數移植。

3.1.1 SPI硬件初始化

SPI硬件初始化主要完成SPI總線所涉及的4個引腳和SPI模塊時鐘等硬件初始化。對于STM32F407ZG,SPI總線驅動硬件初始化函數需要完成的操作如圖7所示,具體包括:

① 開啟SPI接口所在GPIO引腳及SPI外設時鐘。由于硬件SPI接口除了使用到對應GPIO引腳外,還需要芯片中的SPI控制器的支持,因此需要開啟對應的兩個時鐘。

② GPIO引腳模式初始化。所使用的SPI引腳都是復用的,需要對各個引腳(MISO、MOSI、SCLK、CS)初始化為SPI模式,具體設置請參考參考文獻[12]。

③ 結構體初始化。SPI驅動中總線及設備的信息是以結構體形式存儲并借助結構體完成調用的。這些結構體包括:SPI設備結構體(rt_spi_device)、SPI總線結構體(rt_spi_bus),該結構體只需要完成定義、SPI操作接口結構體(rt_spi_ops),SPI核心層通過該結構體中的函數接口指針完成操作函數的調用,該結構體定義好后需要對其進行初始化,即將移植完成的configure和xfer兩個函數入口指針賦值給該結構體。由于這些結構體在系統運行期間一直處于使用狀態,所以必須定義為靜態形式(static)。

④ 完成以上信息初始化后,接著使用核心層中的rt_spi_bus_register接口函數向系統注冊SPI總線,再使用rt_spi_bus_attach_device接口函數向系統注冊SPI設備,即可完成SPI總線驅動的硬件及系統初始化工作。初始化流程圖如圖7所示。

圖7 SPI總線驅動硬件初始化流程圖

3.1.2 SPI硬件驅動接口函數移植

SPI硬件驅動接口函數所涉及的configure和xfer兩個函數是SPI驅動移植工作中最核心的部分,也是工作量最大的部分。其中,configure函數具體形式為:

static rt_err_t configure(struct rt_spi_device* device, struct rt_spi_configuration* configuration)

其作用是根據rt_spi_configuration結構體中SPI設備的配置信息完成對指定的SPI設備的配置操作(具體信息詳見第2.2節),對于硬件SPI來說,這些配置操作最后都歸結為對應寄存器的配置。configure函數的設計過程為:

① 查找各個SPI設備參數(工作模式mode、數據幀長度data_width、時鐘SCLK頻率max_hz;)和對應的寄存器。

② 將SPI設備參數轉換為對應的寄存器值。

③ 根據寄存器配置規則寫入相應寄存器值。

如時鐘SCLK頻率配置,由于max_hz變量中的數值一般是以Hz為單位,而根據數據手冊可知對于STM32F407ZG來說,該頻率值設置涉及芯片內核SystemCoreClock、SPI模塊所使用的APB總線時鐘及SPI_CR1寄存器中的BR[2:0]位。因此,程序設計中需要考慮這些因素,根據max_hz值計算出各個時鐘配置的值,并對max_hz超出硬件允許值等進行判斷和保護。該函數編寫可以參考STMicroelectronics公司提供的固件庫。

數據傳輸函數xfer具體形式為:

static rt_uint32_t xfer(struct rt_spi_device* device, struct rt_spi_message* message)

其功能為:在指定的SPI設備上,完成rt_spi_message結構體中指定的數據傳輸(包括數據發送和接收)。該功能實現比較簡單,只需要根據發送數據長度(length),將發送緩沖區(send_buf)中的數據逐個寫入SPI發送寄存器中,在發送的同時讀取SPI接收寄存器并將數據存儲到接收緩沖區(recv_buf)。需要注意的是,需要根據SPI設備當前工作的數據幀長度,對接收與發送寄存器進行讀寫才能保證數據的正確傳輸。

3.2 W25Q64的讀寫

W25Q64的操作采用“指令+數據”形式,讀寫操作時序如圖8所示。

圖8 W25Q64的讀寫操作時序圖

圖9 W25Q64讀寫程序流程

實現W25Q64讀寫的程序流程如圖9所示。

首先調用rt_device_find函數,語句如下:

struct rt_spi_device * spi_dev;

dev = (struct rt_spi_device *)rt_device_find("spi20");

若正確申請到總線設備后,系統會將該SPI總線設備的rt_spi_device類型結構體指針返回,利用該指針和SPI核心層中的接口函數(詳見第2.2節)即可實現W25Q64的讀寫操作。接下來,根據W25Q64的SPI總線特性配置SPI設備。根據W25Q64的數據手冊,其SPI采用Mode 0和Mode 3,數據幀長度為8位,MSB模式,SPI時鐘最高支持133 MHz。結合硬件情況,進行如下配置:

struct rt_spi_configuration cfg;

cfg.data_width = 8;

cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */

cfg.max_hz = 20 * 1000 * 1000; /* 50M */

rt_spi_configure(spi_dev, &cfg);

最后,以讀取W25Q64的JEDEC ID為例(JEDEC用來幫助程序讀取Flash的制造商ID和設備ID,以確定Flash的大小和算法)介紹SPI設備的讀寫操作。根據W25Q64的指令集,JEDEC ID對應指令為0x9F,芯片將返回24位的ID數據,其中三個字節分別代表制造商ID、存儲器類型及存儲器容量,若操作正確,應讀取到0xEF、0x40、0x17。

該操作主要程序如下:

rt_uint8_t cmd = 0x9F;//JEDEC ID指令

rt_uint8_t id_recv[3];//接收緩沖區

rt_spi_send_then_recv(spi_dev, &cmd, 1, id_recv, 3);//發送指令并讀取

rt_kprintf(JEDEC ID: %02X %02X %02X ", id_recv[0], id_recv[1], id_recv[2]);//顯示返回數據

程序正確申請到SPI設備后,對W25Q64進行JEDEC ID讀取操作,通過對比可以看出,讀取到的數據與預期數據一致,由此證明所移植的SPI驅動及SPI接口應用正確。綜上所述,本次SPI總線驅動移植是成功的,并且利用SPI核心層接口讀寫W25Q64也是成功的。

結 語

[1] 曹成. 嵌入式實時操作系統RT-Thread原理分析與應用[D]. 青島:山東科技大學, 2011.

[2] 張麗彪, 駱東佳, 張艦航,等. 基于RT-Thread和Yeelink的物聯網平臺開發的應用設計[J]. 電子技術與軟件工程, 2015(16):70.

[3] 陳偉. 基于RT-thread的遠程家用服務機器人系統開發[D]. 杭州:浙江工業大學, 2015.

[4] Yu-Xiang W U, Xin L I, Liu Q. Design of Digital Photo Frame Based on RT-Thread and STM32[J].Electronics World, 2013(18).

[5] 鄭毛祥. SPI總線接口擴展與應用[J]. 自動化技術與應用, 2012, 31(9):75-79.

[6] 嚴海穎, 趙宇楓.ARM嵌入式系統應用開發基礎[M].大連:東軟電子出版社,2013:211-214.

[7] 高培. RT Thread的I2 C總線驅動結構分析、移植及應用[J]. 單片機與嵌入式系統應用, 2016, 16(12):26-30.

[8] 葉思超. 基于RT-Thread的手持式高性能RFID讀寫器設計[D]. 成都:電子科技大學, 2015.

[9] 涂撰, 趙標. RT-Thread在LPC2378上的移植與應用[J]. 上海船舶運輸科學研究所學報, 2013, 36(1):44-49.

[10] 朱志國. RT-Thread操作系統在STM32中移植的研究[J]. 計算機光盤軟件與應用, 2012(22):119-120.

[11] Winbond Inc. 64M-bit Serial Flash Memory with uniform 4KB sectors and Dual/Quad SPI, 2014.

[12] ST Microelectronics. RM0090 Reference manual STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs, 2012.

[13] RT-Thread開發組. RT-Thread編程指南, 2014.

高培(講師)、何棟煒(副教授),主要研究方向為嵌入式技術與物聯網應用。

StructureAnalysis,MigrationandApplicationofSPIBusDriverforRT-Thread

GaoPei1,HeDongwei2,LiWenxiang1,LinDannan1

(1.Fujian Business University,Fuzhou 350012,China;2.Fujian University of Technology)

In the paper,the communication principle of SPI and the SPI bus driver structure of the RT-Thread operating system are researched and analyzed.Taking the example of STM32F407ZG’s read and write operation on W25Q64,the transplant procedure of hardware SPI bus driver,the SPI application design and technical implementation are introduced.Finally,the experiment is carried out to verify the feasibility and effectiveness of driver transplantation and program design of SPI.The experiment results show that the RT-Thread operating system under the SPI bus driver has reasonable structural design,it is convenient to migration and easy for program design,the transplantation and application method introduced in the paper is feasible and effective.

RT-Thread;SPI;driver structure;analysis;migration;application

福建對外經濟貿易職業技術學院校級課題《UWB技術在智慧城市中的應用》(KT201612)。

TP316.2

A

楊迪娜

2017-09-07)

猜你喜歡
結構設備系統
諧響應分析在設備減振中的應用
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
《形而上學》△卷的結構和位置
哲學評論(2021年2期)2021-08-22 01:53:34
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
論結構
中華詩詞(2019年7期)2019-11-25 01:43:04
基于MPU6050簡單控制設備
電子制作(2018年11期)2018-08-04 03:26:08
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
論《日出》的結構
500kV輸變電設備運行維護探討
工業設計(2016年12期)2016-04-16 02:52:00
主站蜘蛛池模板: 中文字幕啪啪| 免费在线a视频| 中美日韩在线网免费毛片视频| 尤物精品视频一区二区三区| 国产99热| 久久青草精品一区二区三区| 1级黄色毛片| 激情综合图区| 亚洲国产午夜精华无码福利| 东京热高清无码精品| 日韩国产精品无码一区二区三区| 最新亚洲人成网站在线观看| 中文无码精品a∨在线观看| 免费女人18毛片a级毛片视频| 囯产av无码片毛片一级| 中国特黄美女一级视频| 国产精鲁鲁网在线视频| 四虎永久在线精品影院| AV不卡在线永久免费观看| 久久久精品无码一区二区三区| 亚洲精品在线影院| 亚洲国语自产一区第二页| 欧美色视频在线| 伊人久久大线影院首页| 欧类av怡春院| 国产剧情伊人| 欧美不卡二区| 久久久久久久久18禁秘| 亚洲天堂自拍| 久热中文字幕在线观看| 毛片三级在线观看| 国产在线观看91精品亚瑟| 免费视频在线2021入口| 91亚洲国产视频| 国产视频入口| 国产成人综合久久精品下载| 97在线免费视频| 久久午夜影院| 伊人无码视屏| 国产剧情一区二区| 无码区日韩专区免费系列 | 国产十八禁在线观看免费| 天天综合天天综合| 亚洲精品动漫在线观看| 欧美在线导航| 久久精品无码国产一区二区三区| 人妻免费无码不卡视频| 久久96热在精品国产高清| 亚洲欧洲综合| 狠狠躁天天躁夜夜躁婷婷| 国产aⅴ无码专区亚洲av综合网| 一级成人a毛片免费播放| 三级毛片在线播放| 性色一区| AⅤ色综合久久天堂AV色综合| 国产精品爆乳99久久| 亚洲日韩精品伊甸| 久久特级毛片| 亚洲h视频在线| a毛片在线播放| 国产伦片中文免费观看| 狠狠综合久久| 狠狠色丁婷婷综合久久| 亚洲娇小与黑人巨大交| 国产亚洲欧美另类一区二区| Jizz国产色系免费| 久久99国产乱子伦精品免| 亚洲欧洲AV一区二区三区| 日本人妻丰满熟妇区| 亚洲精品人成网线在线 | 日韩色图区| 国产激情国语对白普通话| 亚洲成AV人手机在线观看网站| 国产真实乱人视频| 国产情侣一区| 香蕉国产精品视频| 午夜日本永久乱码免费播放片| 国产情侣一区| 在线精品自拍| 免费国产好深啊好涨好硬视频| 亚洲中文字幕23页在线| 精品剧情v国产在线观看|