在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談按鍵驅(qū)動(dòng)的編寫(xiě)和設(shè)備樹(shù)的修改

YCqV_FPGA_EETre ? 來(lái)源:未知 ? 2019-11-28 17:48 ? 次閱讀

引言

隨著深度學(xué)習(xí)5G的應(yīng)用,對(duì)FPGA的功能要求越來(lái)越多。因此近幾年FPGA大廠紛紛將自己的器件集成了更多的內(nèi)核,比如賽靈思的zynq系列就集成了armGPU,PCIE,射頻處理模塊等等,用于滿足各種各樣的需求。出身FPGA的工程師們也必須擁抱這些變化,不僅僅要精通FPGA開(kāi)發(fā),還需要了解其他方面的知識(shí)。比如基于zynq的開(kāi)發(fā)者,就需要了解arm,linux驅(qū)動(dòng)以及l(fā)inux系統(tǒng)。做深度學(xué)習(xí)加速的還需要了解深度學(xué)習(xí)網(wǎng)絡(luò)以及網(wǎng)絡(luò)壓縮等知識(shí)。學(xué)習(xí)這些知識(shí)會(huì)讓你的眼界更加開(kāi)闊,會(huì)站得高看得遠(yuǎn),在開(kāi)始一項(xiàng)任務(wù)的時(shí)候不再是盲人摸象,而是高瞻遠(yuǎn)矚,把握全局。

這是我介紹linux系統(tǒng)和驅(qū)動(dòng)的第4篇文章,如有不恰當(dāng)?shù)牡胤綒g迎指正,因?yàn)楸救艘彩翘幱趯W(xué)習(xí)入門(mén)階段。三人行,必有我?guī)熝伞S懻摰亩嗔耍瑔?wèn)題也就清晰了。這一篇主要介紹按鍵驅(qū)動(dòng)的編寫(xiě),了解中斷的處理過(guò)程,以及設(shè)備樹(shù)的修改。

1. vivado工程搭建

工程搭建很簡(jiǎn)單,就是配置完zynq核的外設(shè)后,增加一個(gè)axi_gpio模塊,作為外部按鍵的接口。雖然按鍵并不是直接連接到arm的IO上,但是axi_gpio也被映射到zynq系統(tǒng)的內(nèi)存空間中,linux驅(qū)動(dòng)通過(guò)讀寫(xiě)key對(duì)應(yīng)的映射內(nèi)存來(lái)控制和檢測(cè)。要檢測(cè)到key被按下我們必須開(kāi)啟中斷,因此axi_gpio模塊設(shè)置如下圖。Address editor是gpio的對(duì)應(yīng)的內(nèi)存空間。Zynq已經(jīng)為不同外設(shè)類型分配了可選的內(nèi)存映射,通常工程建立完后,由軟件工具自行分配就好了。如果一些外設(shè)內(nèi)存有沖突,是無(wú)法生成hdf的。


配置完成后,進(jìn)行管腳約束,然后綜合實(shí)現(xiàn),生成bit文件。再導(dǎo)出hdf文件,打開(kāi)SDK來(lái)生成fsbl,u-boot還使用前幾篇介紹驅(qū)動(dòng)中的u-boot。U-boot通常不會(huì)因?yàn)轵?qū)動(dòng)的新增而修改。但是由于增加了key按鍵,我們需要去設(shè)備樹(shù)中修改對(duì)應(yīng)的配置。

具體如何修改設(shè)備樹(shù),可以到linux驅(qū)動(dòng)文件夾Documentation/devicetree中去尋找對(duì)應(yīng)的外設(shè)文件,其中有設(shè)備樹(shù)修改的介紹。Gpio的修改可以到gpio文件夾下的gpio-zynq.txt查看。其基本形式為:

         gpio@e000a000 { #gpio-cells = <2>;
                   compatible = "xlnx,zynq-gpio-1.0";
                   clocks = <&clkc 42>;
                   gpio-controller;
                   interrupt-parent = <&intc>;
                   interrupts = <0 20 4>;
                   interrupt-controller;
                   #interrupt-cells = <2>;
                   reg = <0xe000a000 0x1000>; };
其中compatible主要是用于linux驅(qū)動(dòng)去匹配設(shè)備樹(shù)中相應(yīng)的節(jié)點(diǎn),后面我們會(huì)介紹,這個(gè)名字和那一塊程序有關(guān)。主要是配置中斷,其中interrupts-cell指定了interrupts有多少個(gè)屬性。Interrupts的第一個(gè)屬性是中斷類型,第二個(gè)是中斷號(hào),最后一個(gè)表示觸發(fā)類型:高電平觸發(fā)、低電平觸發(fā)、上升沿觸發(fā)和下降沿觸發(fā)四種類型。Interrupt-parent是中斷所屬的中斷控制器。我們?cè)赟DK中產(chǎn)生了設(shè)備樹(shù),我們看到按鍵的相應(yīng)節(jié)點(diǎn)位于amba_pl節(jié)點(diǎn)下,其中amba_pl是PL端的總線節(jié)點(diǎn),而amba是PS端的總線節(jié)點(diǎn),修改pl.dtsi中的gpio內(nèi)容:

我們改了compitable的內(nèi)容,同時(shí)要關(guān)注inerrupts,xlnx,all-inputs,xlnx,gpio-width這些屬性。Gpio-width是寬度,all-inputs是表示為輸入。

設(shè)備樹(shù)修改完后就可以編譯設(shè)備樹(shù)文件,然后用fsbl,u-boot,設(shè)備樹(shù)來(lái)制作boot.bin了。放到SD卡,啟動(dòng)linux系統(tǒng)。接下來(lái)進(jìn)入關(guān)鍵環(huán)節(jié),key驅(qū)動(dòng)的編寫(xiě)。

2. 按鍵驅(qū)動(dòng)代碼剖析

對(duì)于一個(gè)剛剛?cè)腴T(mén)的人來(lái)說(shuō),其實(shí)了解了驅(qū)動(dòng)的基本框架就好了。每個(gè)驅(qū)動(dòng)都按照它的框架進(jìn)行編寫(xiě)和修改。能理解驅(qū)動(dòng)的各個(gè)模塊功能,在驅(qū)動(dòng)調(diào)試或者編寫(xiě)中就能有的放矢。一個(gè)簡(jiǎn)單的驅(qū)動(dòng)的構(gòu)成也很復(fù)雜,代碼也很多,篇幅有限,我只介紹主要部分。

1)platform框架

Platform是一種虛擬的平臺(tái),提供了驅(qū)動(dòng)和具體硬件交互的接口。Platform_device類似于虛擬的總線,IIC,LCD,GPIO等外設(shè)都可以看做platform_device,通過(guò)它可以遍歷所有的總線設(shè)備,而對(duì)應(yīng)的驅(qū)動(dòng)就是platform_driver。基本流程是:先注冊(cè)platform_device,再注冊(cè)platform_driver,然后匹配設(shè)備和驅(qū)動(dòng),最后注冊(cè)整個(gè)驅(qū)動(dòng)。

在linux3以前的版本,需要定義platform_device結(jié)構(gòu)體,然后通過(guò)platform_device_register函數(shù)來(lái)注冊(cè)設(shè)備。但是linux3.0以后出現(xiàn)了設(shè)備樹(shù),內(nèi)核函數(shù)of_platform_default_populate_init會(huì)在內(nèi)核啟動(dòng)后遍歷設(shè)備樹(shù),自動(dòng)注冊(cè)每個(gè)節(jié)點(diǎn)對(duì)應(yīng)的設(shè)備。因此只需要修改設(shè)備樹(shù)參數(shù)就行了。首先看這個(gè)結(jié)構(gòu)體:

static const struct of_device_id key_of_match[] __devinitdata={
         {.compatible="xlnx,gpio-keys",},
         {/*end of list*/},
};

這實(shí)際上定義了設(shè)備的匹配號(hào),compatible就是在設(shè)備樹(shù)節(jié)點(diǎn)axi-gpio中對(duì)應(yīng)的節(jié)點(diǎn)匹配名稱。我們只要讓compitable和設(shè)備樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)的值匹配上就可以將節(jié)點(diǎn)對(duì)應(yīng)的設(shè)備注冊(cè)到總線上了。

platform_driver用于對(duì)設(shè)備的搜索和配置,主要就是去解析設(shè)備樹(shù),根據(jù)設(shè)備樹(shù)中節(jié)點(diǎn)信息來(lái)填充設(shè)備結(jié)構(gòu)體對(duì)應(yīng)信息或者直接對(duì)設(shè)備完成配置。

static struct platform_driver key_driver={
         .driver={
                   .name=DRIVER_NAME,
                   .owner=THIS_MODULE,
                   .of_match_table=key_of_match,
         },
         .probe=key_probe,
         .remove=key_remove,
};

我們主要關(guān)注其三個(gè)變量,of_match_table就是of_device_id結(jié)構(gòu)體定義的,用來(lái)匹配節(jié)點(diǎn)。Probe函數(shù)用來(lái)解析節(jié)點(diǎn),配置設(shè)備。Remove主要是釋放在probe中使用的資源等。

編寫(xiě)key驅(qū)動(dòng)主要就是去填充probe和remove兩個(gè)函數(shù)。

來(lái)看probe函數(shù)是如何查找到設(shè)備的一些屬性的,比如我們要確定key鍵的數(shù)量,那么我們可以這樣來(lái)做:

         if(of_property_read_u32(node, "xlnx,gpio-width", &width)){
                   printk(KERN_ERR "get the gpio-width
");
         }

通過(guò)匹配“xlnx,gpio-width”來(lái)獲得key的位寬,這個(gè)屬性就在設(shè)備中定義的。

如果我們要操作key,需要獲得key設(shè)備的內(nèi)存映射空間,這個(gè)可以通過(guò)函數(shù)platform_get_resource函數(shù)來(lái)完成。

mem=platform_get_resource(pdev, IORESOURCE_MEM, 0);
         if(!mem){
                   printk(KERN_ERR "get memory resource
");
                   return -ENODEV;
         }

第一個(gè)參數(shù)pdev是platform_device結(jié)構(gòu)體,在進(jìn)入probe函數(shù)之前就已經(jīng)被注冊(cè)了,其指向的就是key對(duì)應(yīng)的設(shè)備。第二個(gè)參數(shù)是類型,主要有IORESOURCE_MEM, IORESOURCE_IRQ等。最后一個(gè)參數(shù)是號(hào)碼,指示platform_device結(jié)構(gòu)體中不同的資源類型,即IORESOURCE類型。

以上獲得的mem就是在設(shè)備樹(shù)中由reg指定的內(nèi)存映射:

reg = <0x41210000 0x10000>;

中斷的獲得可以通過(guò)函數(shù):

       r_irq=irq_of_parse_and_map(node, 0);
         if(!r_irq){
                   printk(KERN_ERR "get interrupt
");
         }
其中device_node就是設(shè)備節(jié)點(diǎn),在platform_device注冊(cè)的時(shí)候,含有該節(jié)點(diǎn),所以可以通過(guò)該結(jié)構(gòu)體獲得。第二個(gè)參數(shù)表示一個(gè)設(shè)備樹(shù)節(jié)點(diǎn)有多個(gè)中斷時(shí)的索引

通過(guò)設(shè)備樹(shù)獲得了硬件信息后,我們將其填充到key_device中,key_device定義如下:

struct key_dev{
         struct cdev dev;
         struct work_struct work;                 
         int irq;
         int major;
         unsigned long start_addr;
         unsigned long size;
         void __iomem *baseaddr;
         int width;
         int inout;
         int key_prs;
        
};
其中irq為中斷號(hào),cdev是字符設(shè)備結(jié)構(gòu)體,因?yàn)閗ey等屬于字符設(shè)備。填充如下:
lp->start_addr=mem->start;
         lp->size=mem->end-mem->start;
         lp->irq=r_irq;
         lp->width=width;

2)中斷處理

在platform中我們談到了對(duì)中斷號(hào)的獲取,那么取得了中斷號(hào)之后如何來(lái)檢測(cè)中斷事件呢?中斷處理過(guò)程可以被分成兩部分:頂半部和底半步。頂半部主要處理硬件上比較緊急的事物,比如檢測(cè)中斷,底半部用于處理中斷產(chǎn)生之后需要進(jìn)行的事務(wù)處理。在底半部處理過(guò)程中不會(huì)耽誤檢測(cè)下一個(gè)中斷。這兩個(gè)部分不是絕對(duì)的,也可以只有一個(gè)部分。

驅(qū)動(dòng)中首先需要定義一個(gè)中斷函數(shù),用于中斷產(chǎn)生后進(jìn)行的操作。然后申請(qǐng)中斷,實(shí)現(xiàn)函數(shù):

err=request_irq(k_dev->irq,key_interrupt, IRQF_SHARED|IRQF_TRIGGER_RISING, DRIVER_NAME, k_dev);

第一個(gè)是中斷號(hào),第二個(gè)為中斷處理函數(shù),第三個(gè)參數(shù)為中斷產(chǎn)生類型,上升沿下降沿一類,第四個(gè)為名字,可以命名中斷,最后一個(gè)是設(shè)備結(jié)構(gòu)體。

釋放中斷就通過(guò)free_irq(unsigned int irq, void *dev_id)來(lái)完成。

實(shí)現(xiàn)中斷底半部處理機(jī)制主要有tasklet,工作隊(duì)列,軟中斷和線程化irq。中斷機(jī)制較為復(fù)雜,任何一種機(jī)制都可以讓你竭盡腦汁。入門(mén)者還是循序漸進(jìn),所以我也只用了一種簡(jiǎn)單的方法。類似鎖機(jī)制,我們定義一個(gè)事件:

static DECLARE_WAIT_QUEUE_HEAD(press_queue);
然后在中斷函數(shù)中喚醒這個(gè)事件,在其他函數(shù)中可以通過(guò)等待這個(gè)事件來(lái)進(jìn)行中斷處理。我們的中斷函數(shù)為:
static irqreturn_t key_interrupt(int irq, void *dev_id){
         struct key_dev *dev=dev_id;
         dev->key_prs++;
         printk(KERN_INFO "interruptted
");
         wake_up_interruptible(&press_queue);
         return IRQ_HANDLED;
 
}
而等待該事件放在key_read函數(shù)中:
ssize_t key_read(struct file *filp, char __user *buf, size_t count, loff_t *fops)
{
         int err;
         struct key_dev *dev=filp->private_data;        
         wait_event_interruptible(press_queue, event_press);
         event_press=0;
         err=copy_to_user(buf, &dev->key_prs, count);
         return err ? -EFAULT : 0;
}

3)文件結(jié)構(gòu)

Linux一切皆文件,任何驅(qū)動(dòng)最終都被封裝為一個(gè)文件,用戶空間通過(guò)讀寫(xiě)文件來(lái)操作驅(qū)動(dòng)。文件操作包括打開(kāi),關(guān)閉,讀和寫(xiě)等。我們不做具體介紹,簡(jiǎn)單列出文件結(jié)構(gòu)體為:

struct file_operations key_fops={
         .owner=THIS_MODULE,
         .open=key_open,
         .read=key_read,
         .release=key_close,
};
總結(jié)

對(duì)以上進(jìn)行總結(jié)就是:

1) 首先進(jìn)行設(shè)備樹(shù)節(jié)點(diǎn)屬性修改;

2) 填充platform框架下的probe,remove等函數(shù),并定義of_device_id和platform_driver結(jié)構(gòu)體;

3) 申請(qǐng)中斷,釋放中斷,編寫(xiě)中斷函數(shù)等;

4) 填充文件結(jié)構(gòu),編寫(xiě)open,close,read等函數(shù);

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21777

    瀏覽量

    604723
  • 5G
    5G
    +關(guān)注

    關(guān)注

    1356

    文章

    48491

    瀏覽量

    565105
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5510

    瀏覽量

    121345

原文標(biāo)題:【驅(qū)動(dòng)初發(fā)】如何在zynq上做個(gè)按鍵驅(qū)動(dòng)

文章出處:【微信號(hào):FPGA-EETrend,微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    i.MX6ULL 驅(qū)動(dòng)開(kāi)發(fā)7—按鍵輸入捕獲與GPIO輸入配置與高低電平讀取

    本篇主要介紹了i.MX6ULL的按鍵檢測(cè)的使用,主要的知識(shí)點(diǎn)是設(shè)備樹(shù)修改,以及GPIO的輸入配置與高低電平的讀取。
    的頭像 發(fā)表于 05-24 09:11 ?6302次閱讀
    i.MX6ULL <b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)7—<b class='flag-5'>按鍵</b>輸入捕獲與GPIO輸入配置與高低電平讀取

    linux驅(qū)動(dòng)編寫(xiě):從hello world到 LED驅(qū)動(dòng)

    的讀寫(xiě)操作等都被抽象成文件操作了。本篇從hello world開(kāi)始,簡(jiǎn)要介紹驅(qū)動(dòng)的基本結(jié)構(gòu),然后再進(jìn)一步介紹LED硬件的搭建,以及驅(qū)動(dòng)編寫(xiě)設(shè)備樹(shù)
    的頭像 發(fā)表于 11-29 10:28 ?2767次閱讀
    linux<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>編寫(xiě)</b>:從hello world到 LED<b class='flag-5'>驅(qū)動(dòng)</b>

    Linux 設(shè)備樹(shù)詳解

    信息,以供相應(yīng)的內(nèi)核代碼使用。編寫(xiě)設(shè)備樹(shù)文件是以.dts的文本文件存儲(chǔ)的,主要是為了修改、添加編輯方便。那么問(wèn)題來(lái)了,如果純文本解析的話,顯然比較慢且麻煩。譬如如果屬性值是一個(gè)I/O地
    發(fā)表于 10-19 15:53

    Linux 設(shè)備樹(shù)詳解

    信息,以供相應(yīng)的內(nèi)核代碼使用。編寫(xiě)設(shè)備樹(shù)文件是以.dts的文本文件存儲(chǔ)的,主要是為了修改、添加編輯方便。那么問(wèn)題來(lái)了,如果純文本解析的話,顯然比較慢且麻煩。譬如如果屬性值是一個(gè)I/O地
    發(fā)表于 11-02 13:46

    Linux 設(shè)備樹(shù)詳解

    信息,以供相應(yīng)的內(nèi)核代碼使用。編寫(xiě)設(shè)備樹(shù)文件是以.dts的文本文件存儲(chǔ)的,主要是為了修改、添加編輯方便。那么問(wèn)題來(lái)了,如果純文本解析的話,顯然比較慢且麻煩。譬如如果屬性值是一個(gè)I/O地
    發(fā)表于 11-29 17:58

    am437x基于linux4.1.18平臺(tái)移植按鍵驅(qū)動(dòng)失敗

    您好,我在am437x平臺(tái)上使用的是linux4.1.18內(nèi)核,添加按鍵驅(qū)動(dòng)總是失敗。我所做的步驟是: 1,修改設(shè)備樹(shù)xxx.dts,紅色為
    發(fā)表于 06-01 08:24

    「正點(diǎn)原子Linux連載」第五十五章設(shè)備樹(shù)下的platform驅(qū)動(dòng)編寫(xiě)

    platform驅(qū)動(dòng)即可。55.3.1 修改設(shè)備樹(shù)文件首先修改設(shè)備
    發(fā)表于 03-21 10:03

    如何修改內(nèi)核設(shè)備樹(shù)

    本文檔介紹了內(nèi)核設(shè)備樹(shù)的位置和包含關(guān)系 1.內(nèi)核設(shè)備樹(shù)位置 文件 備注 dts longan/device/config/chips/t507/configs/evb/board.dt
    發(fā)表于 12-14 13:42

    ARM Device Tree設(shè)備樹(shù)

    近期在學(xué)校如何寫(xiě)linux的設(shè)備驅(qū)動(dòng),這片文章告訴我們?yōu)槭裁匆M(jìn)設(shè)備樹(shù)Device Tree,以及舉例說(shuō)明設(shè)備
    發(fā)表于 11-17 18:16 ?22次下載

    AVR編寫(xiě)的矩陣按鍵

    AVR編寫(xiě)的矩陣按鍵
    發(fā)表于 03-20 11:07 ?5次下載

    淺談ADC按鍵的應(yīng)用設(shè)計(jì)

    淺談ADC按鍵的應(yīng)用設(shè)計(jì)(現(xiàn)代電源技術(shù)pdf王建輝)-淺談ADC按鍵的應(yīng)用設(shè)計(jì)? ? ? ? ??
    發(fā)表于 09-17 13:37 ?25次下載
    <b class='flag-5'>淺談</b>ADC<b class='flag-5'>按鍵</b>的應(yīng)用設(shè)計(jì)

    【i.MX6ULL】驅(qū)動(dòng)開(kāi)發(fā)5——設(shè)備樹(shù)原理與點(diǎn)亮LED

    本篇介紹了設(shè)備樹(shù)的基本原理以及設(shè)備樹(shù)的使用方法,在上一篇點(diǎn)亮LED的代碼基礎(chǔ)上,通過(guò)設(shè)備樹(shù)的方式
    的頭像 發(fā)表于 05-21 21:41 ?4080次閱讀
    【i.MX6ULL】<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)5——<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹(shù)</b>原理與點(diǎn)亮LED

    Linux驅(qū)動(dòng)開(kāi)發(fā)-編寫(xiě)按鍵驅(qū)動(dòng)

    這篇文章介紹,如何使用雜項(xiàng)設(shè)備框架編寫(xiě)一個(gè)簡(jiǎn)單的按鍵驅(qū)動(dòng),完成編寫(xiě)、編譯、安裝、測(cè)試等流程,了解一個(gè)雜項(xiàng)字符
    的頭像 發(fā)表于 09-17 15:08 ?1677次閱讀
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)-<b class='flag-5'>編寫(xiě)</b><b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>

    zynq開(kāi)發(fā)中的設(shè)備樹(shù)

    在zynq開(kāi)發(fā)中經(jīng)常會(huì)修改設(shè)備樹(shù),每次遇到這種情況都有點(diǎn)發(fā)愁,今天把設(shè)備樹(shù)相關(guān)的知識(shí)點(diǎn)總結(jié)一下,希望以后遇到
    的頭像 發(fā)表于 05-25 11:29 ?2304次閱讀
    zynq開(kāi)發(fā)中的<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹(shù)</b>

    如何修改內(nèi)核設(shè)備樹(shù)

    如何修改內(nèi)核設(shè)備樹(shù)
    的頭像 發(fā)表于 12-14 14:06 ?852次閱讀
    如何<b class='flag-5'>修改</b>內(nèi)核<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹(shù)</b>
    主站蜘蛛池模板: 6080伦理久久精品亚洲| 午夜宅男在线| 黄网址免费| 五月情视频在线观看| 久久国产99| 97天天操| 免费一级特黄特色大片在线观看看| 成人免费观看一区二区| 免费在线视频你懂的| 色老头影视| 午夜免费成人| 日本免费人成在线网站| 四虎在线最新永久免费播放| 99久久精品费精品国产一区二| 中文字幕亚洲一区二区va在线 | 亚洲精品成人久久久影院| 亚洲美女黄视频| 黄色在线观看网址| yyy6080韩国三级理论| 久久天天综合| 久色乳综合思思在线视频| 影院在线观看免费| 在线观看黄的网站| 日产国产精品亚洲系列 | 天天操天天操天天操| 天天干网站| 天天草b| riav久久中文一区二区| 亚洲免费在线看| 婷婷开心激情| 久久午夜宅男免费网站| 玖玖激情| 国产欧美高清| 东莞a级毛片| 2022第二三四天堂网| 欧美黄色片在线| 黄色网址中文字幕| 俺要操| 国产精品色婷婷在线观看| 伊人婷婷涩六月丁香七月| 亚洲天堂999|