日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关于Android的HAL的一些理解

發布時間:2024/9/5 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Android的HAL的一些理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前一直在學習基于Linux內核的一些字符型驅動的編程,對Linux內核驅動也算有了一些基本的了解吧,后來也做過一些基于Linux內核的驅動開發,像基于Android的CC1101高頻模塊的驅動開發,以及基于V4L2的USB攝像頭開發。但是還是一直都沒有用到過Android的HAL模塊,現在整理一下。?
說到HAL,我想目前市面上關于這方面的書應該也有不少,或者隨便到網上一搜,都是一大把。但是作為一個只了解了一點Linux驅動方面的知識,懂一點初級的C語言,要完全了解Android的HAL還是有一定困難的,下面我也就將我在這一塊理解的一些心得同大家分享。?
HAL(Hardware Abstraction Layer),中文是硬件抽象層,也就是說是對硬件的一種抽象。在我們之前所開發的Linux驅動程序當中,在編寫好驅動程序之后會在/dev的目錄下生成相應的設備文件,然后如果該驅動程序是應用在Android系統里面的話,可能還要編寫相應的NDK(jni)部分,使之生成動態鏈接庫(.so文件),以方便上層的java程序調用。整個模型如下圖所示。?
?
這個模型圖的結構比較簡單,也很清晰。我想大家也很清楚能夠看懂。既然這樣,為什么還要加入HAL呢,個人認為主要有以下幾點原因:

  • 協議方面的原因,因為我們知道所有的Linux程序都必須要遵循GPL協議,也就是全部開源協議。而對于有些企業和個人其并不想完全將自己的勞動成果或者是知識產權吧完全公開,所以就在Linux驅動程序的基礎之上,在弄了一個HAL層。由于對于一個驅動程序來說,其主要包括兩個部分,訪問寄存器的代碼和業務邏輯代碼。而對于訪問硬件寄存器的代碼,并沒有什么秘密可言,無非就是一些Linux內核向寄存器發號施令的標準函數(如ioread32、iowrite32等),所以一個驅動的核心部分應該是在業務邏輯代碼上,而開發者將這些業務邏輯的代碼放在HAL層,由于HAL層屬于用戶空間部分,所以并不要遵循Linux的GPL協議,因而HAL便得以廣泛應用。

  • 統一調用接口,我們知道Linux驅動程序的調用接口復雜,不統一,而HAL提供了標準的調用接口,這樣很方便

  • 針對一些特殊要求,例如有些硬件,可能需要訪問用戶空間的資源,而由于Linux驅動程序是放在內核空間的,所以加入存放用戶空間的HAL有利于對用戶空間資源的訪問。

  • 通過上面的一些分析,我想應該也大概對HAL有一些了解了,現在我給出整個HAL模型圖。?
    ?
    看到這個圖,大家一定會想,怎么又多了一個Service程序庫過來呀,確實在HAL模型剛剛出來的那會兒,的確沒有這么一個Service程序庫部分。而沒有Service程序的HAL構架雖然已經將訪問寄存器的代碼和業務邏輯代碼區分開了,但是其仍然有很多的問題,就是其還是一個孤立與Android系統之外的一個部分,沒有與Android系統本身融為一體,根本就沒有發揮出HAL的強大優勢。所以用于調用HAL程序庫的Service層便出現了。?
    下面我就以一個非常常見的led燈的例子,來講解HAL框架。?
    第一部分?
    Linux內核層(Linux內核驅動程序),相對于沒有HAL框架的Linux內核驅動程序,有HAL框架的Linux驅動程序就顯得結構比較簡單了,無非就是對寄存器的一些簡單操作。

    #include "s3c6410_leds_hal.h" #include "leds_hal_define.h"static unsigned char mem[5]; // 第1個字節:GPM寄存器類型,后面4個字節保存GPM寄存器的值 static int major = S3C6410_LEDS_MAJOR; static int minor = S3C6410_LEDS_MINOR; static dev_t dev_number; // 設備號 static struct class *leds_class = NULL; //將四個字節轉換成int類型的數據,因為從用戶空間傳遞過來的,都是以char數組形式傳遞的,而如果要在Linux內核使用int類型數據的話,就必須要有這么 //一步 // 只處理從start開始的4個字節,第start個字節為int的最高位 static int bytes_to_int(unsigned char buf[], int start) { int n = 0; n = ((int) buf[start]) << 24 | ((int) buf[start + 1]) << 16 | ((int) buf[start + 2]) << 8 | ((int) buf[start + 3]); return n; } //同樣,在處理完用戶空間傳過來的參數之后,有需要將其轉換為byte類型的數據,由于Buf為char類型數組,所以每一次只取低8位數據。 static void int_to_bytes(int n, unsigned char buf[], int start) { buf[start] = n >> 24; buf[start + 1] = n >> 16; buf[start + 2] = n >> 8; buf[start + 3] = n; } // 向GPM寄存器寫數據 static ssize_t s3c6410_leds_hal_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { if (copy_from_user(mem, buf, 5)) { return -EFAULT; } else { int gpm_type = mem[0]; // 獲取GPM寄存器類型,這里寄存器的類型放在了buf的第0位。 switch (gpm_type) { case S3C6410_LEDS_HAI_WRITE_GPMCON: iowrite32(bytes_to_int(mem, 1), S3C64XX_GPMCON); //iowrite32是Linux內核標準的庫函數,用于向寄存器寫數據 break; case S3C6410_LEDS_HAI_WRITE_GPMPUD: iowrite32(bytes_to_int(mem, 1), S3C64XX_GPMPUD); break; case S3C6410_LEDS_HAI_WRITE_GPMDAT: iowrite32(bytes_to_int(mem, 1), S3C64XX_GPMDAT); break; } } return 5; } // 向GPM寄存器寫數據 static ssize_t s3c6410_leds_hal_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { int gpm_type = mem[0]; // 獲取GPM寄存器類型 int gpm_value = 0; //關于S3C6410_LEDS_HAI_READ_GPMCON這些宏,定義在leds_hal_define.h頭文件中 switch (gpm_type) { case S3C6410_LEDS_HAI_READ_GPMCON: gpm_value = ioread32(S3C64XX_GPMCON); break; case S3C6410_LEDS_HAI_READ_GPMPUD: gpm_value = ioread32(S3C64XX_GPMPUD); break; case S3C6410_LEDS_HAI_READ_GPMDAT: gpm_value = ioread32(S3C64XX_GPMDAT); break; } int_to_bytes(gpm_value, mem, 1); if (copy_to_user(buf, (void*) mem, 5)) { return -EFAULT; } return 5; } //通過file_operation結構指定映射當然是少不了的啦 static struct file_operations dev_fops = { .owner = THIS_MODULE, .read = s3c6410_leds_hal_read, .write = s3c6410_leds_hal_write }; static struct cdev leds_cdev; //創建設備文件(/dev/s3c6410_leds_hal)這是一個規范的創建設備文件的函數。 static int leds_create_device(void) { int ret = 0; int err = 0; // 初始化cdev的成員,并建立cdev和file_operations之間的連接 cdev_init(&leds_cdev, &dev_fops); //這個函數也是Linux的庫函數,其作用就是將cdev結構體內部的file_operation成員與dev_fops聯系起來 leds_cdev.owner = THIS_MODULE; if (major > 0) { // 獲取設備號(主設備號和次設備號) dev_number = MKDEV(major, minor); err = register_chrdev_region(dev_number, DEVICE_COUNT, DEVICE_NAME); if (err < 0) { printk(KERN_WARNING "register_chrdev_region() failed\n"); return err; } } else { err = alloc_chrdev_region(&leds_cdev.dev, 10, DEVICE_COUNT, DEVICE_NAME); if (err < 0) { printk(KERN_WARNING "alloc_chrdev_region() failed\n"); return err; } major = MAJOR(leds_cdev.dev); minor = MINOR(leds_cdev.dev); //dev_number = MKDEV(major, minor); dev_number = leds_cdev.dev; } ret = cdev_add(&leds_cdev, dev_number, DEVICE_COUNT); leds_class = class_create(THIS_MODULE, DEVICE_NAME); device_create(leds_class, NULL, dev_number, NULL, DEVICE_NAME); return ret; } // 初始化LED驅動 static int leds_init(void) { int ret; ret = leds_create_device(); printk(DEVICE_NAME"\tinitialized\n"); printk(KERN_EMERG"tes1fdddfs1t\n"); return ret; } static void leds_destroy_device(void) { device_destroy(leds_class, dev_number); if (leds_class) class_destroy(leds_class); unregister_chrdev_region(dev_number, DEVICE_COUNT); return; } static void leds_exit(void) { leds_destroy_device(); printk(DEVICE_NAME"\texit!\n"); } module_init(leds_init); module_exit(leds_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Lining");

    ?

    上面驅動程序的兩個頭文件是:?
    s3c6410_leds_hal.h

    #include <linux/fs.h> #include <linux/cdev.h> #include <linux/pci.h> #include <asm/uaccess.h> #include <mach/map.h> #include <mach/regs-gpio.h> #include <mach/gpio-bank-m.h> #define DEVICE_NAME "s3c6410_leds_hal" #define DEVICE_COUNT 1 // 設備數量 #define S3C6410_LEDS_MAJOR 0 #define S3C6410_LEDS_MINOR 234

    ?

    leds_hal_define.h

    #define S3C6410_LEDS_HAI_WRITE_GPMPUD 1 #define S3C6410_LEDS_HAI_WRITE_GPMCON 2 #define S3C6410_LEDS_HAI_WRITE_GPMDAT 3 #define S3C6410_LEDS_HAI_READ_GPMPUD 4 #define S3C6410_LEDS_HAI_READ_GPMCON 5 #define S3C6410_LEDS_HAI_READ_GPMDAT 6

    ?

    由于這里的Linux驅動程序沒有采用platform設備驅動模型,所以驅動程序都需要自己編寫腳本文件,使之加載進Linux內核。

    第二部分?
    HAL層,這一層是處于用戶空間,這也是為什么,在上面的Linux驅動程序的頭文件中s3c6410_leds_hal.h和leds_hal_define.h并沒有寫在一個文件里面,因為在用戶空間中有些Linux內核的頭文件,在用戶空間是使用不了的。而我們的HAL層則需要leds_hal_define.h這個頭文件。?
    在給出HAL層的代碼之前,我想先簡單向大家分析一下HAL層的整個代碼結構。而HAL層的結構其實就是由三個關鍵點結構體貫穿,因此要理解HAL層的代碼,只需要了解三個關鍵的結構體就行,這三個結構體分別是:

    struct hw_module_t; struct hw_module_methods_t; struct hw_device_t;

    ?

    而這三個結構體的關系如下圖所示:?
    ?
    下面分別介紹一下這三個結構體?
    首先是hw_module_t,該結構體用于描述HAL模塊,可以說是HAL層的入口,因為想要知道HAL的所有信息,都要通過hw_module_t結構體,上層的Service在調用該HAL模塊時,也是要首先找到該模塊的module_ID,hw_module_t定義在/hardware/libhardware/include/hardware/hardware.h文件中,其定義如下

    typedef struct hw_module_t { /**模塊的tag,值必須是HRADWARE_MODULE_TAG */ uint32_t tag /**模塊主版本號*/ uint16_t module_api_version /**模塊從版本號*/ uint16_t hal_api_version /**模塊的ID號,后面的Service層中的hw_get_module就是通過這個ID號找到該LED模塊的*/ const char * id /**模塊名稱*/ const char * name //模塊作者 const char * author /**這個結構體指針就是我們HAL三個關鍵的結構體之一,與模塊相關的函數指針都包含在這個該結構體中*/ struct hw_module_methods_t * methods void * dso //保留空間 uint32_t reserved [32-7] }

    ?

    由于HAL規定不能直接使用這個結構體,因此我們在實際編寫代碼過程中,對要對這個結構體進行封裝,或者說是做一個結構體的繼承吧。?
    接下來是hw_device_t,這個結構體便是描述HAL設備的,HAL不是叫硬件抽象層嘛,該結構體便是對這一稱謂的集中展示。讓我們來看看hw_device_t長什么樣,

    typedef struct hw_device_t { //還是設備的tag,HAL規定必須是HARDWARE_MODULE_TAG uint32_t tag //設備版本號 uint32_t version //指向描述該HAL模塊的hw_module_t指針 struct hw_module_t * module //保留的內存空間 uint32_t reserved [12] //關閉設備函數的指針 int(* close )(struct hw_device_t *device) }

    ?

    最后一個便是hw_module_method_t,這個函數呢,是屬于前面兩個結構體之間的一個橋梁,也相當于HAL設備的一個入口,因為其里面open成員變量函數,通過該函數就可以做一些打開設備文件啦、初始化hw_device_t等工作啦。

    typedef struct hw_module_methods_t { //該結構體唯一的一個成員,一個open函數指針,注意其里面的參數,最后一個參數用了指針的指針,作用很大 //后面會講到 int(* open )(const struct hw_module_t *module, const char *id, struct hw_device_t **device) }

    ?

    接下來就附上完整的HAL層的源代碼啦

    #include "leds_hal.h" #include "../leds_hal_define.h"int dev_file = 0;// on_off: 1表示開,0表示關 int led_on_off(struct led_control_device_t *dev, int32_t led, int32_t on_off) { if (led >= 0 && led <= 3) { if (on_off == 1) LOGI("LED Stub:set %d on", led); else LOGI("LED Stub:set %d off", led); unsigned char buf[5]; buf[0] = S3C6410_LEDS_HAI_READ_GPMDAT; write(dev_file, buf, 5); read(dev_file, buf, 5); buf[0] = S3C6410_LEDS_HAI_WRITE_GPMDAT; // 修改GPMDAT寄存器的值 switch (led) { case 0: if (on_off == 1) // 打開 buf[4] &= 0xFE; // 11111110 else if (on_off == 0) // 關閉 buf[4] |= 0x1; // 00000001 break; case 1: if (on_off == 1) // 打開 { buf[4] &= 0xFD; // 11111101 } else if (on_off == 0) // 關閉 { buf[4] |= 0x2; // 00000010 } break; case 2: if (on_off == 1) // 打開 buf[4] &= 0xFB; // 11111011 else if (on_off == 0) // 關閉 buf[4] |= 0x4; // 00000100 break; case 3: if (on_off == 1) // 打開 buf[4] &= 0xF7; // 11110111 else if (on_off == 0) // 關閉 buf[4] |= 0x8; // 00001000 break; } //為什么這里只給buf[4]賦值,是由于在Linux驅動程序中的那個bytes_to_int函數導致的。 write(dev_file, buf, 5); } else { LOGI("LED Stub: set led %d on error,no this led", led); } return 0; } int led_on(struct led_control_device_t *dev, int32_t led) { return led_on_off(dev, led, 1); } int led_off(struct led_control_device_t *dev, int32_t led) { return led_on_off(dev, led, 0); } int led_device_close(struct hw_device_t* device) { struct led_control_device_t* ctx = (struct led_control_device_t*) device; if (ctx) { free(ctx); } close(dev_file); return 0; } static void leds_init_gpm() { int tmp = 0; // 初始化端口配置寄存器 unsigned char buf[5]; buf[0] = S3C6410_LEDS_HAI_READ_GPMCON; write(dev_file, buf, 5); read(dev_file, buf, 5); buf[3] |= 0x11; buf[4] |= 0x11; buf[0] = S3C6410_LEDS_HAI_WRITE_GPMCON; write(dev_file, buf, 5); // 初始化端口上拉電路寄存器 buf[0] = S3C6410_LEDS_HAI_READ_GPMPUD; write(dev_file, buf, 5); read(dev_file, buf, 5); buf[4] |= 0xAA; buf[0] = S3C6410_LEDS_HAI_WRITE_GPMPUD; write(dev_file, buf, 5); } static int led_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) { struct led_control_device_t *dev; dev = (struct led_control_device_t *) malloc(sizeof(*dev)); memset(dev, 0, sizeof(*dev)); dev->hw_device.tag = HARDWARE_DEVICE_TAG; dev->hw_device.version = 0; dev->hw_device.module = (struct hw_module_t*) module; dev->hw_device.close = led_device_close; dev->set_on = led_on; dev->set_off = led_off; //*device = &dev->hw_device; //*dev強制類型轉換,即這里向父結構體hw_device_t轉換,關于這一點,我會專門寫一篇文章來講解 *device = (hw_device_t*)dev; //打開設備文件 dev_file = open("/dev/s3c6410_leds_hal", O_RDWR); if (dev_file < 0) { LOGI("LED Stub: open /dev/s3c6410_leds_hal fail."); } else { LOGI("LED Stub: open /dev/s3c6410_leds_hal success ."); } leds_init_gpm(); return 0; } //將open函數指針指向自定義的led_device_open static struct hw_module_methods_t led_module_methods = { open: led_device_open }; /** 這里給led_module_t結構體變量命名只能是HAL_MODULE_INFO_SYM,這是HAL規定的。 */ struct led_module_t HAL_MODULE_INFO_SYM = { hw_module: { tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id : LED_HARDWARE_MODULE_ID, name: "Sample LED HAL Stub", author: "Lining", //初始化led_module_method methods: &led_module_methods, } };

    ?

    上面的HAL程序用到的頭文件源碼?
    led_hal.h文件

    #include <hardware/hardware.h> #include <fcntl.h> #include <cutils/log.h>struct led_module_t {struct hw_module_t hw_module; }; struct led_control_device_t { //注意,led_control_device_t結構體的第一個成員變量必須要是hw_device_t,這是由于后面會有結構體向父結構體強制類型轉換。 struct hw_device_t hw_device; //額外定義了兩個函數指針,這也是該結構體的關鍵所在 int (*set_on)(struct led_control_device_t *dev, int32_t led); int (*set_off)(struct led_control_device_t *dev, int32_t led); }; //在這里定義了該HAL模塊的ID號,后面的service就是通過這個ID來找到這個HAL模塊的。 #define LED_HARDWARE_MODULE_ID "led_hal"

    ?

    這里還要提一下HAL層代碼的編譯問題,該層代碼最終要編譯成led_hal.default.so文件,并且要使用adb工具將該.so文件上傳至開發板的/system/lib/hw目錄下,HAL模塊的.so文件一般都是放在這個目錄下,后面會解釋為什么這么放置,同時也會解釋為什么該.so文件后面會有一個default的后綴

    第三部分,Service層?
    終于可以講到Service Library層啦,Service Library層應該是上層的應用程序訪問HAL層的一個橋梁,盡管在以前的舊HAL框架上,并沒有這一部分,但新的HAL框架都需要我們加入Servicer Library。剛剛我們說了Service Library是上層Android應用程序和下層HAL層的一個連接的橋梁,那么它是如何發揮橋梁作用的呢?因為要完成對HAL的訪問,我們不能像之前上層應用程序訪問設備文件一樣,通過open函數打開設備文件,然后返回該文件的句柄,最后再通過該句柄完成其它函數的操作。而HAL層是通過hw_module_t這樣一個結構體對外提供接口,因此在Service Library我們要使用一個非常重要的函數hw_get_module函數,通過該函數就可以在上面的led_hal.h文件中所定義的LED_HARDWARE_MODULE_ID來查找相應的LED HAL模塊。我們知道剛剛上面的HAL層,我們都是采用C語言編寫的,而上層應用程序有是用JAVA編寫,因此這里我們應該需要有一個JNI Library(也就是NDK程序),來完成C語言和JAVA之間的對接。?
    ?
    下面給出Service Library層的源代碼

    #include <stdlib.h> #include <string.h> #include <unistd.h> #include <assert.h> #include <jni.h> #include <leds_hal.h> /**這里說明一下為什么這里的leds_hal.h文件會用尖括號<...>,這是因為該文件屬于HAL的源代碼文件,其路徑在hardware/leds_hal上,且在其對應的Android.mk文件中指定,因此該文件便屬于系統文件,所以需要用尖括號表示。*/ struct led_control_device_t *led_hal_device = NULL; /**定義led_control_device_t結構體指針,后面的led_control_open函數會用到。這個結構體包含了HAL模塊中許多重要函數,像后面要調用的set_on和set_off等*/ static jboolean led_setOn(JNIEnv* env, jobject thiz, jint led) {LOGI("Led HAL JNI: led_setOn() is invoked."); if (led_hal_device == NULL) { LOGI("Led HAL JNI: led_hal_device was not fetched correctly."); return -1; } else { return led_hal_device->set_on(led_hal_device, led); } } static jboolean led_setOff(JNIEnv* env, jobject thiz, jint led) { LOGI("Led HAL JNI: led_setOff() is invoked."); if (led_hal_device == NULL) { LOGI("Led HAL JNI: led_hal_device was not fetched correctly."); return -1; } else { return led_hal_device->set_off(led_hal_device, led); } } //定義一個內斂函數,以調用HAL的open方法 static inline int led_control_open(const struct hw_module_t* module, struct led_control_device_t** device) { return module->methods->open(module, LED_HARDWARE_MODULE_ID, (struct hw_device_t**) device); } static jboolean led_init(JNIEnv *env, jclass clazz) { led_module_t* module; LOGE("**********start find hal *********"); LOGE(LED_HARDWARE_MODULE_ID); /**通過該函數以及HAL的ID號,返回相應的hw_module_t指針,hw_get_module函數在hardware.c中定義*/ if (hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**) &module) == 0) { LOGI("LedService JNI: LED Stub found."); if (led_control_open(&module->hw_module, &led_hal_device) == 0) { LOGI("LedService JNI: Got Stub operations."); return 0; } } LOGE("LedService JNI: Get Stub operations failed."); return -1; } /**與上層的Java庫進行方法映射,即定義一個method數組。如果不使用這種方法映射的方式的話,就要使用JNI的特殊命名方式,之前我們在寫CC1101的時候就是采用的那種方式。*/ static const JNINativeMethod methods[] = { { "_init", "()Z", (void *) led_init }, { "_set_on", "(I)Z", (void *) led_setOn }, { "_set_off", "(I)Z", (void *) led_setOff }, }; /**通過上面的映射之外,我們還需要RegisterNative注冊,才能發揮效力*/ int register_led_hal_jni(JNIEnv* env) { //這里要事先定義好Java庫的路徑 static const char* const kClassName = "mobile/android/leds/hal/service/LedHalService"; jclass clazz; clazz = env->FindClass(kClassName); if (clazz == NULL) { LOGE("Can't find class %s\n", kClassName); return -1; } if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) != JNI_OK) { LOGE("Failed registering methods for %s\n", kClassName); return -1; } return 0; } /**通過該函數,會初始化該JNI模塊*/ jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { LOGE("GetEnv failed!"); return result; } register_led_hal_jni(env); return JNI_VERSION_1_4; }

    ?

    下面附上Android.mk程序

    # Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := eng //定義該共享庫的名稱,因而后面就會生成.so文件 LOCAL_MODULE:= led_hal_jni #指定編譯完成后,其.so文件存放的路徑,如果不指定,就會編譯進默認目錄 LOCAL_MODULE_PATH := /root/drivers/s3c6410_leds_hal/leds_hal_jni #指定源文件 LOCAL_SRC_FILES:= LedHalService.cpp #指定共享庫的位置 LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ libcutils \ libhardware \ libhardware_legacy \ libnativehelper \ libsystem_server \ libutils \ libui \ libsurfaceflinger_client #指定頭文件位置(或者叫頭文件的搜索路徑)這里有兩個路徑,JNI_H_INCLUDE和hardware/leds_hal LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ hardware/leds_hal #指定預鏈接模式 LOCAL_PRELINK_MODULE := false #生成共享庫(.so文件) include $(BUILD_SHARED_LIBRARY)

    ?

    用于編譯的build.sh腳本

    source ~/drivers/common.sh cd $OK6410_ANDROID_SRC_PATH source ./build/envsetup.sh cd $OK6410_ANDROID_SRC_PATH/frameworks/base/services/leds_hal_jni mm cd /root/drivers/s3c6410_leds_hal/leds_hal_jni # cp $OK6410_ANDROID_SRC_PATH/out/target/product/generic/obj/lib/led_hal_jni.so . find_devices if [ "$selected_device" == "" ]; then exit else #將生成的led_hal_jni.so文件上傳至/system/lib目錄下 adb -s $selected_device push ./led_hal_jni.so /system/lib | echo "已成功上傳到$selected_device" fi

    ?

    到現在為止基于HAL的LED驅動就差不多編譯完成了,其實到現在就可以在你的Android應用程序當中通過NDK調用上一步的Service Library,從而調用后面的HAL和驅動程序。當然我們在這一步也可以采用更加靈活,或者說是更易于應用程序使用的方式,即將調用Service程序庫的java類封裝在jar文件中,這樣做,任何Android應用程序只要引用了這個jar文件就可以向調用普通Java類一樣訪問LED驅動了。當然這里還有另外一種方式就是采用ServiceManager的方式,此種方式更加符合目前主流Android編程的規范,但是相對前者,編寫起來稍微復雜一些。后面我也會專門寫一篇文章來講解該方式。

    轉載于:https://www.cnblogs.com/jiangzhaowei/p/8431122.html

    總結

    以上是生活随笔為你收集整理的关于Android的HAL的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    性色av香蕉一区二区 | 精品视频国产一区 | 最近中文字幕在线中文高清版 | 在线成人小视频 | 久久 国产一区 | 日本精品视频免费观看 | 国产精品免费视频一区二区 | 少妇自拍av | 国产精品岛国久久久久久久久红粉 | 天天天天射| 亚洲第一香蕉视频 | 日韩在线国产 | 中文字幕网站视频在线 | 看av免费 | 一区免费在线 | 麻豆免费在线视频 | 中文字幕在线观看第一页 | 六月色播 | 在线直播av | 美女视频黄免费的久久 | 日韩精品视频免费在线观看 | 在线v片免费观看视频 | 免费热情视频 | 日韩综合一区二区三区 | 久久在视频 | 欧美日韩性视频在线 | 91免费视频黄 | 91大神精品视频 | 日本中文字幕在线观看 | 97久久精品午夜一区二区 | 日韩激情第一页 | 国产精品中文字幕在线观看 | 国产不卡在线视频 | 麻豆91在线播放 | 亚洲欧美日韩中文在线 | 久久久国产精品亚洲一区 | 日韩av电影免费在线观看 | 国产四虎影院 | 韩国av免费观看 | 国产精品美女久久久久久 | 69中文字幕 | 黄色三级在线看 | 日韩免费看视频 | 久久国产精品视频观看 | 亚洲精品一区二区三区四区高清 | 成人在线播放av | 中文字幕在线精品 | 免费看色的网站 | 免费a网站 | 亚洲九九九 | 黄色av网站在线免费观看 | 亚洲黄色在线免费观看 | 17婷婷久久www | 国产一级电影网 | 中文字幕乱码亚洲精品一区 | 欧美色图狠狠干 | 91精品在线免费观看 | 国语久久| 欧美色图一区 | 在线观看蜜桃视频 | 碰天天操天天 | 中文字幕国产一区 | 91大神在线观看视频 | 国产精品视频地址 | 正在播放国产一区 | 黄色一级在线免费观看 | 亚洲三级国产 | 亚洲免费在线播放视频 | 国产精品毛片完整版 | 91伊人久久大香线蕉蜜芽人口 | 最近中文字幕mv | 五月婷婷中文 | 久草精品视频在线看网站免费 | 婷婷色社区 | 亚洲国产午夜精品 | 午夜精品一区二区三区在线 | 成人免费观看大片 | 国产在线观看,日本 | 狠狠色狠狠色综合日日小说 | 亚洲激情小视频 | 亚洲国产精久久久久久久 | 久久久久这里只有精品 | 夜夜澡人模人人添人人看 | 亚洲精品国偷自产在线99热 | 人人舔人人爱 | 国产精品一区二区在线观看免费 | 国产精品久久久久高潮 | 天天视频亚洲 | 国产精品免费在线视频 | 国产精品不卡一区 | 久久免费激情视频 | 一区二区欧美在线观看 | 国产综合精品一区二区三区 | 国产特级毛片aaaaaa高清 | 国产日韩欧美在线观看视频 | 亚洲日韩中文字幕在线播放 | 国产精品国产亚洲精品看不卡15 | 日韩 精品 一区 国产 麻豆 | 国产伦精品一区二区三区高清 | 国产精品成人免费 | 狠狠操狠狠干天天操 | av一级在线观看 | 国产区在线 | 久久国产精品一国产精品 | 亚洲精品影视 | 狠狠搞,com| 一区二区三区日韩在线观看 | 国产精品乱码久久久久久1区2区 | 久久这里只有精品首页 | 四虎最新入口 | 国产免费久久久久 | av片在线看 | 一区二区三区电影在线播 | 久久精精品| 国产一区免费观看 | 国产精品美女免费看 | 天天操天天色天天 | 免费人成网 | 亚洲男人天堂a | 成人国产亚洲 | 狠狠色狠狠色合久久伊人 | 国产午夜精品福利视频 | 91免费国产在线观看 | 国产精品白浆视频 | 天天操夜夜想 | 久久成熟 | 丁香国产视频 | 精品久久网| 黄色网在线播放 | av免费看av| 9在线观看免费高清完整 | 一级一级一片免费 | 在线三级播放 | 美女视频久久 | 在线观看视频你懂 | 97视频入口免费观看 | 免费看国产精品 | 天堂av在线中文在线 | 在线视频国产区 | 久久免费影院 | 99产精品成人啪免费网站 | 欧美精品资源 | 又黄又爽又无遮挡的视频 | 精品国产一二区 | 蜜臀av免费一区二区三区 | 人人插人人射 | 成人久久久久久久久久 | 日本久久久久久科技有限公司 | 亚洲无在线 | www.狠狠色| 麻花豆传媒一二三产区 | 中文字幕黄色av | 超碰国产在线观看 | 99久久综合国产精品二区 | 国产精品av久久久久久无 | 亚洲成av人片 | 日一日操一操 | 久久免费视频网站 | 色偷偷人人澡久久超碰69 | 久久久久久久福利 | 最近中文字幕大全中文字幕免费 | 麻豆视频在线观看免费 | 国产另类xxxxhd高清 | 国产伦理一区二区三区 | 不卡的一区二区三区 | 99久久久久久国产精品 | 国产精品美女久久久免费 | 国产精品手机在线 | 亚洲一区视频在线播放 | 中文字幕日本电影 | 久操久| 午夜精品一区二区三区视频免费看 | 999精品| 欧美坐爱视频 | 亚洲精选在线 | 日韩美女一级片 | 黄色a一级视频 | 国产成人在线观看 | 日韩在线观看视频免费 | 国产 日韩 在线 亚洲 字幕 中文 | 在线中文字母电影观看 | 国产精久久久 | 成人av教育 | 在线看成人av | 日本丶国产丶欧美色综合 | 人人插人人插 | 国内精品视频久久 | 国产成人一区二 | 伊人国产在线观看 | 五月婷婷色播 | 国产资源中文字幕 | 午夜性色 | 91探花系列在线播放 | 在线观看av网 | 人人添人人澡 | 亚洲国产久 | 国产精品免费一区二区三区 | 亚洲成人黄色网址 | 五月婷婷天堂 | 天天碰天天操视频 | 欧美天天综合 | 国产精品破处视频 | 免费观看黄色12片一级视频 | 久久综合狠狠综合 | 日本三级久久久 | 91人人干| 精品视频国产 | 天天操夜夜叫 | 在线97 | 国产精品久久久久999 | 午夜久久 | 国产香蕉视频 | 国产精品高清一区二区三区 | 欧美疯狂性受xxxxx另类 | 在线观看视频你懂 | av观看在线观看 | 天天综合五月天 | 国产一二区在线观看 | 久久综合九九 | 成人av一级片 | 久草视频手机在线 | 日韩区欧美久久久无人区 | 日韩在线观看第一页 | 99热精品久久 | 国内视频在线 | 九色在线| 久久精品国产亚洲 | 在线综合 亚洲 欧美在线视频 | 五月婷婷激情六月 | 欧美日韩国产一二 | 日韩欧美在线观看一区二区三区 | 综合在线观看色 | 国产精品久久久久影院 | 99精品国产一区二区 | 精品久久久久久国产偷窥 | 大荫蒂欧美视频另类xxxx | 日本久久成人中文字幕电影 | 一级免费黄色 | 在线观看国产福利片 | 欧美日韩一级视频 | 免费av试看 | 久草在线欧美 | 精品国模一区二区 | 亚洲在线不卡 | 五月天婷婷在线播放 | 在线三级av | 国产免费不卡 | 国产v视频 | 欧美一二三视频 | 婷婷在线视频 | 狠狠干干 | 成人免费毛片aaaaaa片 | 中文字幕人成不卡一区 | 91网站在线视频 | 久久午夜国产精品 | 日本中文乱码卡一卡二新区 | 亚洲精品视频在线免费 | 亚洲视屏 | 一区二区 久久 | 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美一级日韩三级 | 日韩免费成人av | 亚洲视频久久久久 | 成人一级影视 | 欧美一级视频一区 | 国产精品成人av在线 | 香蕉视频网站在线观看 | 国产一区二区高清视频 | 日韩免费看 | 日本视频网 | 日韩一区二区三区高清免费看看 | 最新av在线网站 | 韩国精品一区二区三区六区色诱 | 狠狠干干 | 麻豆果冻剧传媒在线播放 | 亚洲精色| 国产黄色大全 | 五月天伊人网 | 精品免费久久久久 | 看片的网址| 激情电影影院 | 天天舔夜夜操 | 日本精油按摩3 | 91桃色视频 | 天天色天天射综合网 | 在线观看日韩精品 | 91亚洲成人 | 免费在线成人av电影 | 亚洲国产免费网站 | 国产精品成人久久久久 | av在线永久免费观看 | 免费黄色激情视频 | 色插综合| 黄色毛片一级 | 婷婷精品国产一区二区三区日韩 | 久久久精品免费观看 | 久久成人亚洲欧美电影 | 日韩中文字幕免费看 | 韩国三级在线一区 | 日韩精品在线免费播放 | 九九热精品国产 | 日韩在线观看a | 中文字幕在线字幕中文 | 日日夜夜免费精品 | 国产精品少妇 | 天天曰天天爽 | 丁香久久综合 | 国产999精品久久久久久 | 久久理论影院 | 日韩成人精品一区二区三区 | 啪一啪在线 | 久久伦理视频 | 亚洲va欧美va国产va黑人 | 午夜久久影院 | 天天干天天干天天色 | 99久久精品国产亚洲 | 99热精品久久 | 亚洲91精品在线观看 | 国产成人在线精品 | 在线a亚洲视频播放在线观看 | 超碰97免费 | 中文字幕在线观看一区 | 久草在线最新视频 | a黄在线观看 | 色香网 | 免费av成人在线 | 国产免费视频一区二区裸体 | 国产精品igao视频网网址 | 99精品视频免费在线观看 | 九九九九免费视频 | av 一区二区三区 | 五月激情丁香 | 色综合久久中文字幕综合网 | 亚洲天堂网在线视频观看 | 91视频88av| 97成人在线 | 91精品国产一区二区三区 | 999久久久久| 伊人激情网 | 国产成人黄色在线 | 欧美激情片在线观看 | 99人久久精品视频最新地址 | 欧美大片在线看免费观看 | 美女网站色在线观看 | 日韩av电影一区 | 播五月婷婷| 国产黄色片一级 | 中文字幕 在线看 | 在线观看www91 | 亚洲视频在线观看 | 91探花国产综合在线精品 | 激情深爱五月 | 黄色av电影一级片 | 久草在线高清 | 色五月成人 | 中文字幕中文字幕在线一区 | 精品美女久久久久久免费 | 黄色网大全| 久久国产麻豆 | 国产亚洲婷婷免费 | 国产精品嫩草55av | 久日精品 | 国产精品一区二区三区电影 | 黄色在线观看污 | 国产精品入口久久 | 婷婷九九 | av福利在线看 | www91在线观看 | 香蕉视频日本 | 国产精品一区二区三区在线免费观看 | 99精品视频免费全部在线 | 99这里只有精品视频 | 国产欧美综合在线观看 | 精品a视频| 色婷婷综合视频在线观看 | av女优中文字幕在线观看 | 久久久免费少妇 | 精品国产一区二区三区不卡 | 热久久国产 | 亚洲伊人天堂 | 久久福利国产 | 天天操狠狠操夜夜操 | 日本3级在线观看 | 永久精品视频 | 亚洲情感电影大片 | 精品av在线播放 | 日本h在线播放 | 亚州精品成人 | 国产精品久久久一区二区三区网站 | 丁香激情五月婷婷 | 国产视频一区二区在线播放 | 一色av | 国产一级大片在线观看 | 免费a v网站 | 天堂va在线高清一区 | 日韩在线精品一区 | 人人爽人人看 | 日本中文字幕在线观看 | 国产精品久久久久久模特 | 日韩r级在线 | 久久男人中文字幕资源站 | 天天干天天插 | 国产精品v欧美精品 | 欧美日韩国语 | 国产成人精品久久二区二区 | 国产在线看一区 | 四虎成人免费影院 | 97超碰人人干 | 日韩理论在线视频 | 中文字幕日韩无 | 日韩高清一区在线 | 亚洲第一中文字幕 | 私人av| 欧美色黄| 国产精品亚洲片在线播放 | 日本99精品| 婷婷在线精品视频 | 在线播放 日韩专区 | 国产黄免费| 久久公开免费视频 | 黄色av网站在线免费观看 | av综合站| 国产麻豆果冻传媒在线观看 | 超碰97在线资源 | 黄色毛片一级片 | 99视屏 | 丁香5月婷婷久久 | 免费视频区 | 不卡的av片 | 精品国产伦一区二区三区 | 国产一区二区免费看 | 国内三级在线观看 | 国产91在线 | 美洲 | 亚洲aⅴ久久精品 | 色综合天天综合在线视频 | 国产精品女人久久久久久 | 日韩欧美精品在线视频 | 国产码电影 | 国产综合片 | 天天操夜夜叫 | 高清在线观看av | 国产字幕在线播放 | 成人av动漫在线 | 99久久99久久精品免费 | 一区二区三区国 | 久久精品一区二区三区四区 | 在线91色 | 亚洲va在线va天堂va偷拍 | 色欧美成人精品a∨在线观看 | 久久成人在线视频 | 免费观看完整版无人区 | 波多野结衣在线观看一区 | 日本动漫做毛片一区二区 | 精品国产一区二区三区久久久 | 国产精品网站一区二区三区 | 激情久久伊人 | 91精品一区国产高清在线gif | 国产中文字幕视频 | 国产a视频免费观看 | 国产精品美女久久久久久免费 | 亚洲国产免费网站 | 99视频精品 | 成人xxxx| 国产精品久久久久婷婷二区次 | 亚洲精品综合一区二区 | 久操操 | 久久精品成人热国产成 | 日韩一区视频在线 | 欧美超碰在线 | 国产精品高清在线 | 国产高清视频在线免费观看 | 日b黄色片 | 色99视频| 中文在线www | 日韩视频欧美视频 | 999久久久久久久久 69av视频在线观看 | a在线观看免费视频 | 欧美激情精品久久 | 久久综合加勒比 | 日韩精品中文字幕在线不卡尤物 | 国产精品国产精品 | 免费在线观看成人小视频 | 99在线视频网站 | 黄污网站在线 | 成人性生交视频 | 免费国产在线视频 | 国产97色在线 | 亚洲精品久久久蜜臀下载官网 | 久草在线免费看视频 | 在线 你懂 | 99久久久久久久久久 | 久久精品9 | 亚洲色影爱久久精品 | 亚洲激情在线 | 四虎免费av| 国产精品入口久久 | 亚洲在线成人精品 | 日韩久久久久久 | 国产精品综合在线 | 婷婷黄色片| 精品一区电影国产 | 91激情视频在线播放 | 最近高清中文字幕在线国语5 | 狠狠狠狠狠狠天天爱 | 香蕉视频导航 | 精品久久久久久久久久岛国gif | 人人澡视频 | 五月婷婷六月丁香 | 久久久久久欧美二区电影网 | 六月久久婷婷 | 国产精品嫩草55av | 97日日| 亚州精品在线视频 | 久久综合电影 | 亚洲婷婷网 | 成人小视频在线观看免费 | 日韩欧美精品一区二区三区经典 | 综合激情伊人 | 最新超碰在线 | 欧美国产精品一区二区 | 99久久精品费精品 | 日本特黄特色aaa大片免费 | 日本高清xxxx | 成人啊 v | 日韩三级久久 | 午夜影视一区 | 亚洲电影成人 | 国产精选视频 | av在线进入 | 国产国产人免费人成免费视频 | 国产精品久久久免费 | 亚洲一区av | 国产精品小视频网站 | 97超碰在线资源 | 欧美日韩一区二区三区不卡 | 日韩精品免费一区二区在线观看 | www.五月天色 | 天天操网| 久久视精品 | 91精品视频在线观看免费 | 久久亚洲福利视频 | 91色国产在线 | 五月开心色 | 狠狠干夜夜爽 | 亚洲 欧洲 国产 精品 | 国产资源站 | 中文永久免费观看 | 色播五月激情综合网 | 久久婷婷五月综合色丁香 | av黄在线播放 | 久久久久久久久福利 | 97色婷婷成人综合在线观看 | 天天干夜夜干 | 日韩xxxx视频| 亚洲天天干 | 五月天亚洲综合 | 国产精品第一视频 | 久久精品免费看 | 在线国产一区二区 | 国产黄| 日韩在线免费看 | 在线观看91av | 久久在线免费 | 亚洲精品午夜国产va久久成人 | 五月天亚洲精品 | 免费看国产一级片 | 日韩欧美高清视频在线观看 | www.夜夜干.com | 美女免费网视频 | 国产精品18久久久 | 婷婷在线免费视频 | 碰超人人 | 久久久精品影视 | 日韩欧美成人网 | aa一级片| 日韩黄色免费电影 | 欧美一级特黄aaaaaa大片在线观看 | 免费裸体视频网 | 在线观看网站黄 | 午夜久久久久久久久久影院 | 视频99爱| 国产精品mv | 国产精品你懂的在线观看 | 成人黄在线观看 | 婷婷丁香激情网 | 成人av一区二区兰花在线播放 | 久av在线| 欧美国产大片 | 日韩精品一区二区免费 | 成人av免费看 | 亚洲无人区小视频 | 九九热精| 色99网| 黄色毛片在线观看 | 波多野结衣电影一区二区三区 | 国产小视频网站 | 人人草天天草 | 国产色 在线 | 欧美精品九九99久久 | 91在线免费公开视频 | av免费福利| 成人午夜av电影 | 日日夜夜网 | 黄色av成人在线 | 免费av网址在线观看 | 久要激情网 | 在线观看中文字幕2021 | 成人av网站在线观看 | 成人在线一区二区三区 | 激情深爱| 国产日韩高清在线 | 久久免费av电影 | 玖玖玖精品 | 中文字幕有码在线播放 | 精品视频亚洲 | 91看片淫黄大片一级在线观看 | 日日夜夜操操操操 | 欧美日产一区 | 最近2019年日本中文免费字幕 | 日韩精品一区二区免费视频 | 久久精品在线免费观看 | 日韩肉感妇bbwbbwbbw | 免费在线黄色av | 亚洲国产69 | 三级av网 | 日韩一区正在播放 | 国产精品网红直播 | 99久久精品国产网站 | 国产黄色在线观看 | 激情网五月天 | 在线a人v观看视频 | 亚洲精品久久久久999中文字幕 | av噜噜噜在线播放 | 中文字幕一区在线 | 毛片黄色一级 | 欧美一区二区在线 | 天无日天天操天天干 | 精品久久国产精品 | 丁香六月天婷婷 | av片在线观看 | 激情av资源 | 日韩大片在线看 | 激情欧美在线观看 | 久久一区二区免费视频 | 午夜国产福利在线观看 | 国产午夜精品一区二区三区嫩草 | 一本一道久久a久久综合蜜桃 | 国产亚洲精品久久久久久大师 | av高清网站在线观看 | 在线中文字母电影观看 | 日韩理论 | 国产中文字幕亚洲 | 久久视频国产 | 在线精品在线 | 国产成人精品一区二区三区福利 | 在线免费国产视频 | 99九九视频 | 成人作爱视频 | 欧美一二三区播放 | 国产 成人 久久 | 婷婷精品在线 | 日韩毛片在线免费观看 | 91九色精品 | 日韩最新理论电影 | 人人艹视频 | 免费黄色网址网站 | www.97视频| 欧美日韩免费在线视频 | 国产成人精品av在线 | 欧美一区,二区 | 国产一区免费 | 亚洲精品av在线 | 天天射综合网视频 | 久久99精品一区二区三区三区 | 日韩动态视频 | 中文字幕在线视频免费播放 | 国产a高清| 狠狠五月天 | 狠狠干狠狠久久 | 欧美日韩3p | 91高清在线看 | 欧美天天综合网 | 人人擦 | 亚洲欧洲在线视频 | 视频一区二区在线观看 | 国产精品麻豆果冻传媒在线播放 | 亚洲人视频在线 | 久久久精品网 | 久久婷婷一区 | 亚洲成人免费在线观看 | 国产九九九视频 | 中文字幕在线观看网 | 中文字幕色在线视频 | 成年人电影免费在线观看 | 午夜精品电影一区二区在线 | 久久国内精品99久久6app | 手机成人在线 | 中文字幕在线人 | 色小说在线| 亚洲日本欧美 | 69国产精品视频免费观看 | 精品一区二区三区四区在线 | av青草| 热久久免费视频 | 69国产精品成人在线播放 | 人成在线免费视频 | 五月激情电影 | 美女网站在线 | 午夜国产在线观看 | 福利视频第一页 | 涩涩色亚洲一区 | 又黄又刺激 | 欧美日韩不卡在线视频 | 亚洲精品一区中文字幕乱码 | 91精品一区二区在线观看 | 开心激情久久 | 日韩中文在线播放 | 国产 一区二区三区 在线 | 超碰在线人人草 | 亚洲国产片色 | 中文字幕在线观看完整版电影 | 正在播放亚洲精品 | 婷婷九月激情 | 久久精品美女视频网站 | 国产精品粉嫩 | 91福利社在线观看 | 免费在线播放视频 | 久久成人麻豆午夜电影 | 午夜精品久久久久久99热明星 | 久久伊人五月天 | 久久久久久久久久久电影 | 欧美 日韩 久久 | 久久婷婷激情 | 欧美精品一区二区三区一线天视频 | 九九视频在线 | 久久视频99 | 日韩二区精品 | 成年人网站免费观看 | 在线观看黄色大片 | 干 操 插| 黄色免费大片 | 在线视频 91 | 国产色网| 97av视频| 91麻豆精品国产自产 | 国产呻吟在线 | 精选久久 | 成人a v视频 | 九九九免费视频 | 亚洲天天| 久久久久国产精品午夜一区 | 精品久久久999 | 久久综合9988久久爱 | 久久99久久久久久 | 日韩精品一区二区久久 | 久久人人添人人爽添人人88v | 亚洲欧美日韩一区二区三区在线观看 | 黄色美女免费网站 | 亚洲精品综合在线 | 久久字幕 | 综合网天天 | 日韩免费高清 | 黄色一级在线视频 | 色婷婷综合五月 | 亚洲综合国产精品 | 国产精品嫩草影视久久久 | 欧美视频www | 国产高清在线免费 | 激情五月伊人 | 色噜噜狠狠狠狠色综合久不 | 国产精品私人影院 | 国产色 在线 | 国产97在线视频 | 成年人在线| 有码视频在线观看 | 午夜精品视频免费在线观看 | 午夜精品中文字幕 | 免费三级网 | 国产精品69av| 国产一级二级三级视频 | av免费看在线 | 国产伦理一区二区 | 国产99久久九九精品免费 | 成人毛片一区二区三区 | 亚洲精品小视频 | 在线看日韩 | 中文字幕在线乱 | 极品久久久久 | 日韩精品免费一区二区 | 国产精品大片 | 日韩av电影手机在线观看 | 九九九热精品免费视频观看 | 在线免费视频你懂的 | 中文久草 | 日韩精品综合在线 | 欧美天天综合网 | 国产麻豆精品久久一二三 | 6080yy午夜一二三区久久 | 99视| 亚洲高清在线观看视频 | 亚洲精品在线免费观看视频 | 在线观看中文av | 国产精品久久久久av免费 | 九色激情网 | 日本精品视频在线观看 | 久久激情小视频 | 激情久久一区二区三区 | 国产69精品久久app免费版 | 日韩激情视频在线观看 | 超碰在线最新网址 | 天天操狠狠操夜夜操 | 国产精品欧美久久久久天天影视 | 一区二区在线电影 | 久久深夜福利免费观看 | 日本特黄一级片 | 伊人日日干 | 久久avav| 国产精品成人一区二区三区吃奶 | 婷婷在线综合 | 久久久久久久久久久网站 | 亚色视频在线观看 | 一本一本久久a久久精品综合小说 | 精品国产一区二区三区久久影院 | 久久久999精品视频 国产美女免费观看 | 在线亚洲欧美视频 | 欧美日韩在线视频免费 | 久久久久久久久免费 | 久久久久久国产精品免费 | 91九色成人蝌蚪首页 | 亚洲一区精品二人人爽久久 | 亚洲精品在线二区 | 日韩一区在线播放 | 亚洲欧美怡红院 | 五月婷婷激情网 | 亚洲欧美日韩精品久久奇米一区 | 欧美在线99| 天天夜夜狠狠操 | 亚洲国产人午在线一二区 | 91精品国产91久久久久久三级 | 免费看一级黄色大全 | 国产一区二区在线精品 | 91视频免费 | 亚洲高清在线观看视频 | 国产日韩在线观看一区 | 在线 国产 亚洲 欧美 | 国产最顶级的黄色片在线免费观看 | 91理论电影| 久久婷婷国产 | 日本高清dvd | 国产三级精品三级在线观看 | 5月丁香婷婷综合 | 欧美一级日韩免费不卡 | 九九九电影免费看 | 中文字幕在线观看2018 | 久久久久亚洲最大xxxx | 特级a老妇做爰全过程 | 又黄又爽的视频在线观看网站 | 韩国在线视频一区 | 在线视频中文字幕一区 | 91成版人在线观看入口 | 日韩欧美一区二区三区黑寡妇 | 免费视频三区 | 九九欧美视频 | 免费亚洲黄色 | 天天色天天射天天操 | 观看免费av| 免费一级特黄录像 | 中文字幕永久 | 久久草网站 | 亚洲国产视频网站 | 国产在线免费 | 精品国产一区二区三区日日嗨 | a色视频 | 麻豆视频免费在线播放 | 久久免费视频这里只有精品 | 欧美性色综合 | 国产精品18久久久久久久久 | 99热在线国产 | 在线中文视频 | 性色大片在线观看 | 久久精品国产成人 | 97精品国产aⅴ | 精品不卡av | 丁香婷婷激情国产高清秒播 | 免费日韩一级片 | 亚洲精品视频二区 | 韩国av免费看| 深爱激情亚洲 | avav99| 91看片看淫黄大片 | 亚洲国产理论片 | av免费网 | 日本aa在线 | 欧美精品在线一区二区 | 91久久偷偷做嫩草影院 | 亚洲精品国产精品久久99热 | 亚洲视频久久久久 | 免费在线观看国产精品 | 国产一区二区在线免费 | 国产精品第2页 | 激情在线免费视频 | 日韩高清在线看 | 亚洲国产色一区 | 99久久精品免费看国产 | 99色国产 | 亚洲精品乱码久久久久久蜜桃欧美 | 少妇性aaaaaaaaa视频 | 成人黄色电影视频 | 玖玖在线播放 | 91麻豆精品国产91久久久久 | 日韩在线视频国产 | 欧美在线1| 久久久国产精华液 | 成人av在线亚洲 | 久草免费色站 | 亚洲精品午夜久久久 | 亚洲国产综合在线 | 婷婷亚洲激情 | 成人全视频免费观看在线看 | 亚洲激情久久 | 97电院网手机版 | 97热视频| 91精品免费视频 | 午夜精品视频福利 | 久久91久久久久麻豆精品 | 国产流白浆高潮在线观看 | 国产 欧美 日产久久 | 天天天天天天天天操 | 911香蕉| 久久99精品久久只有精品 | 久久精品在线免费观看 | 成人av电影免费在线播放 | 国产精品毛片久久久久久久久久99999999 | 国产精品少妇 | 精品一区二区精品 | 亚洲精品国偷自产在线99热 | 久久国内精品 | 黄色成人影视 | 欧美日韩国产在线 | 99免费在线播放99久久免费 | 亚洲精品18p | 久久人人爽爽人人爽人人片av | 亚洲精品xxxx | 久久福利精品 | 在线中文字幕电影 | 在线精品视频在线观看高清 | 草樱av| 综合天堂av久久久久久久 | 玖玖精品在线 | 久久av一区二区三区亚洲 | 99热官网 | 中文字幕五区 | 精品国产伦一区二区三区观看方式 | 中文字幕av专区 | va视频在线观看 | 9在线观看免费高清完整 | 欧美日韩一区二区在线 | 国产视频精品免费播放 | 欧美一区二视频在线免费观看 | 久久久伦理 | 麻豆影视在线播放 | 黄网av在线 | 免费观看一级成人毛片 | 国产涩涩在线观看 | 五月综合色 | 黄色精品在线看 | 亚洲国产小视频在线观看 | 国产精品综合在线观看 | 激情综合五月天 | 国产成人精品一区二区三区福利 | 久久在线精品 | 91香蕉视频在线 | 美女视频又黄又免费 | 亚洲日韩精品欧美一区二区 | 久久国产精品二国产精品中国洋人 | 国产小视频免费在线观看 | 四川bbb搡bbb爽爽视频 | 最近免费中文字幕大全高清10 | 欧美无极色 | 美女网站久久 | 成人宗合网 | 国产成人精品女人久久久 | 色九色 | av丝袜天堂 | 亚洲欧美日韩精品久久奇米一区 | av电影在线观看完整版一区二区 | 国产玖玖精品视频 | 一区二区三区高清在线观看 | 久久av影视 | 天天插天天狠天天透 | 欧美日韩在线播放一区 | 久热免费 | 婷婷久操| 国产精久久久久久久 | 欧美a在线看 | 久久亚洲欧美日韩精品专区 | 亚洲精品在线观看不卡 | 天堂va欧美va亚洲va老司机 |