精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐

開發 前端
OpenHarmony作為一個自主研發、全新技術生態的全領域下一代開源操作系統,提供了一套驅動框架來滿足此訴求。

[[433907]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

在IoT時代下,終端設備差異較大、形態各異、尺寸各異、交互方式各異,解決設備適配問題無疑是實現萬物互聯的一個關鍵。但是,在驅動框架的開發和部署過程中,由于終端設備對硬件的計算和存儲能力的需求不同、設備廠商提供的設備軟硬件操作接口不同、內核提供的操作接口不同,這就使得OEM廠商部署系統的時候需要投入大量的精力來適配和維護驅動代碼。

能否提供了一個跨芯片平臺、跨內核的驅動框架,使得設備驅動軟件可以在不同的設備上運行?OpenHarmony作為一個自主研發、全新技術生態的全領域下一代開源操作系統,提供了一套驅動框架來滿足此訴求。

下面我們將帶著大家解讀OpenHarmony驅動框架。

一、OpenHarmony驅動框架解讀

1. 設計目標

為解決在開發和部署過程中遇到的困難,OpenHarmony驅動框架設計目標如下:

  • 支持百K級~G級容量的設備部署,如手機、手環等
  • 提供統一硬件IO抽象,屏蔽SoC芯片差異,兼容不同內核,如Linux、LiteOS等。
  • 屏蔽驅動和系統組件間交互。可動態拆解,滿足不同容量設備的部署。
  • 面向不同容量的設備,提供統一的配置界面。

2. 設計思路

OpenHarmony驅動框架(下面簡稱為HDF)通過提供驅動與芯片平臺、內核解耦的底座,規范硬件驅動接口,實現驅動軟件在不同設備中部署。

HDF驅動框架架構如下圖所示。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖1 驅動架構

為了達成設計目標,OpenHarmony驅動框架采用如下核心設計思路:

(1)彈性化架構

  • 框架可動態伸縮: 通過對象管理器,多態加載不同容量設備實現方式,實現彈性伸縮部署。
  • 驅動可動態伸縮: 支持統一的設備驅動插件管理,實現設備驅動任意分層,積木式組合拼接

(2)組件化設備模型

  • 提供設備功能模型抽象,屏蔽設備驅動與系統交互的實現,為開發者提供統一的驅動開發接口
  • 提供主流IC的公版驅動能力,支持配置化部署

(3)歸一化平臺底座

  • 提供規范化的內核、SoC硬件IO適配接口,兼容不同內核、SoC芯片,對外開發規范化的平臺驅動接口

(4)統一配置界面

  • 構建全新的配置語言,面向不同容量的設備,提供統一配置界面,支持硬件資源配置和設備信息配置

3. 構建策略

面向Liteos的輕量級設備,主要基于HDF構建主流IC驅動,形成公版驅動和通用設備功能模型,支撐不同硬件芯片、不同內核(LiteOS-M/LiteOS-A)部署。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖2 輕量級設備部署模式

面向標準設備,除了支持內核態驅動,還支持用戶態驅動。用戶態驅動的重點在于構建設備抽象模型,為系統提供統一的設備接口,兼容Linux原生驅動和HDF驅動。內核態則使用Linux驅動與HDF驅動并存的策略,提供端到端的解決方案。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖3 標準設備部署模式

4. 現狀與演進

目前HDF驅動框架已經支持Liteos-m、Liteos-a、Linux內核,以及OpenHarmony輕量級、標準級上部署,并且在標準系統上同時支持內核態與用戶態部署。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖4 OpenHarmony驅動框架演進圖

經過開發者的不斷努力,OpenHarmony驅動框架正在不斷完善和增強,在OpenHarmony LTS3.0中,基礎框架新增了對熱插拔設備的管理以及HDI編譯工具hdi-gen,驅動模型部分新增了Audio、Camera、Senso、USB DDK等多個模塊的支持。

二、OpenHarmony驅動開發

OpenHarmony驅動為了避免與具體內核產生依賴,實現可遷移目標,開發時需要遵循以下約定:

系統相關接口使用HDF OSAL接口;

總線和硬件資源相關接口使用平臺驅動提供的相關接口。

基于HDF框架,驅動開發的通常流程包含驅動代碼的實現、編譯腳本、配置文件添加、以及用戶態程序和驅動交互的流程。下面將詳細介紹HDF驅動開發一般步驟。

1. 實現驅動代碼

在HDF驅動框架中,HdfDriverEntry對象被用來描述一個驅動實現。

  1. struct HdfDriverEntry { 
  2.     int32_t moduleVersion; 
  3.     const char *moduleName; 
  4.     int32_t (*Bind)(struct HdfDeviceObject *deviceObject); 
  5.     int32_t (*Init)(struct HdfDeviceObject *deviceObject); 
  6.     void (*Release)(struct HdfDeviceObject *deviceObject); 
  7. }; 

編寫一個簡單的驅動,首先需要實現驅動程序(Driver Entry)入口中的三個主要接口:

  • Bind接口: 實現驅動接口實例化綁定,如果需要發布驅動接口,會在驅動加載過程中被調用,實例化該接口的驅動服務并和DeviceObject綁定。當用戶態發起調用時,Bind中綁定的服務對象的Dispatch方法將被回調,在該方法中處理用戶態調用的消息。
  • Init接口: 實現驅動或者硬件的初始化,返回錯誤將中止驅動加載流程。
  • Release接口: 實現驅動的卸載,在該接口中釋放驅動實例的軟硬件資源。

一個基于HDF框架編寫的簡單驅動代碼如下,其功能是用戶態消息回環,即驅動收到用戶態發送的消息后將相同內容的消息再發送給用戶態:

  1. #include "hdf_base.h" 
  2. #include "hdf_device_desc.h" 
  3. #include "hdf_log.h" 
  4. #define HDF_LOG_TAG "sample_driver" 
  5. #define SAMPLE_WRITE_READ 0xFF00 
  6. static int EchoString(struct HdfDeviceObject *deviceObject, struct HdfSBuf *data, struct HdfSBuf *reply) 
  7.     const char *readData = HdfSbufReadString(data); 
  8.     if (readData == NULL) { 
  9.         HDF_LOGE("%s: failed to read data", __func__); 
  10.         return HDF_ERR_INVALID_PARAM; 
  11.     } 
  12.     if (!HdfSbufWriteInt32(reply, INT32_MAX)) { 
  13.         HDF_LOGE("%s: failed to reply int32", __func__); 
  14.         return HDF_FAILURE; 
  15.     } 
  16.     return HdfDeviceSendEvent(deviceObject, id, data); // 發送事件到用戶態 
  17. int32_t HdfSampleDriverDispatch(struct HdfDeviceObject *deviceObject, int id, struct HdfSBuf *data, struct HdfSBuf *reply) 
  18.     const char *readData = NULL
  19.     int ret = HDF_SUCCESS; 
  20.     switch (id) { 
  21.         switch SAMPLE_WRITE_READ: 
  22.             ret = EchoString(deviceObject, data, reply); 
  23.             break; 
  24.         default
  25.             HDF_LOGE("%s: unsupported command"); 
  26.             ret = HDF_ERR_INVALID_PARAM; 
  27.     } 
  28.     return ret; 
  29. void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) 
  30.     // 在這里釋放驅動申請的軟硬件資源 
  31.     return
  32. int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) 
  33.     if (deviceObject == NULL) { 
  34.         return HDF_FAILURE 
  35.     } 
  36.     static struct IDeviceIoService testService = { 
  37.         .Dispatch = HdfSampleDriverDispatch, 
  38.     }; 
  39.     deviceObject->service = &testService; 
  40.     return HDF_SUCCESS; 
  41. int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) 
  42.     if (deviceObject == NULL) { 
  43.         HDF_LOGE("%s::ptr is null!", __func__); 
  44.         return HDF_FAILURE; 
  45.     } 
  46.     HDF_LOGE("Sample driver Init success"); 
  47.     return HDF_SUCCESS; 
  48. struct HdfDriverEntry g_sampleDriverEntry = { 
  49.     .moduleVersion = 1, 
  50.     .moduleName = "sample_driver"
  51.     .Bind = HdfSampleDriverBind, 
  52.     .Init = HdfSampleDriverInit, 
  53.     .Release = HdfSampleDriverRelease, 
  54. }; 
  55. HDF_INIT(g_sampleDriverEntry); 

2. 配置設備信息

在HDF框架的配置文件(例如vendor/hisilicon/xxx/config/device_info.hcs)中添加該驅動的配置信息,配置目錄與具體開發板關聯,如下所示:

  1. root { 
  2.     device_info { 
  3.         match_attr = "hdf_manager"
  4.         template host { 
  5.             hostName = ""
  6.             priority = 100; 
  7.             template device { 
  8.                 template deviceNode { 
  9.                     policy = 0; 
  10.                     priority = 100; 
  11.                     preload = 0; 
  12.                     permission = 0664; 
  13.                     moduleName = ""
  14.                     serviceName = ""
  15.                     deviceMatchAttr = ""
  16.                 } 
  17.             } 
  18.         } 
  19.        sample_host :: host{ 
  20.             hostName = "host0";    // host名稱,host節點是用來存放某一類驅動的容器 
  21.             priority = 100;        // host啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證host的加載順序 
  22.             device_sample :: device {        // sample設備節點 
  23.                 device0 :: deviceNode {      // sample驅動的DeviceNode節點 
  24.                     policy = 1;              // policy字段是驅動服務發布的策略,在驅動服務管理章節有詳細介紹 
  25.                     priority = 100;          // 驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序 
  26.                     preload = 0;             // 驅動加載策略,參考《5.2 HDF驅動框架章節》 
  27.                     permission = 0664;       // 驅動創建設備節點權限 
  28.                     moduleName = "sample_driver";   // 驅動名稱,該字段的值必須和驅動入口結構體的moduleName值一致 
  29.                     serviceName = "sample_service";    // 驅動對外發布服務的名稱,必須唯一 
  30.                     deviceMatchAttr = "sample_config"; // 驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等 
  31.                 } 
  32.             } 
  33.         } 
  34.     } 

定義設備列表時使用了HCS的模板語法,template host節點下的內容由HDF框架定義,新增host以及host中的device只需要繼承該模板并填充具體內容即可。

在配置中定義的device將在加載過程中產生一個設備實例,配置中通過moduleName字段指定設備對應的驅動名稱,從而將設備與驅動關聯起來。其中,設備與驅動可以是一對多的關系,即可以實現一個驅動支持多個同類型設備。

3. 用戶態程序與驅動交互

用戶態程序和驅動交互基于HDF IoService模型實現,該設計屏蔽了具體內核的差異,將驅動接口抽象為IoService對象,調用者基于名稱獲取該對象,并可以使用IoService系列接口進行接口調用和事件監聽。值得一提的是消息傳遞時使用了HDF Sbuf對象進行參數的序列化和反序列化,這樣可以避免不受控的內存訪問,也簡化了消息傳遞和分發過程中的內存所有權問題,有利于提升用戶態和內核態數據傳遞的安全性和便利性。HDF Sbuf相關接口可以參考HarmonyOS設備開發官網API Reference中頭文件hdf_sbuf.h部分。

基于HDF框架編寫的用戶態程序和驅動交互的代碼如下:

  1. #include "hdf_log.h" 
  2. #include "hdf_sbuf.h" 
  3. #include "hdf_io_service_if.h" 
  4. #define HDF_LOG_TAG "sample_test" 
  5. #define SAMPLE_SERVICE_NAME "sample_service" 
  6. #define SAMPLE_WRITE_READ 0xFF00 
  7. int g_replyFlag = 0; 
  8. static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) 
  9.     const char *string = HdfSbufReadString(data); 
  10.     int ret = HDF_SUCCESS; 
  11.     if (string == NULL) { 
  12.         HDF_LOGE("failed to read string in event data"); 
  13.         ret = HDF_FAILURE; 
  14.     } else { 
  15.         HDF_LOGE("%s", string); 
  16.     } 
  17.     g_replyFlag = 1; 
  18.     return ret; 
  19. static int SendEvent(struct HdfIoService *serv, char *eventData) 
  20.     int ret = 0; 
  21.     struct HdfSBuf *data = HdfSBufObtainDefaultSize(); // 申請需要發送的序列化對象 
  22.     if (data == NULL) { 
  23.         HDF_LOGE("failed to obtain sbuf data"); 
  24.         return 1; 
  25.     } 
  26.     struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); // 申請返回數據的序列化對象 
  27.     if (reply == NULL) { 
  28.         HDF_LOGE("failed to obtain sbuf reply"); 
  29.         ret = HDF_DEV_ERR_NO_MEMORY; 
  30.         goto out
  31.     } 
  32.     if (!HdfSbufWriteString(data, eventData)) { // 準備消息內容 
  33.         HDF_LOGE("failed to write sbuf"); 
  34.         ret = HDF_FAILURE; 
  35.         goto out
  36.     } 
  37.     ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply); // 發起接口調用 
  38.     if (ret != HDF_SUCCESS) { 
  39.         HDF_LOGE("failed to send service call"); 
  40.         goto out
  41.     } 
  42.     int replyData = 0; 
  43.     if (!HdfSbufReadInt32(reply, &replyData)) { // 反序列化返回數據 
  44.         HDF_LOGE("failed to get service call reply"); 
  45.         ret = HDF_ERR_INVALID_OBJECT; 
  46.         goto out
  47.     } 
  48.     HDF_LOGE("Get reply is: %d", replyData); 
  49. out
  50.     HdfSBufRecycle(data); 
  51.     HdfSBufRecycle(reply); 
  52.     return ret; 
  53. int main() 
  54.     struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME); // 通過名稱獲取IoService對象,與驅動配置中的名稱一致 
  55.     if (serv == NULL) { 
  56.         HDF_LOGE("failed to get service %s", SAMPLE_SERVICE_NAME); 
  57.         return HDF_FAILURE; 
  58.     } 
  59.     static struct HdfDevEventlistener listener = { // 構造驅動事件監聽器對象 
  60.         .callBack = OnDevEventReceived, // 填充事件處理方法 
  61.         .priv = NULL
  62.     }; 
  63.     if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS) {  // 注冊事件監聽 
  64.         HDF_LOGE("failed to register event listener"); 
  65.         return HDF_FAILURE; 
  66.     } 
  67.     if (SendEvent(serv, "Hello World, HDF Driver!")) { // 調用驅動接口,樣例驅動收到事件 
  68.         HDF_LOGE("failed to send event"); 
  69.         return HDF_FAILURE; 
  70.     } 
  71.     while (g_replyFlag == 0) { // 等待驅動上報事件 
  72.         sleep(1); 
  73.     } 
  74.     HdfDeviceUnregisterEventListener(serv, &listener)); // 去注冊事件監聽器 
  75.     HdfIoServiceRecycle(serv); // 回收IoService對象 
  76.     return 0; 

該示例執行后會在終端中打印出"Hello World, HDF Driver!"字符串,表明我們的用戶態測試程序和驅動成功地進行了一次交互。

三、使用DevEco Device Tool進行驅動開發

上一小節介紹了OpenHarmony驅動的一般開發方法,那么有沒有更簡單的方法添加一款驅動呢?答案就是華為南向開發IDE——DevEco Device Tool。DevEco Device Tool最新版本已經集成了HDF驅動開發功能,下面介紹如何使用DevEco Device Tool進行驅動開發。

DevEco Device Tool下載鏈接:

https://device.harmonyos.com/cn/develop/ide#download_release。

1. 創建驅動

(1)導入工程

參考DevEco Device Tool手冊,通過npm或網絡下載的方式導入OHOS工程。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖5 DevEco Device Tool啟動界面

(2)使用HDF頁面工具創建新驅動,按照需求填寫Module名稱,工具將根據Module名稱創建對應驅動代碼與。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖6 Device Eco Tool HDF插件界面

DevEco Device Tool將自動生成驅動實現代碼:

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖7 Device Eco Tool 生成驅動代碼

為源碼文件自動生成編譯腳本:

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖8 Device Eco Tool 生成驅動編譯腳本

DevEco Device Tool還會在對應單板的驅動配置中生成驅動設備配置信息:

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖9 Device Eco Tool 生成驅動配置信息

2. 修改驅動

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖10 Device Eco Tool驅動快速編輯界面

DevEco Device Tool提供了快捷方式直達源碼、編譯腳本、配置文件,點擊鏈接修改相關文件,實現驅動功能。DevEco Device Tool自動生成代碼已經提供了DriverEntry的基礎實現,只需填充對應函數的實際功能即可。

3. 編譯版本

使用DevEco Device Tool build功能一鍵編譯版本,編譯輸出顯示在終端窗口:

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖11 Device Eco Tool編譯界面

4. 燒錄驗證

DevEco Device Tool提供了一站式的燒錄、調試環境。使用upload功能將編譯好的鏡像燒錄進開發板。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖12 Device Eco Tool燒寫功能界面

燒錄過程和進度顯示在終端窗口。

HDC2021技術分論壇:OpenHarmony驅動框架解讀和開發實踐-鴻蒙HarmonyOS技術社區

圖13 Device Eco Tool燒寫輸出

四、總結

除了在此次HDC大會與大家分享驅動框架的設計和最新進展,開放原子基金會還在OpenHarmony公眾號、gitee社區等渠道發布了一系列技術分享、指導文檔等資料,歡迎大家關注并一起建設OpenHarmony驅動生態。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-11-03 17:08:22

鴻蒙HarmonyOS應用

2021-11-26 10:05:06

鴻蒙HarmonyOS應用

2021-10-28 14:53:27

鴻蒙HarmonyOS應用

2021-10-29 10:14:42

鴻蒙HarmonyOS應用

2021-11-02 14:52:17

鴻蒙HarmonyOS應用

2021-10-29 15:34:45

鴻蒙HarmonyOS應用

2021-11-03 17:03:31

鴻蒙HarmonyOS應用

2021-11-08 10:20:48

鴻蒙HarmonyOS應用

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2021-10-28 10:11:17

鴻蒙HarmonyOS應用

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2021-11-15 10:15:37

鴻蒙HarmonyOS應用

2022-04-21 11:26:31

鴻蒙操作系統

2016-01-21 17:47:24

AWS技術峰會AWS Summit2

2023-03-08 15:55:53

Linux驅動鴻蒙
點贊
收藏

51CTO技術棧公眾號

黄视频网站免费看| 日本美女久久久| 欧美大片aaa| 石原莉奈一区二区三区在线观看| 国产一区二区动漫| 中文字幕丰满乱码| 欧美人与禽猛交乱配| 91在线视频观看| 国产精品亚洲欧美导航| 欧美性生交大片| 国产成人在线中文字幕| 色综合久久88色综合天天6| 天堂精品视频| 成人免费公开视频| 国产免费成人| 久久精品中文字幕| 538国产视频| 国产亚洲精彩久久| 亚洲国产一区二区在线播放| 欧美日韩在线高清| 亚洲av无码片一区二区三区 | 久久草av在线| 久久久久久国产精品| 韩国女同性做爰三级| 亚洲1区在线| 91黄色免费版| 被灌满精子的波多野结衣| 国产一二三区在线| 国产91丝袜在线播放0| 国产精品电影一区| 精品视频久久久久| 四季av在线一区二区三区| 日韩成人在线视频网站| www.日本久久| 久久精品女人天堂av免费观看 | gogo久久| 最新久久zyz资源站| 欧美污视频久久久| 污污视频在线免费看| 国产一区二区网址| 国产精品久久一| 中文字幕亚洲精品一区| 欧美视频福利| 久久影视免费观看| 亚洲一区 欧美| 天堂99x99es久久精品免费| 日韩欧美中文字幕制服| 尤物国产在线观看| 精品视频一区二区三区四区五区| 亚洲国产日韩一级| 男女爱爱视频网站| 番号集在线观看| 99久免费精品视频在线观看| 成人精品水蜜桃| 国产v在线观看| 国产一区二区精品久久91| 国产美女扒开尿口久久久| 免费视频网站在线观看入口| 亚洲欧美日韩国产综合精品二区 | 久久国产美女视频| 91精品国产麻豆国产在线观看| 中文字幕成人在线| 亚洲ⅴ国产v天堂a无码二区| 国产亚洲欧美日韩在线观看一区二区 | 国产精品99久久久久久宅男| 成人免费视频网址| 国产精品久久久久久免费播放| 青椒成人免费视频| 国产精品入口夜色视频大尺度| 黄色av一级片| 石原莉奈在线亚洲二区| 国产精品www色诱视频| 中文字幕乱码一区二区| 免费视频一区二区| 成人免费在线视频网站| 99久久精品日本一区二区免费| 国产一区视频在线看| 亚洲xxxx做受欧美| 日韩在线视频观看免费| av一区二区三区四区| 久久久久久a亚洲欧洲aⅴ| 嫩草研究院在线| 国产精品卡一卡二| 特级西西人体www高清大胆| 羞羞的视频在线观看| 亚洲国产精品久久人人爱蜜臀| 人妻av中文系列| 日韩毛片免费观看| 欧美日韩成人综合| 日本精品一二三区| 美女久久久久| 久久久久北条麻妃免费看| 澳门黄色一级片| 99精品国产福利在线观看免费| 清纯唯美日韩制服另类| 国产露脸91国语对白| 成人免费三级在线| 日本高清一区| 天堂资源在线中文| 国产精品福利一区| 青青青青在线视频| 男插女视频久久久| 精品久久久久久中文字幕一区奶水| 欧美 国产 综合| 快播电影网址老女人久久| 欧美三级电影在线观看| 日本一二三四区视频| 97se亚洲| 亚洲欧洲免费视频| 一区二区三区四区免费| 先锋资源久久| 久久久爽爽爽美女图片| 一级片在线观看免费| 精品一区二区三区不卡| 国产一区二区三区黄| 天堂中文在线视频| 国产精品久久二区二区| 久久精品无码中文字幕| 日本一区免费网站| 精品日韩在线观看| 亚洲日本精品视频| 伊人色**天天综合婷婷| 欧美亚洲另类在线| 国产乱淫a∨片免费观看| 丁香桃色午夜亚洲一区二区三区| 热re99久久精品国99热蜜月| 久久综合之合合综合久久| 无码av免费一区二区三区试看 | 一区二区伦理片| 综合日韩在线| 国产精品99久久久久久www| 国产高清在线免费| 中文字幕+乱码+中文字幕一区| 九九久久九九久久| 日韩高清在线| 亚洲丁香婷深爱综合| 99成人在线观看| 亚洲欧美日本日韩| 俄罗斯精品一区二区| av资源网在线观看| 欧美视频在线观看免费| 艳妇乳肉亭妇荡乳av| 一级欧洲+日本+国产| 国产成人精品综合久久久| 亚洲国产www| 中文字幕亚洲成人| 亚洲成人av免费看| 久久av中文| 九九热在线精品视频| 国产毛片久久久久| 国产欧美一区二区在线| 日本在线xxx| 视频国产精品| 精品国产一区久久久| 波多野结衣爱爱| 91网址在线看| 日韩视频在线视频| 亚洲精品在线a| 欧美成人亚洲成人| 一区二区三区黄色片| 国产偷国产偷亚洲高清人白洁| 日本丰满少妇xxxx| 高清一区二区三区| 久久91精品国产| 国产乱淫a∨片免费观看| 久久久天堂av| 国产一区二区视频免费在线观看 | 欧美日韩综合不卡| 亚洲av无码国产精品麻豆天美| 国产视频一区在线观看一区免费| 亚洲一区二区免费| 亚洲男同gay网站| 日韩一区二区免费在线观看| 九九热视频在线免费观看| 精品一区二区三区在线播放 | 99久久精品网站| 国产美女精彩久久| 久草中文在线| 日韩一卡二卡三卡国产欧美| 久久久国产一级片| 国产在线精品一区二区三区不卡| 尤物一区二区三区| 精品一区二区三区免费看| 久热爱精品视频线路一| 99热在线只有精品| 亚洲一区二区三区影院| 精品久久久久一区二区| 亚洲无线视频| 久久久久成人精品免费播放动漫| 国模套图日韩精品一区二区| 国产小视频国产精品| 亚洲熟妇无码久久精品| 亚洲欧美另类小说视频| 国内自拍偷拍视频| 色狮一区二区三区四区视频| 国产精品女视频| 久久亚洲天堂| 精品福利av导航| 日本一区二区欧美| 久久精品人人爽人人爽| 最新av免费在线观看| 韩日精品视频| 国产青春久久久国产毛片| 国产精品字幕| 欧美成人免费观看| 人妻无码一区二区三区久久99| 欧美日韩亚洲高清| 亚洲女同二女同志奶水| 成人小视频免费在线观看| 日本少妇高潮喷水视频| 国产精品成久久久久| 国产精品二区三区四区| 欧美极品免费| 美女福利精品视频| 久久久久久久影视| 日韩一卡二卡三卡| 国产成人无码精品久在线观看| 中国色在线观看另类| 无套内谢丰满少妇中文字幕| 亚洲免费在线| 在线观看日本一区| 亚洲男人都懂第一日本| 亚洲bt天天射| 丁香六月综合| 国模私拍视频一区| 日本www在线观看视频| 亚洲第一精品夜夜躁人人爽| 伊人久久国产精品| 精品福利在线观看| 日韩一区二区不卡视频| 2023国产精品| 国产5g成人5g天天爽| 爽好多水快深点欧美视频| 成人国产在线看| 日韩欧美精品综合| 精品中文字幕一区| 日本久久久久| 国产九九精品视频| 亚洲优女在线| 欧美极度另类性三渗透| av电影在线网| 亚洲欧美三级伦理| 免费观看的毛片| 日韩精品一区二区三区三区免费| 中文字幕在线观看视频一区| 精品久久久久久久久久久久久久| 午夜免费激情视频| 国产精品二三区| www..com.cn蕾丝视频在线观看免费版| 国产成人自拍高清视频在线免费播放| 久久6免费视频| 免费高清成人在线| 国产激情在线观看视频| 亚洲深夜福利| 欧美不卡在线播放| 亚洲国产黄色| 女性女同性aⅴ免费观女性恋| 午夜影院欧美| 欧美精品久久96人妻无码| 久久亚洲精品中文字幕蜜潮电影| 青青草原成人| 国产在视频线精品视频www666| 另类欧美小说| 人人精品亚洲| 成人片在线免费看| 欧美系列精品| 91精品久久久久久久久青青| 国产原创一区| 国产精品一区久久久| 国产一区精品福利| 成人免费直播live| 国产精品x8x8一区二区| 国产精品一区二区av| 超碰精品在线观看| 国产伦精品一区二区三区免 | 全色精品综合影院| 亚洲图片制服诱惑| 成人高清免费观看mv| 色噜噜久久综合伊人一本| 1pondo在线播放免费| 日韩最新在线视频| 国产原创av在线| 不卡av在线播放| 波多一区二区| 欧洲亚洲免费在线| 久久久成人av毛片免费观看| 国产精品美女久久久久av超清| 日韩精品影院| 97人人模人人爽人人喊38tv| 国产伦精品一区二区三区免费优势| 国产精品推荐精品| 九一精品国产| 亚洲一区三区视频在线观看| 欧美猛男同性videos| 国产又爽又黄ai换脸| 欧美日韩亚洲一区在线观看| 老太脱裤子让老头玩xxxxx| 欧美综合国产| 色婷婷成人在线| 成人免费毛片片v| 欧美黄色激情视频| 亚洲老妇xxxxxx| 日韩 欧美 综合| 欧美丝袜自拍制服另类| 中文字幕一区二区三区波野结| 精品日韩一区二区| 国产视频网站在线| 欧美高清激情视频| 久久精品女人天堂av免费观看| 91精品视频播放| 九热爱视频精品视频| 91精品国产毛片武则天| 夜夜嗨一区二区三区| 久久国产激情视频| 97久久精品人人爽人人爽蜜臀| 看免费黄色录像| 色久综合一二码| www.蜜臀av.com| 亚洲香蕉成视频在线观看| 性欧美ⅴideo另类hd| 538国产精品一区二区免费视频| 热久久久久久| 久久久精品国产一区二区三区| 国产精品99在线观看| 日本黄网站免费| 国产精品888| 娇妻被老王脔到高潮失禁视频| 亚洲大片精品永久免费| 亚洲系列第一页| 国产丝袜一区二区三区免费视频| 午夜羞羞小视频在线观看| 国产精品视频一| 羞羞答答一区二区| 肉大捧一出免费观看网站在线播放| 日本免费新一区视频| 瑟瑟视频在线观看| 亚洲国产日韩a在线播放性色| 国产一区二区小视频| 国产亚洲精品美女| 大桥未久在线视频| 国产精品乱码视频| 在线成人直播| 国产九九在线观看| 国产视频一区在线观看| 亚洲 欧美 日韩 综合| 亚洲国产精品va在线观看黑人| 黄色精品在线观看| 国产精品爽黄69天堂a| 深夜福利久久| 成人短视频在线观看免费| 国产精品中文有码| frxxee中国xxx麻豆hd| 欧美性高清videossexo| 国内av一区二区三区| 国产91精品青草社区| 色综合www| 免费看又黄又无码的网站| 成人永久aaa| 久草资源在线视频| 日韩一区二区在线观看| 国产盗摄在线观看| 91最新国产视频| 欧美在线精品一区| 在线能看的av网站| 亚洲免费高清视频在线| av av片在线看| 欧美精品在线视频观看| 中文一区二区三区四区| 国产美女在线一区| 972aa.com艺术欧美| 综合激情网五月| 亚洲视频免费一区| 久久青青视频| 在线电影看在线一区二区三区| 激情文学综合丁香| www欧美com| 精品久久久三级丝袜| 中文不卡1区2区3区| 欧美一级日本a级v片| 日韩精品三区四区| 中文字幕有码在线播放| 欧美日韩高清不卡| av福利在线导航| 极品尤物一区二区三区| 久久精品中文| 手机av在线不卡| 欧美一级久久久| a毛片不卡免费看片| 欧美大香线蕉线伊人久久国产精品| 日韩国产精品久久久久久亚洲| 久久久久无码精品国产sm果冻| 91.麻豆视频| 91豆花视频在线播放| 欧美日韩系列| 久久精品国产精品亚洲综合| 久草成人在线视频| 亚洲精品综合久久中文字幕| 亚洲天堂1区| 国产精品88久久久久久妇女 | 黄色a一级视频|