<table id="jn53i"></table>
    <table id="jn53i"></table>
      <table id="jn53i"><code id="jn53i"><menu id="jn53i"></menu></code></table><output id="jn53i"></output>
      <table id="jn53i"><code id="jn53i"></code></table><input id="jn53i"></input>
    1. <var id="jn53i"></var>
      電子工程師的短視頻社區
      500萬+工程師都在用
      直播中

      RT-Thread記錄(十一、UART設備—源碼解析)

      矜辰所致

      描述

      深入理解 RT-Thread I/O 設備模型 — 分析 UART設備源碼。

      目錄

      前言
      一、初識 UART 操作函數(應用程序)
      二、UART 的初始化

      ? ?2.1 UART 設備初始化位置
      ? ?2.2 UART 設備初始化函數分析
      ? ? ? ?stm32_uart 結構體
      ? ? ? ?UARTX_CONFIG
      ? ? ? ?stm32_uart 結構體初始化
      ? ?2.3 UART 設備初始化結果圖

      三、UART 設備驅動框架層

      ? ?設備驅動框架層如何與設備驅動層關聯

      四、UART 設備驅動層
      ?

      前言

      上文我們認識了解了 RT-Thread I/O 設備模型,本來計劃是從最簡單的設備 GPIO 口開始講解 RT-Thread 的設備模型,但是實際上 PIN 設備模型有點特殊,并不是完美符合上一篇博文中 《2.3 訪問 I/O 設備相關》小結介紹的函數,所以這個我們放在后面文章說明。

      而 UART 設備模型的操作完美貼合上一篇博文的介紹,所以我把 UART 設備先說明了,這樣更加加深一下對 RT-Thread I/O 設備模型的認識。

      本文從 UART 設備驅動層 和 設備驅動框架層 分析 RT-Thread 中 UART 設備的實現。目的在于通過官方一個成熟的設備驅動的實例,讓我們確實的理解體會 RT-Thread I/O 設備模型。
      ?

      本 RT-Thread 專欄記錄的開發環境:
      RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發環境 及 配合CubeMX開發快速上手)
      RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析)
      RT-Thread 設備篇系列博文鏈接:
      RT-Thread記錄(十、全面認識 RT-Thread I/O 設備模型)

      一、初識 UART 操作函數(應用程序)

      首先我們來看一下在 RT-Thread 中 UART 操作函數,這是模型框架中最上層的應用層所需要調用的函數,如下面的表格:

      rt_device_find() 查找設備
      rt_device_open() 打開設備
      rt_device_read() 讀取數據
      rt_device_write() 寫入數據
      rt_device_control() 控制設備
      rt_device_set_rx_indicate() 設置接收回調函數
      rt_device_set_tx_complete() 設置發送完成回調函數
      rt_device_close() 關閉設備

      可以看到,對 UART 的操作和上一篇文章 《RT-Thread記錄(十、全面認識 RT-Thread I/O 設備模型)》 幾乎一模一樣,這也是前言中我說的為什么 UART 設備模型 是復習理解 RT-Thread I/O 設備模型的完美設備。

      對于這些操作函數,是給最上層的應用程序使用的,我們要使用一個 UART 設備,應用程序最開始肯定是需要使用rt_device_find()查找設備,在上一篇文章說過,大部分常用的設備 RT-Thread 已經幫我們寫好了驅動,我們直接在應用層調用操作接口即可,UART的驅動也是 RT-Thread 已經寫好的。

      那么我們該查找什么名字呢?RT-Thread 底層是如何實現的呢? 帶著這些問題,我們從最開始來分析說明一下 RT-Thread 的 UART 設備。

      ?? 先列出 RT-Thread 的 UART 操作函數,讓我們對 UART 應用層的函數有個了解,然后帶著一些好奇讓我們從底層源碼來分析一下 RT-Thread 的 UART 設備。

      二、UART 的初始化

      首先,UART 設備作為一個外設,肯定需要初始化,我們在系列博文第二篇《RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析)》分析過 RT-Thread 初始化。

      2.1 UART 設備初始化位置

      在文中章節 “2.2.1 板級硬件初始化 — rt_hw_board_init” 講到了硬件初始化相關,如下圖:

      pYYBAGK-aP6AI8ddAAUCUc387t0000.png

      ?

      rt_hw_board_init() 函數中有一個 hw_board_init,使用到的 UART 設備的初始化就在這個函數里面,如圖:

      poYBAGK-aP6AFAtJAAD0rsvycHg822.png

      ?

      說明一下,這個hw_board_init里面初始化的哪些設備是和 RT-Thread 配置一一對應的。

      注意到他們都是條件編譯,在 env 工具中配置了使用的外設之后,都會在這里進行初始化,對于我們使用 RT-Thread Studio 來說,就是如下圖所示:

      pYYBAGK-aP6AT6pNAAEMRYaBInM193.png

      2.2 UART 設備初始化函數分析

      通過上文介紹,我們找到了 UART 設備的初始化函數 rt_hw_usart_init

      int rt_hw_usart_init(void)
      {
          rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
          struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
          rt_err_t result = 0;
      
          stm32_uart_get_dma_config();
      
          for (int i = 0; i < obj_num; i++)
          {
              uart_obj[i].config = &uart_config[i];
              uart_obj[i].serial.ops    = &stm32_uart_ops;
              uart_obj[i].serial.config = config;
              /* register UART device */
              result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
                                             RT_DEVICE_FLAG_RDWR
                                             | RT_DEVICE_FLAG_INT_RX
                                             | RT_DEVICE_FLAG_INT_TX
                                             | uart_obj[i].uart_dma_flag
                                             , NULL);
              RT_ASSERT(result == RT_EOK);
          }
      
          return result;
      }

      這個初始化函數直接看上去,只有一個函數我們比較熟悉rt_hw_serial_register,顧名思義,串口設備注冊函數,不同于簡單的 I/O 設備注冊函數 rt_device_register,說明它 UART 設備還有設備驅動框架層,這個rt_hw_serial_register就是 UART 設備驅動框架層定義的函數。

      這個設備驅動層 和 設備驅動框架層我們待會再來說明,我們先從頭簡單分析一下這個 UART 設備驅動程序。

      第一句,這個語句是為了確認一下有幾個串口設備需要進行初始化:

      rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);

      其中 uart_obj 有如下定義:

      static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};

      ?

      uart_objstm32_uart 類型的結構體數組,其數組長度為sizeof(uart_config)/sizeof(uart_config[0])

      stm32_uart 結構體

      在 RT-Thread 操作系統中,對 UART設備的初始化,可以理解為就是對 stm32_uart 結構體對象 的初始化 。

      我畫了一張結構圖如下:

      poYBAGK-aP-AOaGMAAIYqo2jgbM159.png

      ?

      stm32_uart 結構體這里我們先不分析里面具體的含義,在后文對應的地方都會有響應的說明,我們先回到初始化的問題上來。

      我們接著上面分析,數組變量 uart_obj 的長度是多少呢?看一下 uart_config 是什么,如下圖:

      pYYBAGK-aP-ARAwPAABBDBB6dzc752.png

      ?

      uart_configstm32_uart_config 類型的結構體數組,其數組長度是根據 RT-Thread 配置使用哪些串口決定的。

      比如我們使用了 串口1 和 串口3,那么uart_config 就等于:

      static struct stm32_uart_config uart_config[2] =
      {
          UART1_CONFIG,
          UART3_CONFIG,
      };

      UARTX_CONFIG

      這里講到 UART1_CONFIG 就順帶提一下,UART1_CONFIGstm32_uart_config 類型的結構體,在RT-Thread 中是通過 宏定義來定義的:

      poYBAGK-aP-AWPnSAADaoWOSzhs336.png

      ?

      引出這么多,我們回到最初的rt_hw_usart_init函數第一句的代碼:

      rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);

      以上面為例,只使用了 UART1 和 UART3 ,uart_obj數組長度為2,也就表明有2個stm32_uart 結構體的成員需要進行初始化,也就是需要初始化 2個 UART 設備。 上面句子中 obj_num = 2;

      接下來的語句:

      struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;

      串口配置結構體,初始化等于默認配置,這里具體也好理解,看下圖便知:

      pYYBAGK-aQCAXfcyAAB4hf1K84U099.png

      ?

      再往下看,獲取串口 DMA 配置:

      stm32_uart_get_dma_config();

      函數如下,如果沒有使用DMA ,那么只會有一條語句,就是 uart_dma_flag = 0; 表示沒有使用DMA。

      在上面我們介紹stm32_uart 結構體的時候,uart_dma_flag 就是這個結構體的一個成員變量。

      poYBAGK-aQCAMbkiAAA5d8oDF6M762.png

      stm32_uart 結構體初始化

      再接下來就是uart_obj[i]的初始化了,有幾個串口就初始化幾遍:

       for (int i = 0; i < obj_num; i++)
          {
              uart_obj[i].config = &uart_config[i];
              uart_obj[i].serial.ops    = &stm32_uart_ops;
              uart_obj[i].serial.config = config;
              /* register UART device */
              result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
                                             RT_DEVICE_FLAG_RDWR
                                             | RT_DEVICE_FLAG_INT_RX
                                             | RT_DEVICE_FLAG_INT_TX
                                             | uart_obj[i].uart_dma_flag
                                             , NULL);
              RT_ASSERT(result == RT_EOK);
          }

      首先里面第一句:

      uart_obj[i].config = &uart_config[i];

      其中 uart_config[i] 就是我們上文說的 UARTX_CONFIG,通過宏定義定義的 stm32_uart_config 類型的結構體。

      第二句:

       uart_obj[i].serial.ops    = &stm32_uart_ops;

      上文分析過stm32_uart 結構體,但是并沒有深入分析其中的成員serial,它是 RT-Thread 的 UART 設備對象控制塊,其中ops為結構體類型的指針:

      pYYBAGK-aQKAcyjmAACvJPnkQEY073.png

      ?

      stm32_uart_ops為 RT-Thread 設備驅動層定義好的,其作用是指定 UART 設備的操作函數:

      poYBAGK-aQKAZPytAAB796sf4Eg968.png

      ?

      第三句:

      uart_obj[i].serial.config = config;

      上文講過的,默認都是RT_SERIAL_CONFIG_DEFAULT,如果我們需要修改,可以通過rt_device_control修改。

      第四句:

      result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
                                             RT_DEVICE_FLAG_RDWR
                                             | RT_DEVICE_FLAG_INT_RX
                                             | RT_DEVICE_FLAG_INT_TX
                                             | uart_obj[i].uart_dma_flag
                                             , NULL);

      這個函數就是我們講過的 I/O 設備模型中的設備注冊函數,如圖:

      pYYBAGK-aQSATbznAADw5qJAYZE500.png

      ?

      在上面初始化中:
      uart_obj[i].serial 為 rt_serial_device 類型,就是 UART 設備的控制塊,它付給注冊函數第一個參數;
      uart_obj[i].config->name 中的name名字,就是設備注冊后 使用rt_device_find() 尋找的名字。

      其中rt_hw_serial_register函數屬于(設備驅動框架層的函數),他會調用通用的 rt_device_register(I/O設備管理層的函數)對 UART 設備進行注冊。

      2.3 UART 設備初始化結果圖

      經過上面的一系列分析,最終一個 UART設備初始化以后的結果如下圖所示:

      poYBAGK-aQSAaj9iAAGJbquQ-Ys326.png

      ?

      ?? UART 的初始化,最主要的是要了解 stm32_uart 結構體(以STM32驅動為例),通過對結構體的認識,初始化步驟的分析,讓我們認識到了RT-Thread 對于 UART 設備驅動層的設計,也讓我們接下來對認識 不同層之間如何聯系打下了一定的基礎。

      三、UART 設備驅動框架層

      我們回頭來看本文開頭說的 UART 那些操作函數,再結合上文所提到的初始,再結合上一篇文章《RT-Thread記錄(十、全面認識 RT-Thread I/O 設備模型)》的基礎,我們可以確定,上層應用所用到的UART 操作函數就是在使用rt_hw_serial_register 時候關聯到驅動框架層的:
      ?

      pYYBAGK-aQSAPkSVAACp37-m6_w697.png

      ?

      而且再復習一下, 設備驅動框架層是 RT-Thread 系統的東西,官方已經寫好的,UART 設備驅動框架層的代碼為 serial.c,其位置如下圖:

      poYBAGK-aQWATtfIAABDIGPzXOc288.png

      ?

      在其對應的 serial.h 頭文件中包含了許多 UART 設備通用的宏定義,大家可以自行查看。

      設備驅動框架層如何與設備驅動層關聯

      ☆在這里我們主要需要關注的就是,設備驅動框架層是如何 和 設備驅動層關聯起來的?!?/p>

      首先我們先看一下其中的幾個串口操作函數:

      poYBAGK-Z6CAI8BZAABSl4W1__o037.png

      我們隨意查看其中一個函數查看,如下圖:

      pYYBAGK-aQaADSrRAAB5PM0POoA051.png

      ?

      可以看到上圖有一句關鍵的代碼:

      if (serial->ops->configure)
              result = serial->ops->configure(serial, &serial->config);

      上面我們在將初始化的時候有過代碼:

      /*
      static const struct rt_uart_ops stm32_uart_ops =
      {
          .configure = stm32_configure,
          .control = stm32_control,
          .putc = stm32_putc,
          .getc = stm32_getc,
          .dma_transmit = stm32_dma_transmit
      };
      */
      uart_obj[i].serial.ops    = &stm32_uart_ops;

      所以上面的表格可進一步的改為如下對應表格:

      poYBAGK-Z8yAfndsAABtzlXAgXE528.png

      通過上面的分析,基本上有點撥云見日的感覺!

      ?? UART 設備驅動框架層是 RT-Thread 系統通用的,他上連接 I/O 設備管理層,下連接 設備驅動層。 通過分析,我們已經知道他們之間如何關聯。

      四、UART 設備驅動層

      其實在上面的文章分析的時候已經說清楚了 UART 設備驅動是如何與 設備驅動層關聯起來的。

      在 RT-Thread 中,我們的 UART 設備驅動文件為:drv_usart.c ,其位置位于 drivers 文件夾下面:

      poYBAGK-aQaAMxmqAABbnP0HkwI644.png

      ?

      這一層就是與我們使用的硬件設備直接關聯的一層,我們在上面介紹的 UART 設備初始化函數也在這個驅動文件中。

      再次復習一下,設備驅動層是與使用的硬件直接關聯的,因為使用的是STM32 ,其很多地方都調用了 ST官方 HAL 庫的定義,是在 HAL 庫的基礎之上實現的驅動代碼。

      我們只選幾個部分做示例說明,在驅動中下面幾個函數肯定是有的:
      ?

      pYYBAGK-aQeACu5QAAA1Kz0wHXw457.png

      ?

      配置函數

      我們看一下驅動層的配置函數stm32_configure,不難發現這個函數其實和裸機中的差不多,其中還調用了 HAL 庫中的 HAL_UART_Init函數(函數還是比較簡單的,我們這里說明一下舉個例子即可):

      static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
      {
          struct stm32_uart *uart;
          RT_ASSERT(serial != RT_NULL);
          RT_ASSERT(cfg != RT_NULL);
      
          uart = rt_container_of(serial, struct stm32_uart, serial);
      
          /* uart clock enable */
          stm32_uart_clk_enable(uart->config);
          /* uart gpio clock enable and gpio pin init */
          stm32_gpio_configure(uart->config);
      
          uart->handle.Instance          = uart->config->Instance;
          uart->handle.Init.BaudRate     = cfg->baud_rate;
          uart->handle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
          uart->handle.Init.Mode         = UART_MODE_TX_RX;
          uart->handle.Init.OverSampling = UART_OVERSAMPLING_16;
          switch (cfg->data_bits)
          {
          case DATA_BITS_8:
              uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
              break;
          case DATA_BITS_9:
              uart->handle.Init.WordLength = UART_WORDLENGTH_9B;
              break;
          default:
              uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
              break;
          }
          switch (cfg->stop_bits)
          {
          case STOP_BITS_1:
              uart->handle.Init.StopBits   = UART_STOPBITS_1;
              break;
          case STOP_BITS_2:
              uart->handle.Init.StopBits   = UART_STOPBITS_2;
              break;
          default:
              uart->handle.Init.StopBits   = UART_STOPBITS_1;
              break;
          }
          switch (cfg->parity)
          {
          case PARITY_NONE:
              uart->handle.Init.Parity     = UART_PARITY_NONE;
              break;
          case PARITY_ODD:
              uart->handle.Init.Parity     = UART_PARITY_ODD;
              break;
          case PARITY_EVEN:
              uart->handle.Init.Parity     = UART_PARITY_EVEN;
              break;
          default:
              uart->handle.Init.Parity     = UART_PARITY_NONE;
              break;
          }
      
          if (HAL_UART_Init(&uart->handle) != HAL_OK)
          {
              return -RT_ERROR;
          }
      
          return RT_EOK;

      ?

      發送函數:

      poYBAGK-aQeABQ-gAACNaHq4BII898.png

      ?

      關于中斷:

      中斷入口函數還是我們熟悉的USART1_IRQHandler,其流程如下圖所示:

      pYYBAGK-aQeAAvkLAAHtLNo0LHo955.png

      ?

      UART 設備驅動層直接與 UART 硬件相關,其中函數都可以直接對硬件進行操作,其實上層應用可以直接調用 驅動層的函數使用,很多函數的實現基于官方的HAL 庫。

      結語

      本文通過對 UART設備初始化分析,對 UART 設備模型各層次的源碼關聯進行對應說明,通過現成的UART 設備模型,我們更加的理解了 RT-Thread 的I/O 設備模型,最后總結如圖所示:

      pYYBAGK-aFKADW2-AAAjihC0LhI462.png

      其實從應用來說,知道不知道底層的這些實現都沒有太大的關系,所以即便一下子看不懂也沒有關系,多看看源碼,靜下心來好看還是不難理解的。

      ?? 如果上一篇博文還沒能理解 RT-Thread I/O 設備模型,那么加上這篇文章,你一定行 (* ̄︶ ̄) ??

      為了加深對 RT-Thread 的I/O 設備模型的說明,本文花了不少時間,在接下來的設備使用測試中,如果不是特除情況,應該就不會再進行這樣的分析了,我們就要正式進入 RT-Thread 設備的使用學習過程。

      下一篇文章我們就要從 UART 設備使用開始學習 RT-Thread 設備的使用。

      打開APP閱讀更多精彩內容
      聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯系本站作侵刪。 侵權投訴

      免費PCB檢查工具!一鍵分析設計隱患!

      Altium Designer超全封裝庫(帶3D模型)

      全部0條評論

      快來發表一下你的評論吧 !

      日本人妻不卡一区二区三区中文字幕,国色天香一卡二卡二卡四卡,人妻无码av一区二区三区精品,毛1卡2卡3卡4卡免费视频,一卡二卡三卡免费播放在线观看 人妖与女人牲交| 国产亚洲日韩网曝欧美台湾| 少妇的YIN荡生活| JAPANESE人妻中文字幕| 亚洲香蕉伊在人在线观看| 色猫咪AV在线网址| 芒果一二三中文乱码禁止转发传播| JK制服黑色丝袜自慰流白浆| 色天天综合色天天天天看大片| 爆出白浆超碰人人人人| 精品欧美精品视频在线| 午夜男女爽爽爽影院在线视频| 能看AV永久免费的APP| aⅴ亚洲 日韩 色 图网站 播放| 人妻系列无码专区久久五月天| 午夜福利1000集合集92集在线| 欧美乱码一二三四区| 大尺度AV无码污污福利网站| CHINA末成年VIDEOS中国| 一卡二卡三卡四卡在线播放| 亚洲欧美日韩综合一区二区三区| 免费 人AV在线影院日本0| 日本大道一卡二卡三卡四卡在线| 5566成年视频观看免费| 小草在线视频官网| 抽搐一进一出试看60秒体验区| 国产学生粉嫩泬免费播放| 日本乱人伦在线观看| 国产毛片农村妇女系列BD版| 97人洗澡人人澡人人爽人人模| 草蜢社区在线观看免费下载| 学生幻女毛片手机播放| 免费任你躁国语自产在线播放| 日本10一14周岁A在线| 新婚少妇的体内进进出出| 曰批免费视频播放免费| 免费的日本中文字幕视频| WC厕所孕妇撒尿偷拍视频| 四虎永久免费地址ww416| 琪琪亚洲国产在线2020最新| 国产在线看片免费人成视频| 久久午夜夜伦鲁鲁片免费无码| 男人让女人爽的免费视频18禁| 亚洲一卡二卡三卡四卡| japanese日本熟妇photo| 超碰曰口干天天种夜夜爽| 亚洲乱码中文字幕手机在线| CHINESE国产老熟女| 日本免费一区| 日本片在线看的免费网站| WWW.26UUU| 99热99这里只有精品6国产| 一品道一卡二卡三卡| 十种让自己爽到叫的自慰方法| 阿娇13分钟作爱视频| 黑巨茎大战乌克兰美女 | 俄罗斯6一9泑女网站| 国产人成午夜免电影费观看| 俄罗斯小YOUNV另类| JAPANESE55乱子| AV一本久道久久综合久久鬼色| 好男人视频免费观看视频| 性欧洲精品VIDEOS| 国产在线精品亚洲观看不卡欧| 日本av视频| 日韩AV在线观看一区免费| 久久水蜜桃网国产免费网| 老女人乱婬| 毛色毛片免费观看| 欧美野人三级经典在线观看| 互换身体| CHINESE中国农民夫妇HD| 韩国女主播精品视频网站| 妺妺嘿嘿午夜福利| 无敌神马电影在线观看| 女人和拘做受全程看| 性俄罗斯孕妇交XX00| 男下部进入女人下部激烈| 高清视频日本韩国中国| 欧洲性爱| 午夜性刺激在线视频免费| 五月丁香六月缴情综合在线| CHINESE中国女人内谢| 亚洲AV无码片一区二区三区| 50熟妇的长奶头满足了我| 免费A级毛片无码| 国产精品激情欧美可乐视频| 抖音视频解析工具在线保存| 高清VIDEOSGRATIS欧美69| 欧美人与动牲交A欧美精品| 我洗碗时在厨房要了我| 日韩理论午夜无码| 亚洲色播爱爱爱爱爱爱爱| 黑人的又粗好痛在线视频| 无敌神马在线完整视频| 久久超碰极品视觉盛宴| 好男人视频免费观看视频| 黑人上司与人妻激烈中文字幕| 最大胆极品欧美人体视频| 毛成片1卡2卡3卡4卡| 久久天天躁夜夜躁狠狠85| 天天影视网色香欲综合网| 清纯女被强行糟蹋电影| 白丝老师用腿夹得我好爽| 亚洲综合色区在线播放2019| 末成年美女黄网站色大全| 久久久国产99久久国产久| 2021一本大道一卡二卡三卡四卡| 亚洲日本欧韩综合AV天堂| 偷拍女性正面蹲下澈尿| 日本丰满熟妇有毛| 秋霞电影网在线观看免费理论片| 偷拍学生MM厕所视频| 性直播视频在线观看黄| 男女爱爱动态猛激视频| 国产亚洲精品久久久久9999| 国产高清不卡无码视频| 禁止18点击进入在线看片尤物| 疯狂爱爱爱| 99久久国产精品免费| 成 人影片 免费观看在线| 黄 色 成 人网站APP| 午夜片无码区在线观看| 中文字字幕在线中文乱码网站| 亚洲欧美一区二区三区| 抖音在线视频去水印解析网址| 午夜快车完整视频在线观看| 日本高清一区二区三区视频在线| 乱卡日本一卡二卡三卡四卡兔| 亚欧乱色国产精品免费九库| 免费两性的视频网站| 国产无套乱子伦精彩是白视频| 成年女人片免费视频播放A| 久久大香萑太香蕉AV黄软件| BBW极度另类孕妇| 抖音视频解析入口| 天天摸天天做天天爽2020| 久久婷婷五月综合色一区二区| 成年片黄网站色大全视频免费| 公侵犯玩弄熟睡人妻电影| 午夜理理伦A级毛片| 美女MM131爽爽爽作爱视频 | JAPANBABES日本护士18| 哔哩哔哩免费网站观看| 东北50岁熟女叫床有谁没谁了| 色5566最新网站| 欧美黑吊粗大猛烈18P| 插曲的痛三十分钟完整版| 虫爱少女| 成本人视频免费网站| 一本AV高清一区二区三区| 国产女人高潮叫床视频在线观看| 孩交VIDEOS精品| 天堂在线资源种子| 草莓视频国产片在线观看| 无码精品日韩专区久久| 息与子中文字幕| 野花社区最新免费视频观看| 高清无码人妻在线视频| 欧美日韩在线精品视频二区| 腿张开再深点好爽办公室视频| 亚洲制服师生 中文字幕| av一卡二卡三卡免费| 精油按摩|
      ×
      20
      完善資料,
      賺取積分