色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

WLAN驅動架構的組成和各部件的功能

電子工程師 ? 來源:OpenAtom OpenHarmony ? 作者:徐賽 ? 2021-09-05 10:46 ? 次閱讀

作者:徐賽

WLAN驅動概述

WLAN 是基于 HDF(Hardware Driver Foundation)驅動框架開發的模塊,該模塊可實現跨操作系統遷移、自適應器件差異、模塊化拼裝編譯等功能。從而降低 WLAN 驅動開發的難度,減少 WLAN 驅動移植和開發的工作量。

本文主要分析 WLAN 驅動架構的組成和各部件的功能,WLAN 芯片廠商通過本框架如何進行各自驅動的開發,以及如何使用 HAL 接口

WLAN驅動架構介紹

驅動架構主要由 Module、NetDevice、NetBuf、BUS、HAL、Client 和 Message 這七個部分組成。

Module

Module 基于 HDF 驅動框架實現 WLAN 框架的啟動加載、配置文件的解析、設備驅動的初始化和芯片驅動的初始化等功能,根據 WLAN 的功能特性,劃分 Base、AP、STA 等部件,對控制流的命令和事件進行統一管理。

NetDevice

NetDevice 用于建立專屬網絡設備,屏蔽不同 OS 的差異,對 WIFI 驅動提供統一接口,提供統一的 HDF NetDevice 數據結構,及其統一管理、注冊、去注冊能力;對接富設備上的 Linux 的網絡設備層;對接輕設備上的 Linux 的網絡設備層。

NetBuf

NetBuf 部件為 WLAN 驅動提供 Linux 或者 LiteOS 原生的網絡數據緩沖的統一數據結構的封裝以及對網絡數據的操作接口的封裝

BUS

BUS 驅動模塊向上提供統一的總線抽象接口。通過向下調用 Platform 層提供的 sdio 接口和封裝適配 usb、pcie 接口,屏蔽不同操作系統的差異;通過對不同類型的總線操作進行統一封裝,屏蔽不同芯片差異,能夠對不同芯片廠商提供完備的總線驅動功能,不同廠商共用此模塊接口,從而使廠商的開發更為便捷和統一,

HAL

HAL 部件對 WiFiService 模塊提供標準的 WIFI-HDI 接口和數據格式定義,提供能力如下:設置 MAC 地址、設置發射功率、獲取設備的 MAC 地址等。

Client

Client 部件實現用戶態與內核態的交互,通過對 sbuf 及 nl80211 做不同適配,根據產品做配置化編譯,從而實現對上提供統一的接口調用,框架如下圖所示:

2a93cd46-0da6-11ec-8fb8-12bb97331649.png

圖4 Client框架圖

Message

Message 部件為每個服務單獨提供業務接口,每個服務也可依賴其他服務形成組合業務接口,此模塊支持在用戶態、內核態和 MCU 環境運行,實現了組件間的充分解耦。

2aa584a0-0da6-11ec-8fb8-12bb97331649.png

圖5 當前WLAN服務關系圖

WLAN驅動開發步驟與實例

各 WLAN 廠商驅動開發人員可根據 WLAN 模塊提供的向下統一接口適配各自的驅動代碼,實現如下能力:建立/關閉 WLAN 熱點、掃描、關聯 WLAN 熱點等;

下面以 hi3881 WLAN 芯片為例,進行 WLAN 驅動開發過程的詳解。

配置WLAN芯片的硬件參數

1)根據硬件參數,通過 wlan_platform.hcs 配置平臺相關參數。

hisi :& deviceList { device0 :: deviceInst { deviceInstId = 0; powers { power0 { powerSeqDelay = 0; /* 電源序列延時 */ powerType = 1; /* 電源類型:0--總是打開;1--GPIO */ gpioId = 1; /* GPIO管腳號 */ activeLevel=1; /* 有效電平:0--低;1--高 */ } power1 { powerSeqDelay = 0; /* 電源序列延時 */ powerType = 0; /* 電源類型:0--總是打開;1--GPIO */ } } reset { resetType = 0; /* 復位類型:0--不管理;1--GPIO */ gpioId = 2; /* GPIO管腳號 */ activeLevel=1; /* 有效電平:0--低;1--高 */ resetHoldTime = 30; /* 復位配置后的等待時間(ms) */ } bootUpTimeout = 30; /* 啟動超時時間(ms) */ bus { busType = 0; /* 總線類型:0-sdio */ busId = 2; /* 總線號 */ funcNum = [1]; /* SDIO功能號 */ timeout = 1000; /* 讀/寫數據的超時時間 */ blockSize = 512; /* 讀/寫數據的塊大小 */ }}}

2)為 WLAN 塊芯片添加配置文件 wlan_chip_《芯片名》.hcs(如:wlan_chip_hi3881.hcs),配置相關參數。

root { wlan_config { hi3881 :& chipList { chipHi3881 :: chipInst { match_attr = “hdf_wlan_chips_hi3881”; /* 配置匹配標識 */ chipName = “hi3881”; /* WLAN芯片的名稱 */ sdio { vendorId = 0x0296; /* 廠商Id */ deviceId = [0x5347]; /* 設備Id */ } } } }}

WLAN初始化相關適配開發

1)適配掛接 WLAN 芯片的初始化和去初始化、WLAN 芯片驅動的初始化和去初始化。詳情見 hdf_driver_register.c,分析如下:

#include “hdf_device_desc.h”#include “hdf_wifi_product.h”#include “hdf_log.h”#include “osal_mem.h”#include “hdf_wlan_chipdriver_manager.h”#include “securec.h”#include “wifi_module.h”#include “hi_wifi_api.h”#include “hi_types_base.h”

#define HDF_LOG_TAG Hi3881Driver

/* WLAN芯片的初始化和去初始化函數 */int32_t InitHi3881Chip(struct HdfWlanDevice *device);int32_t DeinitHi3881Chip(struct HdfWlanDevice *device);/* WLAN芯片驅動的初始化和去初始化函數 */int32_t Hi3881Deinit(struct HdfChipDriver *chipDriver, struct NetDevice *netDevice);int32_t Hi3881Init(struct HdfChipDriver *chipDriver, struct NetDevice *netDevice);/* 初始化mac80211與芯片側的函數掛接,包括開始掃描,連接,設置國家碼等,詳情見3.2 */hi_void HiMac80211Init(struct HdfChipDriver *chipDriver);

static const char * const HI3881_DRIVER_NAME = “hisi”;/* WLAN芯片驅動掛接以及mac80211與芯片側的函數掛接 */static struct HdfChipDriver *BuildHi3881Driver(struct HdfWlanDevice *device, uint8_t ifIndex){ struct HdfChipDriver *specificDriver = NULL; if (device == NULL) { HDF_LOGE(“%s fail : channel is NULL”, __func__); return NULL; } (void)device; (void)ifIndex; specificDriver = (struct HdfChipDriver *)OsalMemCalloc(sizeof(struct HdfChipDriver)); if (specificDriver == NULL) { HDF_LOGE(“%s fail: OsalMemCalloc fail!”, __func__); return NULL; } if (memset_s(specificDriver, sizeof(struct HdfChipDriver), 0, sizeof(struct HdfChipDriver)) != EOK) { HDF_LOGE(“%s fail: memset_s fail!”, __func__); OsalMemFree(specificDriver); return NULL; }

if (strcpy_s(specificDriver-》name, MAX_WIFI_COMPONENT_NAME_LEN, HI3881_DRIVER_NAME) != EOK) { HDF_LOGE(“%s fail : strcpy_s fail”, __func__); OsalMemFree(specificDriver); return NULL; } specificDriver-》init = Hi3881Init; specificDriver-》deinit = Hi3881Deinit; HiMac80211Init(specificDriver);

return specificDriver;}/* 釋放WLAN芯片驅動 */static void ReleaseHi3881Driver(struct HdfChipDriver *chipDriver){ if (chipDriver == NULL) { return; } if (strcmp(chipDriver-》name, HI3881_DRIVER_NAME) != 0) { HDF_LOGE(“%s:Not my driver!”, __func__); return; } OsalMemFree(chipDriver);}

static uint8_t GetHi3881GetMaxIFCount(struct HdfChipDriverFactory *factory){ (void)factory; return 1;}

/* WLAN芯片相關函數的注冊 */static int32_t HDFWlanRegHisiDriverFactory(void){ static struct HdfChipDriverFactory tmpFactory = { 0 }; struct HdfChipDriverManager *driverMgr = NULL; driverMgr = HdfWlanGetChipDriverMgr(); if (driverMgr == NULL) { HDF_LOGE(“%s fail: driverMgr is NULL!”, __func__); return HDF_FAILURE; } tmpFactory.driverName = HI3881_DRIVER_NAME; tmpFactory.GetMaxIFCount = GetHi3881GetMaxIFCount; tmpFactory.InitChip = InitHi3881Chip; tmpFactory.DeinitChip = DeinitHi3881Chip; tmpFactory.Build = BuildHi3881Driver; tmpFactory.Release = ReleaseHi3881Driver; tmpFactory.ReleaseFactory = NULL; if (driverMgr-》RegChipDriver(&tmpFactory) != HDF_SUCCESS) { HDF_LOGE(“%s fail: driverMgr is NULL!”, __func__); return HDF_FAILURE; }

return HDF_SUCCESS;}

static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device){ (void)device; return HDFWlanRegHisiDriverFactory();}

static int HdfWlanHisiDriverBind(struct HdfDeviceObject *dev){ (void)dev; return HDF_SUCCESS;}

static void HdfWlanHisiChipRelease(struct HdfDeviceObject *object){ (void)object;}

struct HdfDriverEntry g_hdfHisiChipEntry = { .moduleVersion = 1, .Bind = HdfWlanHisiDriverBind, .Init = HdfWlanHisiChipDriverInit, .Release = HdfWlanHisiChipRelease, .moduleName = “HDF_WLAN_CHIPS”};/* HDF的驅動加載入口,先執行Bind,再執行Init */HDF_INIT(g_hdfHisiChipEntry);

2)芯片初始化和芯片驅動初始化相關內容詳見 hdfinit_3881.c,分解如下:

int32_t InitHi3881Chip(struct HdfWlanDevice *device){ int32_t ret = HI_SUCCESS; …… ret = hi_wifi_init(maxPortCount, device-》bus); // 實現芯片的初始化,包括frw機制、平臺和host初始化等等 ……}int32_t DeinitHi3881Chip(struct HdfWlanDevice *device){ ……int32_t ret = hi_wifi_deinit(); // 實現芯片的去初始化……}

3)芯片驅動的初始化與去初始化,主要針對網絡設備相關的配置和加載

int32_t Hi3881Init(struct HdfChipDriver *chipDriver, struct NetDevice *netDevice){ ……ret = wal_init_drv_wlan_netdev(type, WAL_PHY_MODE_11N, netDevice);……}

int32_t Hi3881Deinit(struct HdfChipDriver *chipDriver, struct NetDevice *netDevice){ return wal_deinit_drv_wlan_netdev(netDevice);}

4)在網絡設備進行初始化時,掛接 NetDevice 中提供的數據發送、設置 mac 地址、打開 NetDev 等功能接口。

oal_net_device_ops_stru g_wal_net_dev_ops = { .getStats = wal_netdev_get_stats, .open = wal_netdev_open, .stop = wal_netdev_stop, .xmit = hmac_bridge_vap_xmit, .ioctl = wal_net_device_ioctl, .changeMtu = oal_net_device_change_mtu, .init = oal_net_device_init, .deInit = oal_net_free_netdev,#if (defined(_PRE_WLAN_FEATURE_FLOWCTL) || defined(_PRE_WLAN_FEATURE_OFFLOAD_FLOWCTL)) .selectQueue = wal_netdev_select_queue,#endif

.setMacAddr = wal_netdev_set_mac_addr,#if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) .netifNotify = HI_NULL,#endif .specialEtherTypeProcess = SpecialEtherTypeProcess,};oal_net_device_ops_stru *wal_get_net_dev_ops(hi_void){ return &g_wal_net_dev_ops;}

hi_s32 wal_init_netdev(nl80211_iftype_uint8 type, oal_net_device_stru *netdev){ ……netdev-》netDeviceIf = wal_get_net_dev_ops();……}

控制流命令下發和事件上報的適配

1)命令下發綁定,包括具有公共能力的設置 mac 地址、設置發射功率等;STA 相關的連接、掃描等;AP 相關的啟動 ap、設置國家碼等。

static struct HdfMac80211BaseOps g_baseOps = { .SetMode = WalSetMode, .AddKey = WalAddKey, .DelKey = WalDelKey, .SetDefaultKey = WalSetDefaultKey, .GetDeviceMacAddr = WalGetDeviceMacAddr, .SetMacAddr = WalSetMacAddr, .SetTxPower = WalSetTxPower, .GetValidFreqsWithBand = WalGetValidFreqsWithBand, .GetHwCapability = WalGetHwCapability};static struct HdfMac80211STAOps g_staOps = { .Connect = WalConnect, .Disconnect = WalDisconnect, .StartScan = WalStartScan, .AbortScan = WalAbortScan, .SetScanningMacAddress = WalSetScanningMacAddress,};static struct HdfMac80211APOps g_apOps = { .ConfigAp = WalConfigAp, .StartAp = WalStartAp, .StopAp = WalStopAp, .ConfigBeacon = WalChangeBeacon, .DelStation = WalDelStation, .SetCountryCode = WalSetCountryCode, .GetAssociatedStasCount = WalGetAssociatedStasCount, .GetAssociatedStasInfo = WalGetAssociatedStasInfo};hi_void HiMac80211Init(struct HdfChipDriver *chipDriver){ if (chipDriver == NULL) { oam_error_log(0, OAM_SF_ANY, “%s:input is NULL!”, __func__); return; } chipDriver-》ops = &g_baseOps; chipDriver-》staOps = &g_staOps; chipDriver-》apOps = &g_apOps;}

2)事件上報接口調用,WLAN 框架提供了 event 事件的上報接口,詳情見 hdf_wifi_event.c,例:調用 HdfWifiEventNewSta AP 上報新關聯的某個 STA 的情況

hi_u32 oal_cfg80211_new_sta(oal_net_device_stru *net_device, const hi_u8 *mac_addr, hi_u8 addr_len, oal_station_info_stru *station_info, oal_gfp_enum_uint8 en_gfp){#if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX) cfg80211_new_sta(net_device, mac_addr, station_info, en_gfp); hi_unref_param(addr_len);#elif (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) || defined(_PRE_HDF_LINUX) struct StationInfo info = { 0 }; info.assocReqIes = station_info-》assoc_req_ies; info.assocReqIesLen = station_info-》assoc_req_ies_len; HdfWifiEventNewSta(net_device, mac_addr, WLAN_MAC_ADDR_LEN, &info); hi_unref_param(en_gfp); hi_unref_param(addr_len);#endif return HI_SUCCESS;}

使用HAL的開發步驟與實例

HAL模塊使用步驟

2ac48152-0da6-11ec-8fb8-12bb97331649.png

圖6 HAL使用流程

1)使用 WifiConstruct 創建一個 WiFi 實體。

2)用創建的 WiFi 實體調用 start 開啟 HAL 和驅動之間的通道,獲得驅動網卡信息

3)通過 createFeature 一個 apFeature 或者 staFeature。后面可通過這些 Feature 去調用具體的實現接口,下面基于創建的 apFeature。

4)調用和使用相關接口:如 setMacAddress 設置 MAC 地址、getDeviceMacAddress 獲取設備的 MAC 地址等。

5)調用 destroyFeature,銷毀掉創建的這個 Feature。

6)調用 stop 銷毀創建的通道。

7)執行 WifiDestruct 銷毀創建的 WiFi 實體。

HAL使用實例

#include “wifi_hal.h”#include “wifi_hal_sta_feature.h”#include “wifi_hal_ap_feature.h”#include “wifi_hal_cmd.h”#include “wifi_hal_event.h”

#define MAC_LEN 6

static void *hal_main(){ int ret; struct IWiFi *wifi;

/* 創建一個WiFi實體 */ ret = WifiConstruct(&wifi); if (ret != 0 || wifi == NULL) { return; }

/* 開啟HAL和驅動之間的通道 */ ret = wifi-》start(wifi); if (ret != 0) { return; }

/* 創建apFeature */ ret = wifi-》createFeature(PROTOCOL_80211_IFTYPE_AP, (struct IWiFiBaseFeature **)&apFeature); if (ret != 0) { return; }

/* 獲取設備的MAC地址 */ unsigned char mac[MAC_LEN] = {0}; ret = apFeature-》baseFeature.getDeviceMacAddress((struct IWiFiBaseFeature *)apFeature, mac, MAC_LEN); if (ret != 0) { return; }

/* 銷毀掉創建的這個Feature */ ret = wifi-》destroyFeature((struct IWiFiBaseFeature *)apFeature); if (ret != 0) { return; }

/* 銷毀創建的通道 */ ret = wifi-》stop(wifi); if (ret != 0) { return; }

/* 銷毀創建的WiFi實體 */ ret = WifiDestruct(&wifi); if (ret != 0) { return; } return;}

總結

以上是基于 WLAN 框架開發所涉及的所有核心適配,重點介紹了 WLAN 框架的各部件的詳情,以 3881 為例進行了 WLAN 芯片開發過程的詳細講解,希望通過本次的文檔,您能初步掌握開發 WLAN 的步驟和方法,接下來就在 HDF WLAN 框架下盡情的開發和釋放熱情吧!

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WLAN
    +關注

    關注

    2

    文章

    657

    瀏覽量

    73085
  • 驅動
    +關注

    關注

    12

    文章

    1838

    瀏覽量

    85262
  • HarmonyOS
    +關注

    關注

    79

    文章

    1973

    瀏覽量

    30143

原文標題:OpenHarmony HDF WLAN驅動分析與使用

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    計算機系統的硬件組成和主要部件

    計算機系統的硬件組成是計算機運行的基礎,它包含了多個關鍵部件,這些部件相互協作,共同實現計算機的各種功能
    的頭像 發表于 09-10 11:41 ?2209次閱讀

    集成運放電路的組成各部分的作用是什么

    等領域。集成運放電路的組成各部分的作用是理解其工作原理和應用的關鍵。 集成運放電路的組成 輸入級 :通常由差分放大器構成,用于接收輸入信號并提供高輸入阻抗。 中間級 :可以是共源放大器、共柵放大器或共基放大器,用于提供增益。
    的頭像 發表于 09-03 09:22 ?976次閱讀

    LED顯示屏各大組成部件及安裝要點

    、電源、控制卡、連線 單元板背面、單元板正面、開關電源和LED條屏控制卡。下面我們分別來看看各個組成部分及其安裝要點: 1. 單元板 單元板是LED的顯示核心部件之一,單元板的好壞,直接影響到顯示效果的。單元板由LED模塊,驅動
    的頭像 發表于 07-29 09:33 ?532次閱讀

    功率驅動裝置的組成部件

    功率驅動裝置是一種將電能轉換為機械能的設備,廣泛應用于工業、交通、醫療等領域。以下是功率驅動裝置的主要組成部件及其功能: 電源模塊:電源模塊
    的頭像 發表于 07-17 15:17 ?350次閱讀

    伺服壓機各部功能介紹

    伺服壓機是一種高效、節能、精密的壓裝設備,廣泛應用于汽車、電子、航空、航天、機械制造等行業。本文將介紹伺服壓機的各部功能。 一、伺服壓機概述 伺服壓機是一種采用伺服電機作為動力源的壓裝設備。與傳統
    的頭像 發表于 07-13 10:07 ?894次閱讀

    cpu控制器和運算器組成部件有哪些

    CPU(中央處理器)是計算機的核心部件,負責執行程序指令和處理數據。CPU主要由控制器和運算器組成,這兩個部件共同完成計算機的運算任務。下面詳細介紹CPU控制器和運算器組成
    的頭像 發表于 06-30 11:01 ?1836次閱讀

    控制器的組成部件以及各部件功能

    控制器是計算機系統的核心部件之一,它負責協調和管理計算機系統中的各種硬件和軟件資源,以實現計算機系統的正常運行。控制器的組成部件各部件功能
    的頭像 發表于 06-30 10:05 ?2779次閱讀

    數控銑床由哪些部分組成的?各部分有什么關系

    數控銑床是一種高度自動化的機床,廣泛應用于機械加工、模具制造、航空航天等領域。它由多個部分組成各部分之間相互協作,共同完成加工任務。以下是對數控銑床各部分的詳細介紹: 床身:床身是數控銑
    的頭像 發表于 06-07 10:39 ?2148次閱讀

    數控銑床由哪些部分組成的?各部分的主要作用是什么?

    數控銑床是一種高精度、高效率的自動化機床,廣泛應用于機械加工領域。它由多個部分組成,每個部分都有其特定的功能和作用。以下是對數控銑床各部分的詳細介紹: 床身(Base) 床身是數控銑床的基礎部分
    的頭像 發表于 06-07 10:35 ?4460次閱讀

    村田電容各部件的功用解析

    村田電容代理-村田電容各部件的功用解析 說到貼片式電容,村田貼片式電容在領域內應當不以生疏,做為先前最高的處于被動元器件生產商,村田(murata)貼片式電容運用的十分普遍。與此同時貼片式電容作為
    的頭像 發表于 04-19 14:15 ?530次閱讀
    村田電容<b class='flag-5'>各部件</b>的功用解析

    鴻蒙實戰開發:【WLAN使用】

    在eTS中WLAN的基本使用,包括禁用和啟用WLANWLAN掃描和獲取掃描結果、WLAN狀態監聽、WiFi連接狀態監聽、獲取IP信息、獲取國家碼、判斷設備是否支持
    的頭像 發表于 03-07 15:36 ?589次閱讀
    鴻蒙實戰開發:【<b class='flag-5'>WLAN</b>使用】

    WLAN是什么網 wlan與wifi有什么區別

    WLAN是無線局域網(Wireless Local Area Network)的縮寫。它是一種將計算機設備和其他電子設備通過無線電波進行通信的技術。與傳統的有線局域網相比,WLAN能夠提供更高
    的頭像 發表于 01-22 14:48 ?6351次閱讀

    電流探頭校準裝置由哪些部件組成

    電流探頭校準裝置由哪些部件組成? 電流探頭校準裝置是一種用于校準電流探頭的設備,主要用于保證電流測量的準確性和可靠性。它由多個部件組成,每個部件
    的頭像 發表于 01-08 15:55 ?511次閱讀

    什么是WLAN直連?WLAN直連的優勢包括哪些?

    什么是WLAN直連?WLAN直連的優勢包括哪些?WLAN直連與藍牙技術相比? WLAN直連是指通過無線局域網技術(WLAN)直接連接兩臺或多
    的頭像 發表于 01-04 15:29 ?4531次閱讀

    什么是WLAN直連?常見的WLAN直連方式 WLAN直連的優勢包括哪些

    相互通信和共享資源,進一步擴展了無線網絡的功能和靈活性。 有多種常見的WLAN直連方式,包括點對點連接、Ad-hoc模式和Wi-Fi Direct。 1. 點對點連接(Point-to-Point):兩個設備通過WLAN直接連接
    的頭像 發表于 12-27 16:11 ?6908次閱讀
    主站蜘蛛池模板: 亚洲成人在线免费观看| 久久久91精品国产一区二区| a三级黄色片| 国产精品青青在线麻豆| 亚洲精品蜜桃AV久久久| 四房色播手机版| 日本无卡无吗在线| 秋霞在线观看视频一区二区三区| 欧美91精品久久久久网免费| 老熟风间由美AV在线一区二区| 久久精品国产亚洲AV未满十八 | 色欲精品国产AV久久久| 秋霞特色大片18岁入口| 強姧伦久久久久久久久| 青青草久久伊人| 肉肉描写很细致的黄文| 色婷婷狠狠97成为人免费| 少妇无码吹潮久久精品AV网站| 色综合久久久久久| 午夜DV内射一区区| 亚洲欧美精品无码大片在线观看| 亚洲 日韩 在线 国产 视频| 琪琪的色原网站| 日本性xxx| 午夜AV亚洲一码二中文字幕青青 | 美国ZOOM动物在线观看| 国产亚洲精品首页在线播放| 国产亚洲精品第一区香蕉| 韩国精品韩国专区久久| 国产精品JIZZ在线观看A片| 国产老肥熟xxxx| 姑娘视频日本在线播放| 国产AV视频一区二区蜜桃| 国产亚洲精品久久精品6| 久久草香蕉频线观| 末成年美女黄网站色大片连接| 全彩黄漫火影忍者纲手无遮挡 | 久久久乱码精品亚洲日韩| 奶大B紧17p| 色噜噜视频影院| 亚洲你我色|