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

HDF驅動框架探路(三):基于3516配置一套可以打通的HDF驅動程序

開發 前端
本文的就是著重解決這個問題,也就是自己去配置一個HDF驅動模塊。本文是基于3516的小型系統去驗證的。

[[437608]]

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

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

https://harmonyos.51cto.com

老規矩還是將最終希望跑出來的效果放出來。如下:

HDF驅動框架探路(三):基于3516配置一套可以打通的HDF驅動程序-鴻蒙HarmonyOS技術社區

前言

大家如果有讀過第二篇文章的話,可能發現了在該文中內核態的驅動程序是直接引用了源碼中已經存在的一個HDF驅動模塊。所以本文的就是著重解決這個問題,也就是自己去配置一個HDF驅動模塊。

本文是基于3516的小型系統去驗證的。

本文框架圖

HDF驅動框架探路(三):基于3516配置一套可以打通的HDF驅動程序-鴻蒙HarmonyOS技術社區

觀察上圖,其實本文是將上文的流程進一步細化,上文中的驅動程序細分成了三個部分,分別是:HCS文件配置、內核態代碼、liteos_a配置編譯進內核。這三個部分合起來就是自己搭建HDF驅動程序的步驟。

1. HDF配置

這里的HDF配置是按照源碼中已經存在的sample_driver模塊來的

打開文件vendor/hisilicon/hispark_taurus/hdf_config/hdf_test/hdf_test_manager/device_info.hcs,然后加入下述代碼中的device2。

  1. device1 :: deviceNode { 
  2.                 policy = 2; 
  3.                 priority = 10; 
  4.                 preload = 0; 
  5.                 permission = 0644; 
  6.                 moduleName = "sample_driver"
  7.                 serviceName = "sample_service"
  8.             } 
  9.             device2 :: deviceNode {             // DeviceNode of the sample driver 
  10.           policy = 2;                     // Driver service release policy. For details, see section Driver Service Management. 
  11.           priority= 10;                  // Driver startup priority (0-200). A larger value indicates a lower priority. The default value 100 is recommended. If the priorities are the same, the device loading sequence is random. 
  12.           preload = 0;                    // On-demand loading of the driver. For details, see "NOTE" at the end of this section
  13.           permission = 0664;              // Permission for the driver to create device nodes. 
  14.           moduleName = "talkweb_driver";       // Driver name. The value of this field must be the same as the value of moduleName in the driver entry structure. 
  15.           serviceName = "talkweb_service";     // Name of the service released by the driver. The name must be unique
  16.       } 
  17.         } 
  18.         device_platform_test :: device { 
  19.             platform_test:: deviceNode { 
  20.                 policy = 1; 
  21.                 priority = 150; 
  22.                 preload = 0; 
  23.                 permission = 0644; 
  24.                 moduleName = "PLATFORM_TEST_DRIVER"
  25.                 serviceName = "PLATFORM_TEST"
  26.                 deviceMatchAttr = "platform_test"
  27.             } 
  28.         } 

2. liteos_a編譯配置

該步驟的作用是將第三步中的驅動程序編譯進入內核。

2.1 在BUILD.gn文件中配置

打開drivers/adapter/khdf/liteos/test/BUILD.gn文件

  1. --- a/khdf/liteos/test/BUILD.gn 
  2. +++ b/khdf/liteos/test/BUILD.gn 
  3. @@ -37,6 +37,7 @@ hdf_driver(module_name) { 
  4.    sources = [ 
  5.      "$HDF_TEST_FRAMWORK_ROOT/common/hdf_main_test.c"
  6.      "$HDF_TEST_FRAMWORK_ROOT/manager/sample_driver_test.c"
  7. +    "$HDF_TEST_FRAMWORK_ROOT/talkwebtest/talkweb.c"
  8.      "$HDF_TEST_FRAMWORK_ROOT/osal/osal_all_test.c"
  9.      "$HDF_TEST_FRAMWORK_ROOT/osal/osal_file_test.c"
  10.      "$HDF_TEST_FRAMWORK_ROOT/osal/osal_get_case_test.c"

2.2 在Makefile中進行添加配置

drivers/adapter/khdf/liteos/test/Makefile

  1. --- a/khdf/liteos/test/Makefile 
  2. +++ b/khdf/liteos/test/Makefile 
  3. @@ -34,6 +34,7 @@ HDF_TEST_FRAMWORK_ROOT = $(LITEOSTOPDIR)/../../drivers/framework/test/unittest 
  4.   
  5.  LOCAL_SRCS := $(HDF_TEST_FRAMWORK_ROOT)/common/hdf_main_test.c \ 
  6.                $(HDF_TEST_FRAMWORK_ROOT)/manager/sample_driver_test.c \ 
  7. +              $(HDF_TEST_FRAMWORK_ROOT)/talkwebtest/talkweb.c \ 
  8.                $(HDF_TEST_FRAMWORK_ROOT)/osal/osal_test_entry.c \ 
  9.                $(HDF_TEST_FRAMWORK_ROOT)/osal/osal_all_test.c \ 
  10.                $(HDF_TEST_FRAMWORK_ROOT)/osal/osal_file_test.c \ 

3. 驅動程序

進入drivers/framework/test/unittest目錄下,新建talkwebtest目錄

3.1 在上述目錄下新建talkweb.h文件,將下述代碼放入

  1. #ifndef HDF_SAMPLE_DRIVER_H 
  2. #define HDF_SAMPLE_DRIVER_H 
  3.  
  4. #include "hdf_object.h" 
  5.  
  6. #define SAMPLE_SERVICE "sample_service" 
  7.  
  8. typedef enum { 
  9.     SAMPLE_DRIVER_REGISTER_DEVICE = 0, 
  10.     SAMPLE_DRIVER_UNREGISTER_DEVICE, 
  11.     SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE, 
  12.     SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE, 
  13.     SAMPLE_DRIVER_PM_STATE_INJECT, 
  14. } SAMPLE_DRIVER_CMDID; 
  15.  
  16. struct HdfDeviceObject *GetDeviceObject(void); 
  17.  
  18. #endif // HDF_MAIN_TEST_H 

3.2 在上述目錄下新建talkweb.c文件,將下述代碼放入

  1. /* 
  2.  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 
  3.  * 
  4.  * HDF is dual licensed: you can use it either under the terms of 
  5.  * the GPL, or the BSD license, at your option
  6.  * See the LICENSE file in the root of this repository for complete details. 
  7.  */ 
  8. #include "talkweb.h" 
  9. #include "devsvc_manager_clnt.h" 
  10. #include "devmgr_service.h" 
  11. #include "hdf_log.h" 
  12. #include "hdf_device_desc.h" 
  13. #include "hdf_pm.h" 
  14.  
  15. #include "device_resource_if.h" 
  16. #include "osal_io.h" 
  17. #include "osal_mem.h" 
  18. #include "gpio_if.h" 
  19. #include "osal_irq.h" 
  20. #include "osal_time.h"  
  21. //#define HDF_LOG_TAG led_driver // 打印日志所包含的標簽,如果不定義則用默認>    定義的HDF_TAG標簽 
  22. #define LED_WRITE_READ 88   
  23.  
  24. #define HDF_LOG_TAG sample_driver_test 
  25.  
  26. #ifndef INT32_MAX 
  27. #define INT32_MAX 0x7fffffff 
  28. #endif 
  29.  
  30. void HdftalkwebDriverRelease(struct HdfDeviceObject *deviceObject) 
  31.     (void)deviceObject; 
  32.     return
  33.  
  34. int32_t talkwebDriverRegisterDevice(struct HdfSBuf *data) 
  35.     const char *moduleName = NULL
  36.     const char *serviceName = NULL
  37.     struct HdfDeviceObject *devObj = NULL
  38.     if (data == NULL) { 
  39.         return HDF_FAILURE; 
  40.     } 
  41.  
  42.     moduleName = HdfSbufReadString(data); 
  43.     if (moduleName == NULL) { 
  44.         return HDF_FAILURE; 
  45.     } 
  46.     serviceName = HdfSbufReadString(data); 
  47.     if (serviceName == NULL) { 
  48.         return HDF_FAILURE; 
  49.     } 
  50.  
  51.     devObj = HdfRegisterDevice(moduleName, serviceName, NULL); 
  52.     if (devObj == NULL) { 
  53.         return HDF_FAILURE; 
  54.     } 
  55.     return HDF_SUCCESS; 
  56.  
  57. int32_t talkwebDriverUnregisterDevice(struct HdfSBuf *data) 
  58.     const char *moduleName = NULL
  59.     const char *serviceName = NULL
  60.     if (data == NULL) { 
  61.         return HDF_FAILURE; 
  62.     } 
  63.  
  64.     moduleName = HdfSbufReadString(data); 
  65.     if (moduleName == NULL) { 
  66.         return HDF_FAILURE; 
  67.     } 
  68.     serviceName = HdfSbufReadString(data); 
  69.     if (serviceName == NULL) { 
  70.         return HDF_FAILURE; 
  71.     } 
  72.     HdfUnregisterDevice(moduleName, serviceName); 
  73.     return HDF_SUCCESS; 
  74.  
  75. int32_t talkwebDriverSendEvent(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, bool broadcast) 
  76.     return broadcast ? HdfDeviceSendEvent(client->device, id, data) : HdfDeviceSendEventToClient(client, id, data); 
  77.  
  78. int32_t talkwebDriverPowerStateInject(uint32_t powerState) 
  79.     int ret; 
  80.     struct IDevmgrService *devmgrService = DevmgrServiceGetInstance(); 
  81.     if (devmgrService == NULL || devmgrService->PowerStateChange == NULL) { 
  82.         return HDF_ERR_INVALID_OBJECT; 
  83.     } 
  84.     ret = devmgrService->PowerStateChange(devmgrService, powerState); 
  85.  
  86.     HDF_LOGI("%s: inject power state(%d) done, ret = %d", __func__, powerState, ret); 
  87.     return ret; 
  88.  
  89.   
  90. static int32_t CtlLED(int mode) 
  91.     int32_t ret; 
  92.     uint16_t valRead; 
  93.     /* LED的GPIO管腳號 */ 
  94.     uint16_t gpio = 5 * 8 + 1;  // 紅外補光燈 
  95.     // uint16_t gpio = 2 * 8 + 3;  // 綠色指示燈 
  96.     // uint16_t gpio = 3 * 8 + 4;  // 紅色指示燈 
  97.   
  98.     /* 將GPIO管腳配置為輸出 */ 
  99.     ret = GpioSetDir(gpio, GPIO_DIR_OUT); 
  100.     if (ret != 0) 
  101.     {    
  102.         HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); 
  103.         return ret; 
  104.     }    
  105.   
  106.     if (mode == -1)  
  107.     {    
  108.         // 翻轉輸出口 
  109.         (void)GpioRead(gpio, &valRead); 
  110.         ret = GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW); 
  111.     }    
  112.     else 
  113.     {    
  114.         ret = GpioWrite(gpio, mode); 
  115.     }    
  116.   
  117.     if (ret != 0) 
  118.     {    
  119.         HDF_LOGE("GpioWrite: failed, ret %d\n", ret); 
  120.         return ret; 
  121.     }    
  122.     return ret; 
  123.  
  124.  
  125. int32_t talkwebDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) 
  126.         HDF_LOGD("%s::qzk-enter", __func__); 
  127.     uint32_t powerState = 0; 
  128.     int32_t ret = HDF_SUCCESS; 
  129.     if (reply == NULL || client == NULL) { 
  130.         return HDF_FAILURE; 
  131.     } 
  132.     int32_t result = HDF_FAILURE; 
  133.     switch (cmdId) { 
  134.         case LED_WRITE_READ: 
  135.             const char *recv = HdfSbufReadString(data); 
  136.             if (recv != NULL
  137.             { 
  138.                 //HDF_LOGI("recv: %s", recv); 
  139.                 result = CtlLED(-1); 
  140.                 // CtlLED(GPIO_VAL_HIGH); 
  141.                 if (!HdfSbufWriteInt32(reply, result)){ 
  142.                     //HDF_LOGE("replay is fail"); 
  143.                 } 
  144.                 return HdfDeviceSendEvent(client->device, cmdId, data); 
  145.             } 
  146.             break; 
  147.         case SAMPLE_DRIVER_REGISTER_DEVICE: { 
  148.             ret = talkwebDriverRegisterDevice(data); 
  149.             HdfSbufWriteInt32(reply, ret); 
  150.             break; 
  151.         } 
  152.         case SAMPLE_DRIVER_UNREGISTER_DEVICE: 
  153.             ret = talkwebDriverUnregisterDevice(data); 
  154.             HdfSbufWriteInt32(reply, ret); 
  155.             break; 
  156.         case SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE: 
  157.             ret =  talkwebDriverSendEvent(client, cmdId, data, false); 
  158.             HdfSbufWriteInt32(reply, INT32_MAX); 
  159.             break; 
  160.         case SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE: 
  161.             ret = talkwebDriverSendEvent(client, cmdId, data, true); 
  162.             HdfSbufWriteInt32(reply, INT32_MAX); 
  163.             break; 
  164.         case SAMPLE_DRIVER_PM_STATE_INJECT: 
  165.             HdfSbufReadUint32(data, &powerState); 
  166.             return talkwebDriverPowerStateInject(powerState); 
  167.         default
  168.             break; 
  169.     } 
  170.  
  171.     return ret; 
  172.  
  173. int HdftalkwebDriverBind(struct HdfDeviceObject *deviceObject) 
  174.     static struct IDeviceIoService testService = { 
  175.         .Dispatch = talkwebDriverDispatch, 
  176.         .Open = NULL
  177.         .Release = NULL
  178.     }; 
  179.     HDF_LOGD("%s::enter", __func__); 
  180.     if (deviceObject == NULL) { 
  181.         return HDF_FAILURE; 
  182.     } 
  183.  
  184.     deviceObject->service = &testService; 
  185.     return HDF_SUCCESS; 
  186.  
  187. int HdftalkwebDozeResume(struct HdfDeviceObject *deviceObject) 
  188.     HDF_LOGI("%s:called", __func__); 
  189.     return HDF_SUCCESS; 
  190.  
  191. int HdftalkwebDozeSuspend(struct HdfDeviceObject *deviceObject) 
  192.     HDF_LOGI("%s:called", __func__); 
  193.     return HDF_SUCCESS; 
  194.  
  195. int HdftalkwebResume(struct HdfDeviceObject *deviceObject) 
  196.     HDF_LOGI("%s:called", __func__); 
  197.     return HDF_SUCCESS; 
  198.  
  199. int HdftalkwebSuspend(struct HdfDeviceObject *deviceObject) 
  200.     HDF_LOGI("%s:called", __func__); 
  201.     return HDF_SUCCESS; 
  202.  
  203. struct talkwebDriverPmListener { 
  204.     struct IPowerEventListener powerListener; 
  205.     void *p; 
  206. }; 
  207.  
  208. int HdftalkwebDriverInit(struct HdfDeviceObject *deviceObject) 
  209.     static struct talkwebDriverPmListener pmListener = {0}; 
  210.     int ret; 
  211.     HDF_LOGI("%s::enter!", __func__); 
  212.     if (deviceObject == NULL) { 
  213.         HDF_LOGE("%s::ptr is null!", __func__); 
  214.         return HDF_FAILURE; 
  215.     } 
  216.     HDF_LOGD("%s:Init success", __func__); 
  217.  
  218.     pmListener.powerListener.DozeResume = HdftalkwebDozeResume; 
  219.     pmListener.powerListener.DozeSuspend = HdftalkwebDozeSuspend; 
  220.     pmListener.powerListener.Resume = HdftalkwebResume; 
  221.     pmListener.powerListener.Suspend = HdftalkwebSuspend; 
  222.  
  223.     ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); 
  224.     HDF_LOGI("%s:register power listener, ret = %d", __func__, ret); 
  225.  
  226.     return HDF_SUCCESS; 
  227.  
  228.  
  229. struct HdfDriverEntry g_talkwebDriverEntry = { 
  230.     .moduleVersion = 1, 
  231.     .moduleName = "talkweb_driver"
  232.     .Bind = HdftalkwebDriverBind, 
  233.     .Init = HdftalkwebDriverInit, 
  234.     .Release = HdftalkwebDriverRelease, 
  235. }; 
  236.  
  237. HDF_INIT(g_talkwebDriverEntry); 

4. 應用態程序

這里的應用態程序的代碼和編譯方法,直接可以采用上文的就可以。

這里只需要修改SAMPLE_SERVICE_NAME這個宏。

  1. #define SAMPLE_SERVICE_NAME "talkweb_service" 

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

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

https://harmonyos.51cto.com

 

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

2021-11-26 15:34:27

鴻蒙HarmonyOS應用

2023-03-16 15:18:16

2021-11-22 16:46:59

鴻蒙HarmonyOS應用

2021-12-15 15:30:38

鴻蒙HarmonyOS應用

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2022-08-08 19:35:37

HDF驅動開發鴻蒙

2021-12-23 10:02:58

鴻蒙HarmonyOS應用

2023-03-20 16:21:26

ADC數字轉換器

2022-04-20 20:28:40

HDF 驅動框架鴻蒙操作系統

2021-12-15 10:02:25

鴻蒙HarmonyOS應用

2023-09-06 15:35:14

2023-09-14 15:49:42

PWM鴻蒙

2021-09-10 15:12:04

鴻蒙HarmonyOS應用

2023-03-24 14:47:24

NAPI框架HDF框架

2023-03-21 18:06:49

ADC數字轉換器

2022-05-16 11:50:45

HDF驅動框架

2022-01-04 15:35:51

鴻蒙HarmonyOS應用

2023-03-20 16:05:49

HDF傳感器驅動開發

2009-07-06 18:17:46

JDBC驅動程序

2009-06-15 14:18:00

netbeans配置JDBC驅動程序
點贊
收藏

51CTO技術棧公眾號

国产免费一区二区| 欧美精品中文字幕一区| 欧美日韩在线成人| 免费看a在线观看| 国产91精品久久久久久久网曝门| 97精品国产aⅴ7777| 国产极品视频在线观看| 风间由美一区二区av101| 色综合久久久久久久| 佐佐木明希av| 国产视频二区在线观看| 国产一区二区三区在线观看免费视频| 国语自产在线不卡| 国产又黄又粗又猛又爽的| 国产精品xxx在线观看| 欧美天天综合色影久久精品| 香蕉视频免费版| 黄色国产在线| 成人毛片老司机大片| 国产精品丝袜视频| 狠狠人妻久久久久久综合| 黑丝一区二区三区| 日韩最新免费不卡| 熟女少妇内射日韩亚洲| 精品国产一区二区三区不卡蜜臂| 欧美色图片你懂的| 99蜜桃臀久久久欧美精品网站| 丝袜国产在线| 亚洲色图制服丝袜| 亚洲免费久久| 成人高清免费观看mv| 99国产精品视频免费观看| 亚洲综合中文字幕在线观看| 做爰视频毛片视频| 视频一区二区三区中文字幕| 国产91精品黑色丝袜高跟鞋| 国产五月天婷婷| 黄色av一区| 久久99久久99精品中文字幕| 国产又黄又爽又无遮挡| 日韩一区自拍| 色哟哟网站入口亚洲精品| 久久成人激情视频| 妖精视频一区二区三区| 日韩成人在线播放| 国产精品伦子伦| 黑色丝袜福利片av久久| 欧美变态tickle挠乳网站| 一区二区三区国产好的精华液| 91久久青草| 欧美一级日韩一级| 18深夜在线观看免费视频| 精品视频一区二区三区| 91精品国产综合久久久久久久久久 | 日本美女视频一区| 国产黄色一区| 欧美精选在线播放| 先锋资源在线视频| 伊色综合久久之综合久久| 日韩精品一区二区在线| 久久久久无码国产精品一区李宗瑞| 免费观看亚洲天堂| 日韩欧美电影一二三| 国产+高潮+白浆+无码| 欧美影院天天5g天天爽| 精品视频一区在线视频| www.狠狠爱| 久久国产小视频| 欧美成人精品三级在线观看| 九九热精彩视频| 国产日韩精品视频一区二区三区 | 国产一二三四五| 女囚岛在线观看| 色诱视频网站一区| 最新天堂在线视频| 91九色鹿精品国产综合久久香蕉| 亚洲黄一区二区| 中文字幕第4页| 天天综合国产| 高清欧美一区二区三区| 久久久成人免费视频| 美女脱光内衣内裤视频久久影院| 亚洲资源在线看| 日本福利片高清在线观看| 国产女人水真多18毛片18精品视频| 亚洲一区二区三区精品在线观看| 肉体视频在线| 91成人在线观看喷潮| 亚洲精品永久视频| 欧美亚洲色图校园春色| 日韩中文字幕免费看| 国产一级视频在线| 日本美女一区二区| 国产高清自拍99| 国产二区在线播放| 亚洲欧美一区二区久久| koreanbj精品视频一区| 亚洲日本中文| 日韩高清有码在线| 手机在线免费看毛片| 中文久久精品| 亚洲自拍小视频| 韩日视频在线| 亚洲高清免费一级二级三级| 亚洲无吗一区二区三区| 国内精品国产成人国产三级粉色| 正在播放欧美一区| 免费毛片一区二区三区| 精品午夜久久福利影院| 久久亚洲国产精品日日av夜夜| 欧美日本高清| 日本电影亚洲天堂一区| 2018国产精品| 偷拍欧美精品| 日韩av电影手机在线观看| 亚洲第一页综合| 中文字幕亚洲欧美在线不卡| 九色在线视频观看| 欧美激情精品| 日韩一级黄色av| 精品国产xxx| 成人高清视频在线观看| 97精品国产97久久久久久粉红| 中文在线资源| 亚洲精品一区二区三区影院 | 丰满少妇xbxb毛片日本| 久久五月天小说| 国产成人精品电影| 手机福利在线| 精品国产31久久久久久| 久久久久亚洲av无码网站| 久久综合电影| 国产精品色视频| 黄色av免费在线看| 色呦呦国产精品| 黄色录像a级片| 激情久久一区| 国产美女在线精品免费观看| 中中文字幕av在线| 日韩一级片在线观看| 欧美风情第一页| 韩国女主播成人在线| 亚洲激情一区二区| 国产精品久久久久久久久免费高清 | 艹b视频在线观看| av亚洲免费| 国产精品久久久久久影视| 九九九伊在人线综合| 色综合天天视频在线观看| 双性尿奴穿贞c带憋尿| 99精品国产99久久久久久福利| 国产一级特黄a大片99| xxxx视频在线| 日韩精品亚洲精品| 人人草在线观看| 国产精品无遮挡| 欧美午夜aaaaaa免费视频| 欧洲杯什么时候开赛| 国产精品久久久久久久久久三级 | 欧美极品美女视频| 在线观看亚洲色图| 亚洲最大av| 国产免费一区二区| 婷婷综合六月| 中文字幕亚洲精品| 国产伦理吴梦梦伦理| 一区二区三区在线观看视频| 亚洲熟女一区二区三区| 免费日韩av片| 亚洲精品视频一区二区三区| va天堂va亚洲va影视| 欧美国产日韩一区二区在线观看| 欧洲精品久久一区二区| 色综合咪咪久久| 国产一区二区三区视频播放| 国产一区日韩二区欧美三区| 拔插拔插海外华人免费| 激情婷婷综合| 91精品视频网站| 国产不卡人人| 亚洲最新中文字幕| 国产福利资源在线| 欧美日韩中文字幕在线| 日韩av毛片在线观看| 成人精品视频一区二区三区尤物| 欧洲av无码放荡人妇网站| 不卡视频在线| 国产精品免费看一区二区三区| 性国裸体高清亚洲| 久久精品电影网站| 五月婷婷丁香网| 欧美久久久久中文字幕| 日韩欧美亚洲一区二区三区| 国产精品久久99| 制服丝袜第一页在线观看| 男男视频亚洲欧美| 97超碰人人澡| 91蜜臀精品国产自偷在线 | 日本高清免费电影一区| 国产精品国产精品| 成人久久网站| 午夜精品一区二区三区av| 亚乱亚乱亚洲乱妇| 日韩福利在线播放| 性欧美8khd高清极品| 欧美亚洲动漫精品| 久久免费激情视频| 亚洲精品乱码久久久久久久久| 97伦伦午夜电影理伦片| 国产成人免费视频网站| 欧美婷婷精品激情| 国产精品久久久久久久久久妞妞| 麻豆md0077饥渴少妇| 欧美丝袜激情| 欧美动漫一区二区| 久久久久观看| 丁香五月网久久综合| 四虎国产精品免费久久| 青草青草久热精品视频在线观看| 日本色护士高潮视频在线观看| 日韩在线国产精品| 国产永久免费高清在线观看视频| 亚洲福利视频专区| 精品国产无码AV| 88在线观看91蜜桃国自产| 亚洲中文一区二区| 欧美三级免费观看| 国产性xxxx高清| 亚洲永久精品国产| 国产又黄又爽又无遮挡| 成人免费在线视频| 亚洲一级理论片| 国产精品天美传媒| 99精品欧美一区二区| 久久精品视频在线看| 熟妇高潮精品一区二区三区| 成人免费视频app| 国产精品熟妇一区二区三区四区 | 人成免费在线视频| 久久精品男人天堂av| 蜜桃传媒一区二区亚洲av| 99久久久久免费精品国产| 妖精视频一区二区| 成人午夜激情在线| 国产十八熟妇av成人一区| 不卡av免费在线观看| 在线观看亚洲免费视频| 国产精品乡下勾搭老头1| 中文字幕第22页| 国产99一区视频免费| 日本美女视频网站| 成人av免费在线播放| 国产精品九九视频| 91麻豆精品一区二区三区| 丰满少妇一区二区三区| 久久色在线视频| 无码少妇精品一区二区免费动态| 国产免费成人在线视频| 5566中文字幕| 有码一区二区三区| 日韩成人高清视频| 色综合久久九月婷婷色综合| 亚洲精品一区二区二区| 在线成人av网站| 亚洲高清视频网站| 日韩精品免费在线视频观看| 黄色小视频在线观看| 日韩在线免费av| 丁香花高清在线观看完整版| 91精品国产91久久久久久吃药| 性感美女一区二区在线观看| 国产精品色婷婷视频| 国产精品亚洲一区二区在线观看| www.成人av| 国产在线日韩精品| 日本丰满大乳奶| 亚洲永久字幕| www.五月天色| 97久久久精品综合88久久| 国产美女免费网站| 亚洲男人的天堂av| 在线免费黄色av| 6080国产精品一区二区| 天堂av一区二区三区| 一区二区三区国产视频| 亚洲欧美成人影院| 日本一区二区在线免费播放| 日日夜夜一区| 久久国产精品免费一区| 99精品在线免费在线观看| 国产综合中文字幕| 久久99精品视频| 国产偷人妻精品一区| 成人免费一区二区三区视频| 国产成人无码精品久在线观看| 欧美色视频在线观看| 天天干天天干天天干| www.精品av.com| 超级碰碰久久| 99精品国产一区二区| 精品视频国产| 国产精品自拍片| 国产精品888| 91麻豆制片厂| 精品久久久久久中文字幕一区奶水| 国产精品一区二区av白丝下载| 精品调教chinesegay| 久草在线视频资源| 成人在线精品视频| 日本大胆欧美| 午夜肉伦伦影院| 懂色av一区二区在线播放| 91av手机在线| 欧美综合一区二区| 四虎永久在线观看| 欧美第一黄色网| av在线播放一区二区| 日韩一区二区三区资源| 一本色道久久综合亚洲精品不| 少妇精品无码一区二区| 亚洲三级免费电影| 亚洲午夜无码久久久久| 日韩精品中文在线观看| caoprom在线| 91丝袜脚交足在线播放| 99精品在线| 老司机午夜性大片| 中文字幕av不卡| 激情视频网站在线观看| 日韩av在线资源| 九九色在线视频| 国产精品播放| 国产一区久久| 乳色吐息在线观看| 一区二区欧美视频| 精品人妻少妇AV无码专区| 美日韩在线视频| 日韩在线观看一区二区三区| 国产av第一区| 国产精品亚洲一区二区三区在线| 91狠狠综合久久久| 欧美日韩一区二区电影| 香港伦理在线| 成人av.网址在线网站| 久久久久久久久丰满| 成人黄色一级大片| 成人免费在线视频| 精品国产av一区二区三区| 欧美国产日韩一区二区三区| 成人午夜网址| av网站在线观看不卡| 国产调教视频一区| 91精品国产乱码久久久久| 日韩有码在线电影| 亚洲精品高潮| 极品美女扒开粉嫩小泬| 国产无人区一区二区三区| 伊人久久久久久久久久久久 | 日韩亚洲欧美综合| 欧美色图天堂| 久久久综合亚洲91久久98| 水蜜桃久久夜色精品一区的特点| 久久日免费视频| 欧美一区二区三区视频| www成人免费观看| 欧美日韩一区二| 久久精品国产一区二区三| 欧美日韩成人免费观看| 日韩精品免费在线| 97久久网站| 激情五月婷婷六月| 久久日一线二线三线suv| 特级西西444www高清大视频| 久久亚洲欧美日韩精品专区| 粉嫩一区二区三区四区公司1| 成人三级视频在线播放 | 青青草影院在线观看| bt7086福利一区国产| 中文字幕在线观看国产| 欧美二区乱c黑人| 免费看成人哺乳视频网站| 欧美男女交配视频| 亚洲.国产.中文慕字在线| 3d成人动漫在线| 国产伦精品一区二区三区照片91| 视频一区二区三区入口| 九九热只有精品| 亚洲天堂色网站| 超碰成人福利| 国产又大又黄又粗又爽| 亚洲一卡二卡三卡四卡五卡| 国产视频第一页在线观看| 99国产在线视频| 美美哒免费高清在线观看视频一区二区 | 日本成人在线免费观看| 91久久人澡人人添人人爽欧美| 亚洲奶水xxxx哺乳期| 午夜精品一区二区三区四区| 成人sese在线| 国产美女主播在线观看|