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

openharmony南向研究(5)-linux驅動框架-PWM

系統 OpenHarmony
? PWM全稱Pulse Width Modulation:脈沖寬度調制(簡稱脈寬調制,通俗的講就是調節脈沖的寬度),是電子電力應用中非常重要的一種控制技術

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

本文簡要介紹對比基于linux內核開發PWM平臺驅動的方案,在平臺驅動開發完成后可以合入HDF框架作為Openharmony底層驅動方案,之前寫完驅動GPIO方案LINUX驅動基礎以及合入openharmony的文章后有同學問其他的外設怎么合入,有沒有更簡單易用的方法開發陌生的linux開發板和系統,本章接著介紹PWM接口技術,以及設備樹構造技術來進行簡單解析。
本次實踐部分使用九聯UnionPi開發板演示。

PWM技術基礎

PWM全稱Pulse Width Modulation:脈沖寬度調制(簡稱脈寬調制,通俗的講就是調節脈沖的寬度),是電子電力應用中非常重要的一種控制技術。

通過PWM可以控制實現原本閾值電壓范圍內電壓值的控制.PWM有非常廣泛的應用,比如直流電機的無極調速,開關電源、逆變器等等。

上述公式可以帶來的效果包括但不限于希望一個點燈以50%亮度點亮時可以使用該方法完成,設置一個占空比為50%的PWM波輸出即可,而在用PWM控制電機轉速時,占空比的降低可以使得電機轉速降低,而占空比的增加會使得電機轉速的增加。

PWM技術中需要關注的參數包括:

  1. PWM周期:PWM周期是指載波信號重復的時間。它的值取決于系統中使用的計時器和計數器的設置,可以根據需求進行調整。通常情況下,PWM周期越短,電機或LED的響應速度越快。
  2. 占空比:占空比是指PWM信號中高電平的時間與周期時間的比例。例如,50%的占空比意味著高電平時間等于周期時間的一半。占空比越高,電機或LED的亮度或速度越高。
  3. 分辨率:分辨率是指PWM信號能夠表達的離散級別數量。它取決于系統的計時器和計數器分辨率,以及PWM周期的長度。較高的分辨率意味著我們可以更精細地控制PWM信號的占空比和輸出精度。

在通常使用的芯片中通過對以下幾個寄存器的配置可以實現PWM的控制。

  1. TMR(計時器)寄存器:TMR寄存器用于設置PWM信號的載波周期。通過設置TMR寄存器的計數值和預置值,可以確定PWM信號的頻率。TMR寄存器的計數值決定了PWM周期的長度,預置值決定了載波信號周期的長度。通過調整計數值和預置值,可以調整PWM周期和頻率。
  2. PR(預置器)寄存器:PR寄存器用于設置PWM信號的載波周期的預置值。預置值決定了載波信號周期的長度,它是TMR寄存器計數值的上限。當TMR寄存器的計數值達到預置值時,計數器會重新計數并產生一個新的PWM周期。
  3. PWM占空比寄存器:PWM占空比寄存器用于設置PWM信號的占空比。在PWM周期內的高電平時間和低電平時間是由PWM占空比寄存器的值決定的。通過改變PWM占空比寄存器的值,可以調整PWM信號的占空比,從而控制輸出的電壓或電流大小。
  4. IO控制寄存器:IO控制寄存器用于設置PWM輸出引腳的模式和狀態。通過IO控制寄存器,可以選擇PWM輸出引腳的功能和輸出模式,例如單極性輸出或雙極性輸出。還可以設置引腳的電平、電流和電壓等參數。
  5. 中斷寄存器:中斷寄存器用于設置PWM中斷功能。當PWM周期結束時,可以通過中斷寄存器來觸發中斷事件,并在中斷服務程序中執行一些操作。

下圖為PR寄存器值為8,TMR寄存器值為4,最終輸出信號位OCXREF,占空比為44.4%。

#創作者激勵#【FFH】openharmony南向研究(5)-linux驅動框架-PWM-開源基礎軟件社區

在常用的芯片中對應不同的寄存器,但是核心邏輯還是在于TMR寄存器和PR寄存器,例如在STM32中預置器寄存器又叫做TIMx_ARR定時器重載控制器,需要讀者仔細甄別。

寄存器具體作用方式如下:

首先在定時器以PWM模式工作時會將計數器計數模式設置為向上計數模式,并使能計時器。(此處為示意代碼)。

// 將定時器設置為PWM模式
TMRx->CCP |= TMR_CCP_PWM;

// 設置計數模式為向上計數模式
TMRx->CON &= ~TMR_CON_CM_MASK;
TMRx->CON |= TMR_CON_CM_UP;

// 使能定時器
TMRx->CON |= TMR_CON_TEN;

再配置定時器相關參數,設定定時器的分頻值,PWM的周期長度和PWM的占空比。

// 設置定時器的時鐘分頻系數
TMRx->PSC = prescaler_value;

// 設置PWM周期的長度
TMRx->PR = period_value;

// 設置PWM波形的占空比
TMRx->PWM = pulse_value;

prescaler_value為定時器的時鐘分頻系數,用于設置定時器的時鐘頻率,period_value為PWM周期的長度,即PR寄存器的值,pulse_value為PWM波形的占空比,即TMR寄存器的值。

最后啟動PWM輸出。

// 啟動定時器
TMRx->CON |= TMR_CON_TEN;

按照基本寄存器操作邏輯整體計算占空比的公式如下:

頻率計算公式為:

如果使用文中的九聯UnionPi開發板,將會用到Amlogic A311D芯片,以下例程可以單獨通過寄存器實現占空比為50%,頻率為4000Hz的PWM輸出。

// 定義定時器TMRx
struct meson_pwm *pwm_dev = (struct meson_pwm *)PWM_BASE;

// 計算PWM周期和占空比的值
uint32_t period_value;
uint32_t pulse_value;
period_value = PWM_CLOCK_RATE / 4000 - 1; // PWM周期 = PWM時鐘頻率 / 頻率 - 1
pulse_value = period_value / 2; // PWM波形的占空比 = Pulse / (Period + 1)

// 配置PWM時鐘頻率
pwm_dev->pre_divider = 0; // PWM時鐘頻率 = 24MHz / (2 * (pre_divider + 1))
pwm_dev->divider = 0;

// 配置PWM輸出通道
pwm_dev->enables = 1 << PWM_CHANNEL; // 使能PWM輸出
pwm_dev->hi_time[PWM_CHANNEL] = pulse_value;
pwm_dev->lo_time[PWM_CHANNEL] = pulse_value;

// 啟動PWM輸出
pwm_dev->config = 1; // 啟動PWM輸出

其中,PWM_BASE表示PWM控制器的基地址;PWM_CHANNEL表示要使用的PWM輸出通道,取值為0、1、2或3;period_value和pulse_value分別表示PWM周期和占空比的值,根據占空比為50%、頻率為4000Hz可以計算出period_value=PWM_CLOCK_RATE/4000-1,pulse_value=period_value/2。

另外,需要注意的是,在Amlogic A311D芯片中,PWM波形的占空比是由hi_time和lo_time寄存器的值決定的。在上面的代碼中,我們通過修改pwm_dev->hi_time[PWM_CHANNEL]和pwm_dev->lo_time[PWM_CHANNEL]參數來設置占空比的值,實際上是將該值寫入hi_time和lo_time寄存器中。因此,在不同的通道上設置占空比時,需要根據具體的寄存器名和通道號來設置pwm_dev->hi_time和pwm_dev->lo_time參數。

LINUX驅動中配置PWM

  1. 通過閱讀開發板原理圖和開發板手冊了解PWM口物理連接接口
  2. 創建PWM設備節點: 創建一個新的PWM設備節點,可以使用misc設備驅動程序或platform_device框架。在創建設備節點時,需要指定設備ID、名稱和相關的設備數據。
  3. 初始化PWM設備: 在PWM設備初始化期間,需要設置PWM時鐘、周期、占空比和極性等參數??梢酝ㄟ^PWM子系統提供的函數進行操作。
  4. 實現PWM設備控制函數: 這些函數提供了PWM設備的讀寫訪問??梢允褂胹ysfs接口或misc設備驅動程序提供的ioctl函數進行實現。
  5. 注冊PWM設備: 注冊PWM設備以啟用設備??梢允褂胢isc設備驅動程序或platform_device框架提供的函數進行操作。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/pwm.h>

#define DRIVER_NAME "my_pwm_driver" // 驅動程序名稱

static struct pwm_device *pwm_dev; // PWM設備指針
static int duty_cycle_percent = 50; // 占空比(默認50%)

static int my_pwm_driver_probe(struct platform_device *pdev) // 驅動程序的probe函數
{
struct device *dev = &pdev->dev;
struct pwm_args args; // PWM參數結構體

args.period = 1000000; // PWM周期(1ms)
args.duty_cycle = 500000; // PWM占空比(50%)
args.polarity = PWM_POLARITY_NORMAL; // PWM極性

// 請求PWM設備,返回PWM設備指針
pwm_dev = pwm_request(dev, 0, DRIVER_NAME);
if (IS_ERR(pwm_dev)) { // 如果請求PWM設備失敗
dev_err(dev, "Failed to request PWM device\n"); // 打印錯誤信息
return PTR_ERR(pwm_dev); // 返回錯誤碼
}

pwm_init(pwm_dev, &args); // 初始化PWM設備
pwm_enable(pwm_dev); // 啟用PWM設備

return 0; // 返回成功
}

static int my_pwm_driver_remove(struct platform_device *pdev) // 驅動程序的remove函數
{
pwm_disable(pwm_dev); // 關閉PWM輸出
pwm_free(pwm_dev); // 釋放PWM設備
return 0; // 返回成功
}

static struct platform_driver my_pwm_driver = { // 平臺驅動程序結構體
.probe = my_pwm_driver_probe, // 驅動程序的probe函數
.remove = my_pwm_driver_remove, // 驅動程序的remove函數
.driver = {
.name = DRIVER_NAME, // 驅動程序名稱
},
};

module_platform_driver(my_pwm_driver); // 注冊平臺驅動程序

MODULE_LICENSE("GPL"); // 許可證信息
MODULE_DESCRIPTION("PWM driver for my platform"); // 驅動程序描述信息

在編寫PWM驅動程序時,需要配置PWM控制器的寄存器以實現PWM輸出。PWM控制器的寄存器地址和控制位的具體定義因芯片而異,因此需要根據具體的硬件平臺進行編寫。

在Linux內核中,通常使用PWM子系統提供的接口來訪問PWM控制器的寄存器。PWM子系統提供了一組API函數,用于初始化PWM、設置PWM周期和占空比、開啟/關閉PWM輸出等操作,這些API函數會自動設置PWM控制器的寄存器。

例如,在上面的PWM驅動程序示例中,使用了PWM子系統提供的函數pwm_request()、pwm_init()、pwm_enable()等,這些函數會自動配置PWM控制器的寄存器以實現PWM輸出。因此,可以通過使用PWM子系統提供的接口,避免手動配置PWM控制器的寄存器,從而簡化驅動程序的編寫。

PWM子系統中的具體接口函數屬性如下:

  • struct pwm_device:表示一個PWM通道,定義在include/linux/pwm.h文件中。
  • struct pwm_state:表示一個PWM通道的狀態,包括周期、占空比等參數,定義在include/linux/pwm.h文件中。
  • struct pwm_ops:表示PWM驅動程序的操作函數,包括配置PWM通道、使能/禁用PWM輸出等,定義在include/linux/pwm.h文件中。
  • struct platform_device:表示一個平臺設備,包含設備名、設備資源等信息,定義在include/linux/platform_device.h文件中。
  • pwm_get:獲取一個PWM通道,定義在drivers/pwm/core.c文件中。
  • pwm_request:申請一個PWM通道,定義在drivers/pwm/core.c文件中。
  • pwm_free:釋放一個PWM通道,定義在drivers/pwm/core.c文件中。
  • pwm_config:配置PWM通道的參數,包括周期、占空比等,定義在drivers/pwm/core.c文件中。
  • pwm_enable:使能PWM輸出,定義在drivers/pwm/core.c文件中。
  • pwm_disable:禁用PWM輸出,定義在drivers/pwm/core.c文件中。
  • pwm_apply_state:將PWM通道的配置應用到硬件上,定義在drivers/pwm/core.c文件中。
    這些函數和結構體的實現可能會因為Linux內核版本不同而有所變化,因此在編寫設備驅動程序時需要仔細閱讀對應內核版本的源代碼和文檔。

在上述代碼中我們已經完成了標注的PWM驅動編寫,接下來要對其進行調用。

對其進行編譯合并入內核。

$ make
$ insmod my_pwm_driver.ko

常規在LINUX內核環境中進行驅動調用的方式有兩種,一種是重寫底層硬件配置調用platform_device_register()函數來完成注冊操作,以及可以使用文件系統調用內核中已經寫好的驅動,如GPIO章節描述的方法類似,另一種是通過設備樹來完成底層硬件和內核態程序間的隔離和連接。

如果想調用剛剛寫好的驅動,通過設備樹的方式可以將節點注冊到設備樹中。

my_pwm_device {
compatible = "my_pwm_driver"; //關鍵的設備樹配置 需要和驅動中的驅動名一致
};
pwm_ef : pwm@86c0 {
compatible ="amlogic,meson8-pwm","amlogic,meson8b-pwm";
reg=<0x86c0 0x10>;
#pwm-cells =<3>;
status ="disabled";
} //完整的設備樹配置

設備樹的參數屬性詳細解釋如下所示。

pwm1: pwm@f0038000 {
compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm"; // 兼容性字符串
reg = <0x0 0xf0038000 0x0 0x4000>; // PWM控制器寄存器地址和大小
interrupts = <0x0 0x38 0x4>; // PWM控制器的中斷號
clocks = <0x1 0x7d>; // PWM控制器的時鐘
clock-names = "ipg"; // PWM控制器時鐘名稱
#pwm-cells = <0x2>; // 每個PWM單元包含兩個細胞
pinctrl-names = "default"; // 引腳控制器名稱
pinctrl-0 = <0x41>; // 引腳控制器配置編號
};

我們需要將設備樹寫入到dtsi文件當中,該文件目錄位于 kernel/linux/linux-5.10/arch/arm/boot/dts/meson8.dtsi。同時通過搜索PWM,PINCTRL可以查看到廠商以及合入的內核設備樹,我們可以在此處添加或修改新的硬件對于amlogic a311d芯片而言。

重啟系統剛剛注冊的設備和驅動可以在前臺通過讀寫文件的方式進行控制

$ echo 1 > /sys/class/pwm/pwmchip0/export
$ echo 5000000 > /sys/class/pwm/pwmchip0/pwm0/period
$ echo 2500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
$ echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable

第二種不通過設備樹的驅動編寫方案如下,其核心思路是注冊該設備,即將該設備添加到Linux內核中的設備列表中,可以使用platform_device_register()函數來完成注冊操作。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/pwm.h>
static struct pwm_device *pwm_dev;
static int __init my_pwm_init(void)
{
int ret;
struct platform_device *pdev;
struct pwm_args args = {
.period = 1000000, // 1MHz
.duty_cycle = 500000, // 50% duty cycle
};
// 創建一個平臺設備
pdev = platform_device_alloc("my_pwm_device", -1);
if (!pdev) {
printk(KERN_ERR "Failed to allocate platform device\n");
return -ENOMEM;
}
// 注冊平臺設備
ret = platform_device_add(pdev);
if (ret) {
printk(KERN_ERR "Failed to add platform device\n");
goto err_free_device;
}
// 獲取PWM設備
pwm_dev = pwm_request(0, "my_pwm_driver");
if (IS_ERR(pwm_dev)) {
ret = PTR_ERR(pwm_dev);
printk(KERN_ERR "Failed to request PWM device: %d\n", ret);
goto err_remove_device;
}
// 配置PWM設備
ret = pwm_apply_args(pwm_dev, &args);
if (ret) {
printk(KERN_ERR "Failed to apply PWM arguments: %d\n", ret);
goto err_free_pwm;
}
// 使能PWM輸出
ret = pwm_enable(pwm_dev);
if (ret) {
printk(KERN_ERR "Failed to enable PWM device: %d\n", ret);
goto err_free_pwm;
}
printk(KERN_INFO "PWM driver loaded successfully\n");
return 0;
err_free_pwm:
pwm_free(pwm_dev);
err_remove_device:
platform_device_unregister(pdev);
err_free_device:
platform_device_put(pdev);
return ret;
}
static void __exit my_pwm_exit(void)
{
// 禁用PWM輸出
pwm_disable(pwm_dev);

// 釋放PWM設備
pwm_free(pwm_dev);

// 移除平臺設備
platform_device_unregister(pwm_dev->chip->pdev);

printk(KERN_INFO "PWM driver unloaded successfully\n");
}

module_init(my_pwm_init);
module_exit(my_pwm_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Example PWM driver");

目前可以在.dtsi文件中查找到A311D開發板設備樹中已經配置完成具備兩個硬件PWM引腳,分別對應在:

PWM1 /sys/class/pwm/pwmchip0/pwm0

PWM2/sys/class/pwm/pwmchip2/pwm0

案例實戰

接下來通過一個實際案例演示PWM操作呼吸燈。//代碼和工程文件加在附件中。

通過文件系統和終端操作已經完成驅動配置的PWM引腳

$ echo 0 > /sys/class/pwm/pwmchip0
$ echo 0 > /sys/class/pwm/pwmchip2

以上兩行指令在pwmchip0和pwmchip2中生成引腳目錄pwm0。

也可以進入pwm0目錄查看內涵屬性。

打開pwm和關閉pwm。

$ echo 1 > /sys/class/pwm/pwmchip0/pwm0/enabled
$ echo 0 > /sys/class/pwm/pwmchip0/pwm0/enabled

設置周期值。

$ echo 10000000 > /sys/class/pwm/pwmchip0/pwm0/period

設置高電平時間。

$ echo 5000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle

此時占空比=duty_cycle/period=50%。

設置PWM極性。

$ echo normal > /sys/class/pwm/pwmchip0/pwm0/polarity
$ echo inversed > /sys/class/pwm/pwmchip0/pwm0/polarity

## 代碼實現版本-實現簡單呼吸燈
詳細代碼見附件
```C
//接口函數如下
int init_pwm(int channel);
int set_period(int channel,int period); //設置周期
int set_duty_cycle(int channel,int dutycycle); //設置高電平
int set_pwm_polarity(int channel, int polarity); //設置極性
int set_enable(int channel,int enable_s); //使能狀態

呼吸燈實現原理:
更改脈沖電平寬度,不斷連續減小。
(代碼為邏輯示意代碼,STM32版本,具體參見附件)。

uint32 T = 1600;   // 周期(脈沖寬度)
uint32 i=0,m=0,n=0,t=0;
pwm1ES= 1; // 輸出使能
pwm1AT = 1; // 滅
while (1)
{
for (i=0;i<T;i++)
{
pwm1AT = 0; // 亮
for (m=0;m<t;m++);
pwm1AT = 1; // 滅
for (n=0;n<T-t;n++);
t++;

if (t >= T)
{
for (i=0;i<T;i++)
{
pwm1AT = 0; // 亮
for (m=0;m<t;m++);
pwm1AT = 1; // 滅
for (n=0;n<T-t;n++);
t--;
}
}
}
}

該方法不適用精準定時器,只做PWM口演示使用。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-03-08 15:55:53

Linux驅動鴻蒙

2023-04-03 15:51:47

2022-05-11 15:08:52

驅動開發系統移植

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2023-09-14 15:49:42

PWM鴻蒙

2023-03-20 16:05:49

HDF傳感器驅動開發

2022-05-12 14:42:17

項目開發Napi實現

2022-04-21 11:26:31

鴻蒙操作系統

2021-09-10 10:01:04

鴻蒙HarmonyOS應用

2023-03-08 15:33:11

鴻蒙操作系統

2021-09-13 10:03:35

鴻蒙HarmonyOS應用

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2022-08-29 17:34:05

鴻蒙操作系統

2017-02-10 15:32:47

2009-08-04 10:46:04

2022-04-20 20:28:40

HDF 驅動框架鴻蒙操作系統

2023-08-18 14:28:18

UART異步通信

2021-11-08 15:02:19

鴻蒙HarmonyOS應用

2016-08-12 15:08:54

CloudOperaPaaS融合視頻

2022-05-16 11:50:45

HDF驅動框架
點贊
收藏

51CTO技術棧公眾號

高清一区二区三区四区五区| 欧美一区二区三区四区高清| 欧美二级三级| 日本熟女毛茸茸| 禁果av一区二区三区| 欧美精品丝袜中出| 国产毛片久久久久久国产毛片| 天堂网在线播放| 三级在线观看一区二区 | 一边摸一边做爽的视频17国产| 超免费在线视频| 久久久久国产精品麻豆| 国产在线视频不卡| 日韩高清免费av| 成人91在线| 精品国内片67194| 国产精品天天av精麻传媒| a级网站在线播放| 久久免费国产精品| 成人动漫在线视频| 欧美性受xxx黑人xyx性爽| 国产精品a级| 深夜成人在线观看| 免费看黄色aaaaaa 片| 天天综合在线观看| 色综合天天综合网天天看片 | 亚洲第一黄网| 播播国产欧美激情| 一级黄色片大全| 成人春色在线观看免费网站| 在线观看不卡视频| 久久成人免费观看| 日韩影视在线| 中文字幕一区二区5566日韩| 久久精彩视频| www.超碰在线.com| 精品一二三四在线| 国产精品高潮在线| 国产性生活视频| 国产精品久久久免费| 欧美人与物videos| 中日韩一级黄色片| 999久久久亚洲| 伊人av综合网| 在线免费观看麻豆| 日韩三级毛片| 日韩成人黄色av| caopor在线| 91精品短视频| 精品人在线二区三区| 中日韩av在线播放| 日韩毛片网站| 欧美午夜精品电影| 国产三级国产精品国产专区50| 日韩网站中文字幕| 欧美综合在线视频| 99草草国产熟女视频在线| 惠美惠精品网| 91豆麻精品91久久久久久| 丝袜老师办公室里做好紧好爽 | 毛片在线播放网址| 久久一区二区三区四区| 久久久久久久久久久久久久一区| 色哟哟国产精品色哟哟| 99视频在线精品| 久久国产欧美精品| 国产免费a∨片在线观看不卡| 久久久久成人黄色影片| 欧美一级二级三级九九九| 欧美成人免费| 国产精品美日韩| 午夜啪啪福利视频| 国产乱妇乱子在线播视频播放网站| 亚洲自拍偷拍九九九| 男人添女人荫蒂免费视频| 国产91足控脚交在线观看| 天天影视网天天综合色在线播放| 亚洲 欧美 日韩 国产综合 在线| 日韩伦理在线| 欧美性色黄大片| 欧美成人手机在线视频| 99久久免费精品国产72精品九九 | 激情欧美亚洲| 欧美在线视频一二三| 国产又粗又猛又爽又| 美腿丝袜一区二区三区| 91免费在线视频| 丰满岳乱妇国产精品一区| 99国产精品久| 亚洲欧美丝袜| 久久av色综合| 色婷婷国产精品| 天天干天天色天天干| jizz18欧美18| 中文字幕亚洲激情| 国产在线免费视频| 日本视频一区二区三区| 91传媒视频免费| 三级理论午夜在线观看| 17c精品麻豆一区二区免费| www.一区二区.com| 深夜视频一区二区| 精品福利在线导航| 你懂得视频在线观看| 精品成人一区| 国产欧亚日韩视频| 少妇高潮久久久| 亚洲视频一区二区在线| 久久久精品在线视频| 日韩免费一级| 亚洲欧洲日产国码av系列天堂| 全程偷拍露脸中年夫妇| 狂野欧美一区| 动漫3d精品一区二区三区 | 99久久精品无免国产免费| 99re热这里只有精品免费视频 | 亚洲美女毛片| 91久久久久久久久久久久久| 欧美婷婷久久五月精品三区| 亚洲视频在线一区二区| 亚洲人成无码www久久久| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 国产一区二区在线网站| 国产在线高清视频| 在线精品国精品国产尤物884a| 最新版天堂资源在线| 亚洲欧美在线专区| 国产精品一区二区三区久久久| 午夜在线视频观看| 亚洲国产美国国产综合一区二区| 岛国毛片在线播放| 女优一区二区三区| 97精品国产97久久久久久| 精品国自产在线观看| 国产清纯在线一区二区www| 三上悠亚久久精品| 在线观看视频一区二区三区| 久久久久99精品久久久久| 中文字幕视频免费观看| 久久女同性恋中文字幕| 欧美大片在线播放| 欧美午夜18电影| 97精品视频在线播放| 可以免费看毛片的网站| 夜夜嗨av一区二区三区| 巨乳女教师的诱惑| 自拍偷拍欧美| 99re视频在线| 手机av免费在线| 精品久久一区二区| 久久久国产精品黄毛片| 国产91对白在线观看九色| 国产成年人在线观看| 在线观看亚洲精品福利片| www.亚洲一区| 国产三级漂亮女教师| 成人欧美一区二区三区| 免费在线观看污网站| 亚洲香蕉av| 成人久久18免费网站漫画| 天堂av资源在线观看| 日韩免费高清视频| 日本特黄特色aaa大片免费| 成人一级片网址| 97国产精东麻豆人妻电影| 思热99re视热频这里只精品| 欧美影院在线播放| 搞黄视频免费在线观看| 欧美日韩国产综合一区二区| √天堂中文官网8在线| 国产高清在线观看免费不卡| 久久www视频| 久久精品福利| 国产精品高潮呻吟视频| 麻豆系列在线观看| 欧美mv和日韩mv国产网站| 欧美bbbbbbbbbbbb精品| 国产亚洲一二三区| 中文字幕成人免费视频| 欧美激情综合| 精品视频一区二区| 亚洲国产尤物| 久久国产精品电影| 天天综合网在线观看| 欧美优质美女网站| 午夜激情福利网| 99re这里只有精品6| 亚州精品一二三区| 欧美另类视频| 欧美在线激情| 亚洲一区二区三区日本久久九| 97色在线视频观看| 9色在线视频网站| 精品999久久久| 18国产免费视频| 欧美成人日韩| 亚洲线精品一区二区三区八戒| av不卡中文字幕| 日韩av中文字幕一区二区| 亚洲黄色网址在线观看| 免费一区二区三区视频导航| 91精品在线影院| 国产精品迅雷| 欧美国产日韩在线| 素人av在线| 亚洲精品少妇网址| 国产福利小视频| 在线观看91视频| 日韩三级av在线| 亚洲精品成人悠悠色影视| 久久精品老司机| 国产福利一区二区三区视频| 国内自拍视频网| 999在线观看精品免费不卡网站| 一区二区三区我不卡| 欧美网色网址| 国产精品久久久对白| 国产精品一区二区三区av| 国产精品扒开腿做爽爽爽男男 | 丰满熟女一区二区三区| 欧美日韩一二三区| 无码人妻精品一区二区三区9厂| 亚洲一区在线观看免费 | 国产字幕视频一区二区| 一区二区三区在线视频111| 一个色免费成人影院| 国产精品国产三级国产专区53 | 国产黄色精品网站| 色天使在线观看| 日韩精品成人一区二区在线| 国产免费黄视频| 在线精品一区| 日韩成人手机在线| 欧美一区激情| 欧美爱爱视频网站| 99tv成人| 一区二区三区免费看| 国产精品一线天粉嫩av| 麻豆久久久9性大片| 精品国内亚洲2022精品成人| 97久久人人超碰caoprom欧美| 久久久久久久性潮| 日韩av手机在线| 亚洲播播91| 国产91网红主播在线观看| 亚洲欧洲高清| 青青青国产精品一区二区| 欧美aa在线| 91精品国产电影| 国产免费拔擦拔擦8x高清在线人| 欧美激情精品久久久久久久变态| 羞羞网站在线看| 欧美大荫蒂xxx| 超免费在线视频| 欧美在线视频a| 怡红院成人在线| 国产精品人成电影在线观看| 国产经典一区| 国产日韩欧美日韩大片| 天堂久久一区| 成人av网站观看| 天堂99x99es久久精品免费| 欧美高清性xxxxhd| 精品美女在线视频| 在线视频不卡一区二区| 欧美 日韩 国产一区二区在线视频| 欧美aaa在线观看| 狠狠综合久久av一区二区老牛| 人体内射精一区二区三区| 国产日韩一区| 青青青在线视频免费观看| 麻豆精品视频在线观看视频| www.色就是色.com| 国产成人精品免费看| 亚洲国产第一区| 欧美国产日韩在线观看| 91精品国产闺蜜国产在线闺蜜| 亚洲一区二区在线播放相泽| 国产成人自拍视频在线| 在线免费观看成人短视频| 国产伦子伦对白视频| 欧美mv日韩mv亚洲| 精品成人一区二区三区免费视频| 日韩有码片在线观看| 俺来俺也去www色在线观看| 国产成人欧美在线观看| **国产精品| 国产一区高清视频| 色综合色综合| 黄页网站大全在线观看| 蜜桃av噜噜一区| 国产麻豆xxxvideo实拍| 国产精品毛片久久久久久久| 精品无码人妻一区二区三| 色婷婷国产精品久久包臀 | 国产激情一区二区三区四区 | 欧美wwwww| 国产不卡一区二区视频| 免费成人你懂的| 青青草视频网站| 国产精品国产自产拍高清av | 国产91丝袜美女在线播放| 一区二区三区小说| 国产情侣免费视频| 亚洲成人aaa| 黄色网在线播放| 国产suv精品一区二区三区88区| 国产精品99久久免费| 欧美色图亚洲自拍| 在线成人h网| 91日韩精品视频| 国产亚洲欧美日韩日本| 久久久无码一区二区三区| 欧美日韩在线播放一区| 五月婷婷六月丁香综合| 欧美成人性色生活仑片| 777午夜精品电影免费看| 国语精品免费视频| 欧美福利一区| 日韩av片专区| 日本一区二区久久| 日韩不卡视频在线| 亚洲精品在线电影| 1区2区3区在线视频| 国产精品一香蕉国产线看观看| 天天久久夜夜| 久激情内射婷内射蜜桃| 国产乱国产乱300精品| 免费黄色国产视频| 欧美午夜精品电影| jizz亚洲| 国产精品久久在线观看| 九九在线精品| 看av免费毛片手机播放| 成人18视频日本| 国产一级一片免费播放| 日韩亚洲国产中文字幕欧美| 日本激情视频在线观看| 国产精品久久久久免费a∨大胸| 免费一区二区三区视频导航| 欧美激情 国产精品| 97精品国产露脸对白| 日韩欧美不卡视频| 亚洲精品国产精品久久清纯直播 | 日本精品一二三区| 一区二区三区四区精品在线视频| 国产精品毛片久久久久久久av | 国产一区二区播放| 91精品中文字幕一区二区三区| 成人欧美在线| 51国偷自产一区二区三区| 自拍偷拍欧美专区| 日本一区二区免费视频| 亚洲国产人成综合网站| 日本黄色大片视频| 欧洲一区二区视频| 国产一区二区观看| wwwwwxxxx日本| 18成人在线视频| 亚洲产国偷v产偷v自拍涩爱| 欧美激情视频免费观看| 人体久久天天| 久久精品网站视频| 国产精品久久一级| 国产99久一区二区三区a片| 欧美日韩xxxxx| 久久91在线| 男人透女人免费视频| 中文字幕av免费专区久久| 国产精品一级视频| 国自产精品手机在线观看视频| 欧美重口另类| 中文字幕第80页| 亚洲精品一卡二卡| 婷婷五月综合激情| 国产精品丝袜一区二区三区| 欧美freesex交免费视频| 欧美一级片黄色| 在线观看中文字幕不卡| 亚洲综合图区| 欧美午夜精品理论片a级大开眼界| 美腿丝袜亚洲三区| 久久精品国产亚洲av无码娇色| 亚洲精品在线观看www| 四虎影视成人精品国库在线观看| 国产欧美精品aaaaaa片| 久久亚洲私人国产精品va媚药| 一区二区三区精彩视频| 久久人人爽人人爽人人片av高清| 久久93精品国产91久久综合| 欧美xxxxxbbbbb| 色综合咪咪久久| 性欧美ⅴideo另类hd| 日本不卡一区二区三区在线观看| 国内精品在线播放| 日本韩国欧美中文字幕| 久久精品成人动漫| 亚洲免费成人av在线| 一级黄色大片儿| 日本乱码高清不卡字幕|