wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7607|回復: 0
打印 上一主題 下一主題
收起左側

xxx芯片廠商hdmi分辨率識別補丁分析散筆

[復制鏈接]
跳轉到指定樓層
樓主
ID:82083 發表于 2015-6-6 02:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 qinqin 于 2015-6-6 02:52 編輯

好久沒寫過筆記了,這次難得遇到那么全的補丁,從上層直通底層,又碰巧在跟蹤接口方面是我的弱項,所以不分析一下太對不住自己了。。。

分析方法由上到下,從接口往底層跟。

接口的使用方法:
import android.view.DisplayManagerAw;
final DisplayManagerAw mDisplayManager = (DisplayManagerAw) mContext.getSystemService(Context.DISPLAY_SERVICE_AW);
int hdmiMode
hdmiMode = mDisplayManager.getSuitableHdmiNativeMode();
返回的hdmiMode是frameworks/base/core/java/android/view/DisplayManagerAw.java  對應的模式,比如 5對應 720P_60HZ, 10對應1080P_60HZ


android/frameworks/base/core/java/android/view/DisplayManagerAw.java
public int getSuitableHdmiNativeMode()
{

int displayno = 0;
int i;

try
{ // 從最高分辨率遍歷所有Hdmi分辨率,測試哪一項是支持的。
for (i = DISPLAY_TVFORMAT_1080P_60HZ; i >= DISPLAY_TVFORMAT_480I; i--)
{
if (mService.isSupportHdmiNativeMode(i) == 1) // 這一步是關鍵
return i;
}
return  -1;
}
catch (RemoteException ex)
{
return -1;
}
}

mService.isSupportHdmiNativeMode(i) 是 mService 里面的方法,所以找mService的類。
private IDisplayManagerAw mService; ---> import android.view.IDisplayManagerAw;
---> android\frameworks\base\core\java\android\view\IDisplayManagerAw.aidl
關鍵代碼:
interface IDisplayManagerAw
{
// ... 省略
int isSupportHdmiNativeMode(int mode);
}


對應:android\frameworks\base\services\java\com\android\serv\DisplayManagerServiceAw.java
public class DisplayManagerServiceAw extends IDisplayManagerAw.Stub
{
    private static final String TAG = "DisplayManagerServiceAw";
    // 聲明本地方法,明顯是JNI方法
    private native int  nativeIsSupportHdmiNativeMode(int mode);
    // ... 省略
    public int isSupportHdmiNativeMode(int mode)
    {
        return nativeIsSupportHdmiNativeMode(mode);
    }
}
去JNI目錄看看:
android\frameworks\base\services/jni/com_android_server_DisplayManagerServiceAw.cpp

namespace android
{   
    // ... 省略代碼
// 這里是具體實現
    static jint isSupportHdmiNativeMode_native(JNIEnv *env, jobject clazz,int mode)
    {   // Client ???  發的是這個命令 DISPLAY_CMD_ISSUPPORTHDMINATIVEMODE
        return  SurfaceComposerClient::setDisplayProp(DISPLAY_CMD_ISSUPPORTHDMINATIVEMODE,mode,0,0);
    }

    static JNINativeMethod method_table[] = {
        // ... 省略其他映射
// nativeIsSupportHdmiNativeMode() 實際調用的是 isSupportHdmiNativeMode_native()
{ "nativeIsSupportHdmiNativeMode", "(I)I", (void*)isSupportHdmiNativeMode_native },
    };

    int register_android_server_DisplayManagerServiceAw(JNIEnv *env)
    {// 注意這里
    jclass clazz = env->FindClass("com/android/server/DisplayManagerServiceAw");

        if (clazz == NULL)
        {
            ALOGE("Can't find com/android/server/DisplayManagerServiceAw");           
            return -1;
        }
        // 注意這里,與 DisplayManagerServiceAw 有對應關系
        return jniRegisterNativeMethods(env, "com/android/server/DisplayManagerServiceAw",
                method_table, NELEM(method_table));
    }
};

看接收命令處實現了什么:
android/framework/native/include/ui/DisplayCommand.h
#define   DISPLAY_CMD_ISSUPPORTHDMINATIVEMODE           30

看其實現:android/framework/native/services/surfaceflinger/DisplayDispatcher.cpp
int DisplayDispatcher::setDispProp(int cmd,int param0,int param1,int param2)
{
switch(cmd)
{
// ... 省略
case DISPLAY_CMD_ISSUPPORTHDMINATIVEMODE:
return mDevice->issupporthdminativemode(mDevice,param0);
}
}
mDevice下的方法 issupporthdminativemode(),找 mDevice 對象
display_device_t*    mDevice; 是在 DisplayDispatcher.h 中定義。
display_device_t 結構體在 android/framework/native/include/hardware/display.h
struct display_device_t
{
// ... 省略
/*判斷某種hdmi制式是否被電視本地支持*/
    int (*setdisplayareapercent)(struct display_device_t *dev, int displayno,int percent);
// ... 省略
};
是一個函數指針,看其指向了哪里:android/framework/native/include/hardware/display.cpp
android/device/softwinner/wing-common/hardware/libhardware/display/display.cpp

static int open_display(const struct hw_module_t* module, const char* name,
        struct hw_device_t** device)
{
// ... 代碼省略
ctx->device.issupporthdminativemode = display_issupporthdminativemode;
// ... 代碼省略
    return status;
}

// 實現的地方
int display_issupporthdminativemode(struct display_device_t *dev,int mode)
{
    struct display_context_t* ctx = (struct display_context_t*)dev;

    if(ctx)
    {
        if(ctx->mFD_disp)
        {
            unsigned long args[4];

            args[0] = 0;
    // 這里通過最開始傳進來的 DISPLAY_TVFORMAT_1080P_60HZ ...
    // 實際上是查表 g_tv_para[]  mode 跟 g_tv_para[ i].mode 比較。
    // 將得到的 g_tv_para[ i].driver_mode  通過 ioctl 傳遞給驅動
            args[1] = display_get_driver_tv_format(mode);
    // 這里是往設備驅動發送 DISP_CMD_HDMI_NATIVE_SUPPORT_MODE 命令
            if(ioctl(ctx->mFD_disp,DISP_CMD_HDMI_NATIVE_SUPPORT_MODE,args))
            {
                return 1;
            }
        }
    }

    return  0;
}
// 這里就是它的實現,從代碼上很容易看到是在查表
static int display_get_driver_tv_format(int format)
{
    unsigned int i = 0;

    for(i=0; i<sizeof(g_tv_para)/sizeof(struct tv_para_t); i++)
    {
        if(g_tv_para[ i].mode == format)
        {
            return g_tv_para[ i].driver_mode;
        }
    }

    return -1;
}
// 這里就是這張表的樣子
struct tv_para_t
{
    int type;// bit3:cvbs, bit2:ypbpr, bit1:vga, bit0:hdmi
    int mode;
    int width;
    int height;
    int valid_width;
    int valid_height;
    int driver_mode;
};
static struct tv_para_t g_tv_para[]=
{
    {8, DISPLAY_TVFORMAT_NTSC,             720,    480,    690,    450,    DISP_TV_MOD_NTSC},
    {8, DISPLAY_TVFORMAT_PAL,              720,    576,    690,    546,    DISP_TV_MOD_PAL},
    {8, DISPLAY_TVFORMAT_PAL_M,            720,    576,    690,    546,    DISP_TV_MOD_PAL_M},
    {8, DISPLAY_TVFORMAT_PAL_NC,           720,    576,    690,    546,    DISP_TV_MOD_PAL_NC},

    {5, DISPLAY_TVFORMAT_480I,             720,    480,    690,    450,    DISP_TV_MOD_480I},
    {5, DISPLAY_TVFORMAT_576I,             720,    576,    690,    546,    DISP_TV_MOD_576I},
    {5, DISPLAY_TVFORMAT_480P,             720,    480,    690,    450,    DISP_TV_MOD_480P},
    {5, DISPLAY_TVFORMAT_576P,             720,    576,    690,    546,    DISP_TV_MOD_576P},
    {5, DISPLAY_TVFORMAT_720P_50HZ,        1280,   720,    1220,   690,    DISP_TV_MOD_720P_50HZ},
    {5, DISPLAY_TVFORMAT_720P_60HZ,        1280,   720,    1220,   690,    DISP_TV_MOD_720P_60HZ},
    {5, DISPLAY_TVFORMAT_1080I_50HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080I_50HZ},
    {5, DISPLAY_TVFORMAT_1080I_60HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080I_60HZ},
    {1, DISPLAY_TVFORMAT_1080P_24HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080P_24HZ},
    {5, DISPLAY_TVFORMAT_1080P_50HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080P_50HZ},
    {5, DISPLAY_TVFORMAT_1080P_60HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080P_60HZ},
    {1, DISPLAY_TVFORMAT_1080P_25HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080P_25HZ},
    {1, DISPLAY_TVFORMAT_1080P_30HZ,       1920,   1080,   1880,   1040,   DISP_TV_MOD_1080P_30HZ},

    {1, DISPLAY_TVFORMAT_1080P_24HZ_3D_FP, 1920,   1080,   1920,   1080,   DISP_TV_MOD_1080P_24HZ_3D_FP},
    {1, DISPLAY_TVFORMAT_720P_50HZ_3D_FP,  1280,   720,    1280,   720,    DISP_TV_MOD_720P_50HZ_3D_FP},
    {1, DISPLAY_TVFORMAT_720P_60HZ_3D_FP,  1280,   720,    1280,   720,    DISP_TV_MOD_720P_60HZ_3D_FP},

    {2, DISPLAY_VGA_H1680_V1050,           1668,   1050,   1668,   1050,   DISP_VGA_H1680_V1050},
    {2, DISPLAY_VGA_H1440_V900,            1440,   900,    1440,   900,    DISP_VGA_H1440_V900},
    {2, DISPLAY_VGA_H1360_V768,            1360,   768,    1360,   768,    DISP_VGA_H1360_V768},
    {2, DISPLAY_VGA_H1280_V1024,           1280,   1024,   1280,   1024,   DISP_VGA_H1280_V1024},
    {2, DISPLAY_VGA_H1024_V768,            1024,   768,    1204,   768,    DISP_VGA_H1024_V768},
    {2, DISPLAY_VGA_H800_V600,             800,    600,    800,    600,    DISP_VGA_H800_V600},
    {2, DISPLAY_VGA_H640_V480,             640,    480,    640,    480,    DISP_VGA_H640_V480},
    {2, DISPLAY_VGA_H1440_V900_RB,         1440,   900,    1440,   900,    DISP_VGA_H1440_V900},
    {2, DISPLAY_VGA_H1920_V1080,           1920,   1080,   1920,   1080,   DISP_VGA_H1920_V1080},
    {2, DISPLAY_VGA_H1280_V720,            1280,   720,    1280,   720,    DISP_VGA_H1280_V720},
};

// 繼續分析 先看 DISP_CMD_HDMI_NATIVE_SUPPORT_MODE 命令的定義
android/device/softwinner/common/hardware/include/drv_display.h
typedef enum tag_DISP_CMD
{   
// ... 省略
//----hdmi----
    DISP_CMD_HDMI_ON             = 0x1c0,
    DISP_CMD_HDMI_OFF            = 0x1c1,
    DISP_CMD_HDMI_SET_MODE       = 0x1c2,
    DISP_CMD_HDMI_GET_MODE       = 0x1c3,
    DISP_CMD_HDMI_SUPPORT_MODE   = 0x1c4,
    DISP_CMD_HDMI_GET_HPD_STATUS = 0x1c5,
    DISP_CMD_HDMI_SET_SRC        = 0x1c6,
    DISP_CMD_HDMI_NATIVE_SUPPORT_MODE = 0x1c7,  <----
// ... 省略
}

接下來分析Linux 設備驅動接到這個命令之后會怎么處理。
lichee/linux-3.4/include/linux/drv_display.h
typedef enum tag_DISP_CMD
{
    // ... 省略
    //----hdmi----
    DISP_CMD_HDMI_ON                        = 0x1c0,
    DISP_CMD_HDMI_OFF                       = 0x1c1,
    DISP_CMD_HDMI_SET_MODE                  = 0x1c2,
    DISP_CMD_HDMI_GET_MODE                  = 0x1c3,
    DISP_CMD_HDMI_SUPPORT_MODE              = 0x1c4,
    DISP_CMD_HDMI_GET_HPD_STATUS            = 0x1c5,
    DISP_CMD_HDMI_SET_SRC                   = 0x1c6,
    DISP_CMD_HDMI_NATIVE_SUPPORT_MODE = 0x1c7, <----

}__disp_cmd_t;

看看接收到這個命令之后做了些什么: 這里是驅動程序
linux-3.4/drivers/video/sun7i/disp/dev_disp.c
long disp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
// ... 省略一些代碼
        switch(cmd)
        {
// ... 省略一大波 case 代碼
    // 這里調用了 BSP_disp_hdmi_check_native_support_mode()
    case DISP_CMD_HDMI_NATIVE_SUPPORT_MODE:
ret = BSP_disp_hdmi_check_native_support_mode(ubuffer[0], ubuffer[1]);
break;

// ... 省略一大波 case 代碼
default:
break;
        }

return ret;
}
定義在 linux-3.4\drivers\video\sun7i\disp\de_bsp\de\disp_display.h
extern __s32 BSP_disp_hdmi_check_native_support_mode(__u32 sel, __u8  mode);

看看 BSP_disp_hdmi_check_native_support_mode() 是怎么實現的
linux-3.4/drivers/video/sun7i/disp/de_bsp/de/disp_hdmi.c
__s32 BSP_disp_hdmi_check_native_support_mode(__u32 sel, __u8 mode)
{
    if(gdisp.init_para.hdmi_native_mode_support)
    {
// 如果該函數指針有被賦值則調用 尼瑪... 又來一次...
        return gdisp.init_para.hdmi_native_mode_support(mode);
    }
    else
    {
        DE_WRN("hdmi_native_mode_support is NULL\n");
        return DIS_NOT_SUPPORT;
    }
}
gdisp的結構體定義在這:linux-3.4\drivers\video\sun7i\disp\de_bsp\de\disp_display.h
typedef struct
{
    __disp_bsp_init_para    init_para;//para from driver
// ... 省略
}__disp_dev_t;

extern __disp_dev_t gdisp;

__disp_bsp_init_para 結構體定義
typedef struct
{
// ... 省略
// 這里新增了一個成員
__s32 (*hdmi_native_mode_support)(__disp_tv_mode_t mode);   
}__disp_bsp_init_para;

看 gdisp.init_para 初始化的地方:linux-3.4/drivers/video/sun7i/disp/de_bsp/de/disp_hdmi.c
__s32 BSP_disp_set_hdmi_func(__disp_hdmi_func * func)
{
// ... 省略代碼
// ... 無語了,又來...
gdisp.init_para.hdmi_native_mode_support = func->hdmi_native_mode_support;
    return DIS_SUCCESS;
}

hdmi_native_mode_support()是 fun的成員,先看看 fun 的結構 __disp_hdmi_func 這個結構體。
lichee/linux-3.4/include/linux/drv_display.h
typedef struct
{
    // ... 省略
// 新增的
__s32 (*hdmi_native_mode_support)(__disp_tv_mode_t mode);
}__disp_hdmi_func;

好了,接著看誰調用了這個 BSP_disp_set_hdmi_func(),往上跟,看func到底指向了哪個函數
linux-3.4\drivers\video\sun7i\disp\Dev_disp.c
__s32 disp_set_hdmi_func(__disp_hdmi_func * func)
{
        BSP_disp_set_hdmi_func(func);
        return 0;
}

看誰調用了 disp_set_hdmi_func()
linux-3.4\drivers\video\sun7i\hdmi\drv_hdmi.c
__s32 Hdmi_init(void)
{
// ... 省略代碼
// 終于找到了,在這里賦值
disp_func.hdmi_native_mode_support = Hdmi_native_mode_support;
// 在這里調用了 disp_set_hdmi_func()
disp_set_hdmi_func(&disp_func);

    return 0;
}

看看 Hdmi_native_mode_support() 的實現
__s32 Hdmi_native_mode_support(__disp_tv_mode_t mode)
{
__u32 hdmi_mode;

switch(mode)
{
case DISP_TV_MOD_480I:
hdmi_mode = HDMI1440_480I;
break;

case DISP_TV_MOD_576I:
hdmi_mode = HDMI1440_576I;
break;

case DISP_TV_MOD_480P:
hdmi_mode = HDMI480P;
break;

case DISP_TV_MOD_576P:
hdmi_mode = HDMI576P;
break;  

case DISP_TV_MOD_720P_50HZ:
hdmi_mode = HDMI720P_50;
break;

case DISP_TV_MOD_720P_60HZ:
hdmi_mode = HDMI720P_60;
break;

case DISP_TV_MOD_1080I_50HZ:
hdmi_mode = HDMI1080I_50;
break;

case DISP_TV_MOD_1080I_60HZ:
hdmi_mode = HDMI1080I_60;
break;         

case DISP_TV_MOD_1080P_24HZ:
hdmi_mode = HDMI1080P_24;
break;   

case DISP_TV_MOD_1080P_50HZ:
hdmi_mode = HDMI1080P_50;
break;

case DISP_TV_MOD_1080P_60HZ:
hdmi_mode = HDMI1080P_60;
break;  

case DISP_TV_MOD_1080P_25HZ:
hdmi_mode = HDMI1080P_25;
break;  

case DISP_TV_MOD_1080P_30HZ:
hdmi_mode = HDMI1080P_30;
break;  

case DISP_TV_MOD_1080P_24HZ_3D_FP:
hdmi_mode = HDMI1080P_24_3D_FP;
break;

case DISP_TV_MOD_720P_50HZ_3D_FP:
hdmi_mode = HDMI720P_50_3D_FP;
break;

case DISP_TV_MOD_720P_60HZ_3D_FP:
hdmi_mode = HDMI720P_60_3D_FP;
break;

default:
hdmi_mode = HDMI720P_50;
break;
}
// 竟然。。。。。。
return Hdmi_hal_native_mode_support(hdmi_mode);
}

繼續分析 Hdmi_hal_native_mode_support()

聲明在此:
linux-3.4\drivers\video\sun7i\hdmi/hdmi_hal.h
extern __s32 Hdmi_hal_native_mode_support(__u32 mode);

實現在此:
linux-3.4\drivers\video\sun7i\hdmi\aw\hdmi_hal.c
__s32 Hdmi_hal_native_mode_support(__u32 mode)
{
    if(Hpd_Check() == 0)
    {
        return 0;
    }
    else
    {
int counter = 1000;
// hdmi_state < 5 ???  應該是等待 接收 電視中傳過來的數據 里面包含有分辨率這些信息
        while(hdmi_state < HDMI_State_Wait_Video_config && counter--)
        {
            hdmi_delay_ms(1);
        }
// 這里實際上是查詢上層傳遞下來的分辨率是否被支持
        return Device_Native_Support_VIC[mode];
    }
}

先看看數組的定義:
linux-3.4\drivers/video/sun7i/hdmi/aw/hdmi_core.h
extern __u8Device_Native_Support_VIC[512];
linux-3.4\drivers/video/sun7i/hdmi/aw/hdmi_core.c
__u8 Device_Native_Support_VIC[512];

賦值在這里:
linux-3.4\drivers\video\sun7i\hdmi\aw\hdmi_edid.c
// 看樣子這里還不是關鍵
__s32 Parse_VideoData_Block(__u8 *pbuf,__u8 size)
{
int i=0;
while(i<size)
{
Device_Support_VIC[pbuf[ i] &0x7f] = 1;
if(pbuf[ i] &0x80)
{
   __inf("Parse_VideoData_Block: VIC %d(native) support\n", pbuf[ i]&0x7f);
   // 這里是記錄對應的電視機上支持哪些分辨率 1 表示支持
   Device_Native_Support_VIC[pbuf[ i] &0x7f] = 1;
}
else
{
   __inf("Parse_VideoData_Block: VIC %d support\n", pbuf[ i]);
}
i++;
}
return 0;
}

通過搜索,看看哪個地方調用了該函數:
linux-3.4\drivers\video\sun7i\hdmi\aw\hdmi_edid.c
這個函數涉及到芯片的HDMI控制器,比較復雜,要是真的深入分析的話,估計要花上好一段時間.
__s32 ParseEDID(void)
{
    //collect the EDID ucdata of segment 0
    __u8 BlockCount ;
    __u32 i,offset ;

    __inf("ParseEDID\n");

    memset(Device_Support_VIC,0,sizeof(Device_Support_VIC));
// 這里清空了該數組,也就是說,默認全為 0
    memset(Device_Native_Support_VIC,0,sizeof(Device_Native_Support_VIC));
    memset(EDID_Buf,0,sizeof(EDID_Buf));
    isHDMI = 0;
    YCbCr444_Support = 0;
DDC_Init(); // 初始化DDC 、使能、復位DDC、設置DDC時鐘

    GetEDIDData(0, EDID_Buf);// 讀取數據
// 校驗數據
if( EDID_CheckSum(0, EDID_Buf) != 0)
{
return 0;
}
// 校驗數據頭
if( EDID_Header_Check(EDID_Buf)!= 0)
{
return 0;
}
// 檢查版本
if( EDID_Version_Check(EDID_Buf)!= 0)
{
return 0;
}
Parse_DTD_Block(EDID_Buf + 0x36);

Parse_DTD_Block(EDID_Buf + 0x48);

    BlockCount = EDID_Buf[0x7E];

    if( BlockCount > 0 )
    {
    if ( BlockCount > 4 )
    {
        BlockCount = 4 ;
    }
// 讀取所有數據塊
    for( i = 1 ; i <= BlockCount ; i++ )
    {
        GetEDIDData(i, EDID_Buf) ;  
        if( EDID_CheckSum(i, EDID_Buf)!= 0)
        {
        return 0;
        }

if((EDID_Buf[0x80*i+0]==2)/*&&(EDID_Buf[0x80*i+1]==1)*/)
{
if( (EDID_Buf[0x80*i+1]>=1))
{
if(EDID_Buf[0x80*i+3]&0x20)
{
YCbCr444_Support = 1;
__inf("device support YCbCr44 output\n");
if(rgb_only == 1)
{
__inf("rgb only test!\n");
YCbCr444_Support = 0;
}
}
}

offset = EDID_Buf[0x80*i+2];
if(offset > 4)//deal with reserved data block
{
__u8 bsum = 4;
while(bsum < offset)
{
__u8 tag = EDID_Buf[0x80*i+bsum]>>5;
__u8 len = EDID_Buf[0x80*i+bsum]&0x1f;
if( (len >0) && ((bsum + len + 1) > offset) )
{
    __inf("len or bsum size error\n");
return 0;
}else
{
if( tag == 1)//ADB
{
Parse_AudioData_Block(EDID_Buf+0x80*i+bsum+1,len);
}
else if( tag == 2)//VDB
{// 記錄下來
Parse_VideoData_Block(EDID_Buf+0x80*i+bsum+1,len);
}
else if( tag == 3)//vendor specific
{
Parse_HDMI_VSDB(EDID_Buf+0x80*i+bsum+1,len);
}
}

bsum += (len +1);
}

}else
{
__inf("no data in reserved block%d\n",i);
}

if(offset >= 4)//deal with 18-byte timing block
{
while(offset < (0x80-18))
{
Parse_DTD_Block(EDID_Buf + 0x80*i + offset);
offset += 18;
}
}else
{
__inf("no datail timing in block%d\n",i);
}
}

    }
    }

    return 0 ;
}

最后總結:
當HDMI接入時,會通過HDMI控制器得到電視的一些信息并且保存起來,而 getSuitableHdmiNativeMode() 這個接口
實際上只是在已被保存下來的信息中查詢得到該電視最高支持的分辨率。
        不得不吐槽下,為了實現這個功能,繞來繞去的。。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
日韩欧美性视频| 亚洲国产最新| 国产小视频免费在线观看| 福利视频1000| 99re6在线视频精品免费| 天天射,天天干| 国产a级免费视频| 国产又粗又猛又黄又爽无遮挡| 日本一本高清视频| 国产大片中文字幕| 一区二区三区视频免费看| 日本免费一二三区| 国产一级中文字幕| 天堂网一区二区三区| 男人的天堂一区二区| 日韩欧美国产亚洲| 日本黄色中文字幕| 99久久久国产精品无码免费| 亚洲国产精品成人久久蜜臀| 色婷婷av一区二区三| www.一区二区三区.com| 无国产精品白浆是免费| 国内精品麻豆| 免费偷拍视频网站| 五月天电影免费在线观看一区| 麻豆免费视频网站入口| 毛片一级免费一级| 麻豆av电影在线观看| 在线观看黄av| 高潮在线视频| 精品国产乱码一区二区三区| 老牛影视av一区二区在线观看| 色天天色综合| 在线中文字幕第一区| 久久三级福利| 国产福利一区二区三区视频在线| 91捆绑美女网站| 亚洲欧洲日韩一区二区三区| 黄色成人av在线| 欧美性生活影院| 亚洲国产精品久久91精品| 中文字幕日韩av电影| 国内精品美女av在线播放| 国产精品久久久久久久久久尿| 动漫一区二区在线| 自拍亚洲欧美老师丝袜| 成年人视频观看| 日本wwwxx| 69夜色精品国产69乱| 黄瓜视频在线免费观看| 少妇无码一区二区三区| 夜夜骑日日射| 精品一二三四| ****av在线网毛片| 成功精品影院| 在线观看视频日韩| 粉嫩av一区二区三区粉嫩| 亚洲人成亚洲人成在线观看图片 | 国产色一区二区三区| 粉色视频免费看| 正在播放国产对白害羞| 国产又粗又猛又黄视频| 亚洲欧美日韩动漫| 夜色av.com| 国产日韩精品在线看| 中国字幕a在线看韩国电影| 青青操综合网| 日韩综合一区二区| 中文字幕在线观看一区二区| 91精品在线观看国产| 国产精品最新自拍| 中文文精品字幕一区二区| 欧美熟乱第一页| 久久成人在线视频| 国产伦精品一区二区三区照片91| 成人免费在线网| 成人无码www在线看免费| 国产一级做a爱片久久毛片a| 男人天堂va| 在线免费看黄av| 在线成人av观看| 成人网18免费网站| 东方aⅴ免费观看久久av| 欧美日韩免费区域视频在线观看| 日韩精品在线视频美女| 成人a在线观看| 日韩精品在线观看av| av小说在线观看| 国产乱码一区二区| 天天干天天舔| 在线看片国产福利你懂的| 成人精品视频| 粉嫩嫩av羞羞动漫久久久| 欧美中文字幕一区二区三区亚洲| 久久综合电影一区| 牛人盗摄一区二区三区视频| 99精品视频国产| 日韩久久久久久久久| 欧美图片欧美激情欧美精品| 国际av在线| 成人看片黄a免费看视频| 日日摸夜夜添夜夜添亚洲女人| 亚洲最大成人网4388xx| 中国日韩欧美久久久久久久久| 成人综合电影| 欧美人与性动交α欧美精品| 亚洲中文一区二区三区| 成人免费网址在线| 日韩高清成人| 天堂午夜影视日韩欧美一区二区| 亚洲你懂的在线视频| 在线不卡国产精品| 日产精品高清视频免费| 久久精品视频18| 美女扒开尿口让男人操| 二区三区在线| 日韩国产一区二区三区| 国产精品久久三| 爽爽爽爽爽爽爽成人免费观看| 久久资源av| 精品无码人妻一区| 久久久久免费网站| 18网站在线观看| 亚洲国产专区校园欧美| 亚洲电影在线播放| 高清亚洲成在人网站天堂| 蜜桃视频一区二区在线观看| 久久久久久久黄色| 成 人免费视频播放| 电影天堂国产精品| 免费成人美女在线观看.| 色噜噜狠狠色综合中国| 国产精品高精视频免费| 日韩精品视频一二三| 97人妻精品一区二区三区软件 | 三级全黄的视频在线观看| 欧美sm一区| 久久久精品性| 欧美一区二区三区四区久久| 国产v亚洲v天堂无码| 一起草在线视频| 最近中文字幕mv免费高清视频8| 婷婷五月在线视频| 亚洲一本视频| 在线中文字幕不卡| 成人免费网站在线看| 日韩av成人网| 亚洲精品在线播放视频| 欧美电影免费观看| 国产精品资源网站| 亚洲欧美国产另类| av影院在线播放| 五月婷婷激情视频| 亚洲aⅴ优女av综合久久久| 欧美激情偷拍自拍| 色综合中文字幕国产| 91免费的视频在线播放| 国精品无码人妻一区二区三区| 国产高清免费视频| 亚洲人成网站在线在线观看| 久久综合久久久久88| 久久99精品国产99久久6尤物| 欧美性久久久久| 精品人妻一区二区三区麻豆91 | 91麻豆精品久久毛片一级| 人人插人人干| 粉嫩久久久久久久极品| 国产精品麻豆久久久| 91精品国产免费久久久久久| 久久久久久综合网| 欧美白人最猛性xxxxx| 久久91视频| 久久视频一区二区| 91国在线精品国内播放| 荫蒂被男人添免费视频| 污污美女网站| 欧美亚洲tv| 一本到不卡免费一区二区| 国产精品二区在线| 免费在线观看黄视频| 国产超碰在线| 狠狠爱成人网| 欧美精品一区二区在线观看| 17c丨国产丨精品视频| 夜夜爽8888| caoprom在线| 91片黄在线观看| 日本精品久久久久影院| 黄色短视频在线观看| 毛片av免费观看| 久久激情电影| 91精品国产综合久久久久久久 | 国产一区二区三区高清视频| 国产精选第一页| 77导航福利在线| 激情丁香综合五月| 欧美精品久久久久久久免费观看| 久久久久亚洲av无码网站| 色橹橹高清视频在线播放| 不卡在线一区| 欧美mv日韩mv| 北条麻妃视频在线| 国产精品视频一区麻豆| 亚洲福利网站| 欧美精品久久99久久在免费线 | 久久夜色精品亚洲噜噜国产mv| 五月天视频在线观看| 日本三级电影免费观看| 日韩欧美精品综合| 欧美tickling网站挠脚心| 37pao成人国产永久免费视频| 欧美日溪乱毛片| 天堂成人娱乐在线视频免费播放网站| 在线一区二区三区四区五区| av日韩在线看| 亚洲国产成人影院播放| 欧美人体视频| 欧美日韩一区精品| 极品美女扒开粉嫩小泬| 国产一线天粉嫩馒头极品av| 国产a久久精品一区二区三区 | 久久久久国产一区| 成网站在线观看人免费| 亚洲手机在线| 久久精品视频播放| 午夜在线观看一区| 国产精品久久一区二区三区不卡 | 午夜视频在线观看免费视频| 不卡av在线网| 91精品啪在线观看麻豆免费| 69成人免费视频| 欧美大片高清| 日韩欧美一区二区三区久久| avav在线播放| 国产成人禁片在线观看| 欧美精品播放| 久热精品视频在线免费观看| 懂色av粉嫩av浪潮av| 黄色大片在线播放| 国产精品久久免费看| 日韩中文字幕av在线| 亚洲人成影院77777| 三上亚洲一区二区| 日韩亚洲在线观看| 色哟哟一一国产精品| 春色校园综合激情亚洲| 岛国精品视频在线播放| 91专区在线观看| 色先锋av影音| 麻豆精品在线播放| 国产视频999| 国产成人av免费看| 欧美一级全黄| 怡红院精品视频| 国产稀缺精品盗摄盗拍| 嗯~啊~轻一点视频日本在线观看| 亚洲国产视频一区| www国产精品内射老熟女| 18av千部影片| 国产精品18久久久久久久久久久久 | 欧美艳星介绍134位艳星| 精品视频在线观看日韩| 最近中文字幕免费| www在线看| 日本韩国欧美一区二区三区| 久久久精品高清| 黄色在线视频观看网站| 国产精品高潮久久久久无| 黄色污污在线观看| av影音资源网| 粉嫩在线一区二区三区视频| 久久精品国产第一区二区三区最新章节| 亚洲日本伊人| 精品电影一区| 国产精品久久一区| 精品区在线观看| 午夜影院欧美| 2018日韩中文字幕| 一道本在线视频| 日韩毛片视频| 欧美中文字幕视频| 成人h动漫精品一区二区无码| 色综合久久网| 2019中文字幕在线观看| 国产aⅴ一区二区三区| 久久精品免费一区二区三区| 欧美亚洲日本网站| www.av日韩| 精品二区久久| 97人人做人人人难人人做| 最新国产热播激情视频| 日本网站在线观看一区二区三区 | 91精品美女在线| 免费a级片在线观看| 欧美成人久久| 成人免费直播live| 亚洲欧美精选| 国产一区二区成人久久免费影院| 欧美精品久久久| wwwwwww色| 国产亚洲欧美一区在线观看| 欧美在线观看www| 国产高清免费av在线| 色综合色狠狠天天综合色| 亚洲视频 中文字幕| 午夜影院一区| 精品视频在线播放| 2019日韩中文字幕mv| 很黄很污的网站| 国产精品国产三级国产aⅴ入口| 日韩久久一级片| 蜜桃视频在线观看免费视频网站www| 色综合色狠狠综合色| 日韩女同一区二区三区 | 国产一二三四视频| 9999久久久久| 久久久综合免费视频| 少妇喷水在线观看| 国内久久婷婷综合| 国产又粗又长又爽视频| 你懂的在线视频| 色欧美日韩亚洲| 青青草自拍偷拍| 蜜桃久久久久| 国产精品白嫩美女在线观看| 欧美性free免费| 成人免费视频caoporn| 精品这里只有精品| 欧美24videosex性欧美| 亚洲精品久久久久久久久久久久久 | 日韩精品一区二区三区在线视频| 欧美一区在线观看视频| 国产做受高潮69| 亚洲国产aⅴ精品| 91丨九色丨尤物| 一区二区三区免费播放| 最新欧美色图| 超碰97人人做人人爱少妇| 无码国产精品96久久久久| 国产麻豆精品视频| 欧美xxxxx在线视频| a毛片不卡免费看片| 中文国产成人精品久久一| 空姐吹箫视频大全| 国产成人高清视频| av无码精品一区二区三区| 手机av在线| 欧美肥婆姓交大片| 九色国产视频| 亚洲欧洲日韩综合一区二区| 9.1成人看片| 最新国产一区| 国产综合av一区二区三区| 三级国产三级在线| 欧美一区2区视频在线观看| 人人妻人人爽人人澡人人精品| 老司机午夜免费精品视频| 久在线观看视频| 日韩国产网站| 91av在线影院| av色资源站| 欧美午夜不卡视频| 高清乱码免费看污| 日韩av成人高清| 成年人免费在线播放| 78精品国产综合久久香蕉| 97久久精品视频| 成人免费毛片糖心| 欧美一区2区| 日韩精品欧美一区二区三区| 麻豆视频在线观看免费网站| 亚洲天堂免费视频| 四虎影视免费看电影| 日韩一区在线看| 91狠狠综合久久久| 亚洲一级在线| 情侣黄网站免费看| 日本亚洲视频| 国产a一区二区| av大片在线看| 日韩有码片在线观看| 国产精品亚洲色图| 婷婷综合另类小说色区| 精品人妻一区二区色欲产成人| 麻豆精品久久精品色综合| 欧美成人福利在线观看| 久久99精品久久久久久欧洲站| 国产一区二区不卡视频| 在线中文资源天堂| 免费91麻豆精品国产自产在线观看| 国产精品久久久久久久久鸭| 欧美日韩激情视频8区| 无码人妻丰满熟妇精品区| 国产91精品入口| 欧洲女同同性吃奶| 亚洲网站在线| 女人扒开屁股爽桶30分钟| 这里视频有精品| 欧美一级二级三级九九九| 波多野结衣在线观看|