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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

android电池充电以及电量检测驱动分析

發布時間:2023/12/15 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 android电池充电以及电量检测驱动分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前段時間比較煩躁,各種不想學習不想工作,于是休息了幾天。這幾天又下來任務了--調試充電電路和電池電量檢測電路,于是又開始工作,順便把調試過程記錄下來。

平臺: cpu 飛思卡爾imx6q 4核

充電芯片 MAX8903

電量檢測芯片 MAX11801

android版本 android4.0

一、電量檢測

我們用的電池電量檢測芯片MAX11801其實是一款電阻觸摸屏的驅動芯片,它外帶一個AD采集引腳,因此我們用這個引腳來檢測電池電壓。MAX11801電源為3.3V而電池電壓范圍可能是0~4.2V,因此我們需要給電池電壓分壓。我們所用的電路如下



知道了硬件電路下面來 添加這個芯片的驅動,這是一個i2c的芯片,因此首先在board文件中添加i2c設備

		I2C_BOARD_INFO("max11801", 0x48),
		.platform_data = (void *)&max11801_mode,
		.irq = gpio_to_irq(SABRESD_TS_INT),
	},

然后添加這個芯片的驅動文件放在/drivers/input/touchiscreen/max11801_ts.c

對于這個驅動文件我們只要讀取出AD的值就可以了,對于觸摸屏部分我們并不需要,因此主要是下面幾個函數

static u32 max11801_dcm_sample_aux(struct i2c_client *client)
{
	u8 temp_buf;
	int ret;
	int aux = 0;
	u32 sample_data = 0;
	/* AUX_measurement*/
	max11801_dcm_write_command(client, AUX_measurement);//發送AD采集命令
	mdelay(5);
	ret = i2c_smbus_read_i2c_block_data(client, FIFO_RD_AUX_MSB, //讀取高字節數據
						1, &temp_buf);
	if (ret < 1)
		printk(KERN_DEBUG "FIFO_RD_AUX_MSB read fails
");
	else
		aux_buf[0] = temp_buf;
	mdelay(5);
	ret = i2c_smbus_read_i2c_block_data(client, FIFO_RD_AUX_LSB,    //讀取低字節數據
						1, &temp_buf);
	if (ret < 1)
		printk(KERN_DEBUG "FIFO_RD_AUX_LSB read fails
");
	else
		aux_buf[1] = temp_buf;
	aux = (aux_buf[0] << 4) +           //視最低4位無效并去掉
					(aux_buf[1] >> 4);

	/*
	10k和18.7k并聯后電阻 
	R=18.7*10/(18.7+10)=6.516
	V(aux) = V(bat)*6.516/(6.516+18.7)
	V(aux) = aux*3300/0xfff
	V(bat) = aux*1386880/444717
	*/
	sample_data = (aux*1386880)/444717;	//計算出電池電壓
	return sample_data;
}

u32  max11801_read_adc(void)
{
	u32 adc_data;
	adc_data = max11801_dcm_sample_aux(max11801_client);
//	printk("----%s %d
",__func__,adc_data);	//lijianzhang
	return adc_data;
}
EXPORT_SYMBOL_GPL(max11801_read_adc);

由于電池電量檢測的驅動非常簡單,而且和充電驅動關系非常密切,因此一般都卸載充電驅動里面,我們也是這么做的。下面的代碼都是從充電驅動中摘出來的,因此當大家看到,一些設備文件和函數參數類型 都是充電驅動中的 時候不要太奇怪。

通過上面的max11801_read_adc函數我們已經得到了理論計算的電池的電壓,但實際應用中由于分壓電阻誤差,焊接問題等,這個電壓會有一定的誤差因此需要一個校正函數

u32 calibration_voltage(struct max8903_data *data)
{
	int volt[ADC_SAMPLE_COUNT];
	u32 voltage_data;
	int i;
		for (i = 0; i < ADC_SAMPLE_COUNT; i++) {    //多次采樣,防止AD誤差
			if (data->charger_online == 0 && data->usb_charger_online == 0) {
				/* ADC offset when battery is discharger*/
				volt[i] = max11801_read_adc()-offset_discharger;    //沒有充電情況下 電壓誤差
				} else {
						if (data->charger_online == 1)
						volt[i] = max11801_read_adc()-offset_charger;//DC充電式 電壓誤差
						else if (data->usb_charger_online == 1)
						volt[i] = max11801_read_adc()-offset_usb_charger;//usb充電  電壓誤差
						else if (data->charger_online == 1 && data->usb_charger_online == 1)
						volt[i] = max11801_read_adc()-offset_charger;
				}
		
	}
	sort(volt, i, 4, cmp_func, NULL);//對電壓排序
	for (i = 0; i < ADC_SAMPLE_COUNT; i++)
		pr_debug("volt_sorted[%2d]: %d
", i, volt[i]);
	/* get the average of second max/min of remained. */
	voltage_data = (volt[2] + volt[ADC_SAMPLE_COUNT - 3]) / 2;//去掉最大值最小值 并對剩余數據求平均
	return voltage_data;
}

從上面函數我們讀取到了正確的電壓值。電池電壓是隨時變化的,我們要檢測電池電量,必須隨時采集,因此用一個定時器來做這件事情,代碼如下:

INIT_DELAYED_WORK(&data->work, max8903_battery_work);
	schedule_delayed_work(&data->work, data->interval);

電壓采集完成后就是將電壓上報出去,上報的過程是:我們讀取到電壓變化->告訴android端電池電壓變化了->android會通過power_supply設備文件來讀取具體的電壓值。
我們來看定時器回調函數

static void max8903_battery_work(struct work_struct *work)
{
	struct max8903_data *data;
	data = container_of(work, struct max8903_data, work.work);
	data->interval = HZ * BATTERY_UPDATE_INTERVAL;
	max8903_charger_update_status(data);    //檢測充電狀態
	max8903_battery_update_status(data);    //檢測電池狀態
	/* reschedule for the next time */
	schedule_delayed_work(&data->work, data->interval);//定時器繼續
}

檢測電池狀態函數

static void max8903_battery_update_status(struct max8903_data *data)
{
	int temp;
	static int temp_last;
	bool changed_flag;
	changed_flag = false;
	mutex_lock(&data->work_lock);
	temp = calibration_voltage(data);
	if (temp_last == 0) {
		data->voltage_uV = temp;
		temp_last = temp;
	}
	if (data->charger_online == 0 && temp_last != 0) {//DC充電狀態
		if (temp < temp_last) {
		temp_last = temp;
		data->voltage_uV = temp;
		} else {
		data->voltage_uV = temp_last;
		}
	}
	if (data->charger_online == 1 || data->usb_charger_online == 1) {//USB充電狀態和DC充電狀態
		data->voltage_uV = temp;
		temp_last = temp;
	}
	data->percent = calibrate_battery_capability_percent(data);//計算電量的百分比
	if (data->percent != data->old_percent) {   //電池電壓有變化
		data->old_percent = data->percent;
		changed_flag = true;
	}
	if (changed_flag) {         //如果有變化
		changed_flag = false;
		power_supply_changed(&data->bat);//告訴android端 電池電量改變了
	}
	/*
	    because boot time gap between led framwork and charger
	    framwork,when system boots with charger attatched, charger
	    led framwork loses the first charger online event,add once extra
	    power_supply_changed can fix this issure
	*/
	if (data->first_delay_count < 200) {
		data->first_delay_count = data->first_delay_count + 1 ;
		power_supply_changed(&data->bat);
	}

	mutex_unlock(&data->work_lock);
}

這里我們看到了 power_supply_changed(&data->bat);告訴android端 電池電量改變了,那么下一步android來讀取具體電壓,就涉及到了power_supply設備文件。
來看設備文件的建立過程

	data->bat.name = "max8903-charger";
	data->bat.type = POWER_SUPPLY_TYPE_BATTERY;
	data->bat.properties = max8903_battery_props;
	data->bat.num_properties = ARRAY_SIZE(max8903_battery_props);
	data->bat.get_property = max8903_battery_get_property;
	data->bat.use_for_apm = 1;
	retval = power_supply_register(&pdev->dev, &data->bat);//注冊設備文件
	if (retval) {
		dev_err(data->dev, "failed to register battery
");
		goto battery_failed;
	}

這里注冊了一個名為max8903-charger的 power_supply設備文件,這個設備文件包含了ARRAY_SIZE(max8903_battery_props)個操作分別為

static enum power_supply_property max8903_battery_props[] = {
	POWER_SUPPLY_PROP_VOLTAGE_NOW,//當前電壓
	POWER_SUPPLY_PROP_STATUS,       //當前充電狀態
	POWER_SUPPLY_PROP_PRESENT,      //不太清除
	POWER_SUPPLY_PROP_CAPACITY,     //電量百分比
	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,//電池極限電壓 最大值
	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,//電池極限電壓 最小值
	POWER_SUPPLY_PROP_HEALTH,       //電池健康狀態
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,//電量水平,low或者normal
};

這些狀態是通過max8903_battery_get_property()這個函數來讀取的

static int max8903_battery_get_property(struct power_supply *bat,
				       enum power_supply_property psp,
				       union power_supply_propval *val)
{
	struct max8903_data *di = container_of(bat,
			struct max8903_data, bat);
	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
				if (gpio_get_value(di->pdata->chg) == 0) {
					di->battery_status = POWER_SUPPLY_STATUS_CHARGING;  //正在充電
				} else if (di->ta_in &&
					gpio_get_value(di->pdata->chg) == 1) {
					if (di->percent >= 99)
						di->battery_status = POWER_SUPPLY_STATUS_FULL;//電量大于99就充滿了
					else
						di->battery_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
					}
				  else if (di->usb_in &&
					gpio_get_value(di->pdata->chg) == 1) {
					if (di->percent >= 99)
					    di->battery_status = POWER_SUPPLY_STATUS_FULL;
					else
					  di->battery_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
					}
		val->intval = di->battery_status;
		return 0;
	default:
		break;
	}

	switch (psp) {
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		val->intval = di->voltage_uV;
		break;
	case POWER_SUPPLY_PROP_CHARGE_NOW:
		val->intval = 0;
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
		val->intval = HIGH_VOLT_THRESHOLD;
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
		val->intval = LOW_VOLT_THRESHOLD;
		break;
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = 1;
		break;
	case POWER_SUPPLY_PROP_CAPACITY:
		val->intval = di->percent < 0 ? 0 :
				(di->percent > 100 ? 100 : di->percent);
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		val->intval = POWER_SUPPLY_HEALTH_GOOD;
		if (di->fault)
			val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
		break;
	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
		if (di->battery_status == POWER_SUPPLY_STATUS_FULL)
			val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
		else if (di->percent <= 15)
			val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;//電量小于15%就報低電量
		else
			val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;//否則就報正常
		break;
	default:
		return -EINVAL;
	}

	return 0;
}

當我們注冊設備文件以后,可以在/sys/devices/platform/max8903-charger.1/power_supply/max8903-charger目錄下找到其設備文件如下


我們通過cat命令就可以隨時查看電池狀態。

二、電池電壓校正參數

上面我們知道根據硬件實際情況不同,AD采集出來的電池電壓需要校正參數。也就是

static int offset_discharger;
static int offset_charger;
static int offset_usb_charger;

對于這三個參數,當然我們可以在驅動力寫死,但是為了以后的兼容性我們可以通過android上層來設置,當我們設備出廠時候,通過一配置文件方便的來修改這三個參數,下面我們就來介紹一下,怎么用設備文件和腳本,來修改者三個參數:

我們用的是sys文件系統的設備文件,創建代碼為

	ret = device_create_file(&pdev->dev, &max8903_discharger_dev_attr);
	if (ret)
		dev_err(&pdev->dev, "create device file failed!
");
	ret = device_create_file(&pdev->dev, &max8903_charger_dev_attr);
	if (ret)
		dev_err(&pdev->dev, "create device file failed!
");
	ret = device_create_file(&pdev->dev, &max8903_usb_charger_dev_attr);
	if (ret)
		dev_err(&pdev->dev, "create device file failed!
");

設備文件的實現代碼為

static ssize_t max8903_voltage_offset_discharger_show(struct device *dev,
			    struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "read offset_discharger:%04d
",
		offset_discharger);
}

static ssize_t max8903_voltage_offset_discharger_store(struct device *dev,
			     struct device_attribute *attr, const char *buf,
			     size_t count)
{
	offset_discharger = simple_strtoul(buf, NULL, 10);
	pr_info("read offset_discharger:%04d
", offset_discharger);
	return count;
}

static ssize_t max8903_voltage_offset_charger_show(struct device *dev,
			    struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "read offset_charger:%04d
",
		offset_charger);
}

static ssize_t max8903_voltage_offset_charger_store(struct device *dev,
			     struct device_attribute *attr, const char *buf,
			     size_t count)
{
	offset_charger = simple_strtoul(buf, NULL, 10);
	pr_info("read offset_charger:%04d
", offset_charger);
	return count;
}

static ssize_t max8903_voltage_offset_usb_charger_show(struct device *dev,
			    struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "read offset_usb_charger:%04d
",
		offset_usb_charger);
}

static ssize_t max8903_voltage_offset_usb_charger_store(struct device *dev,
			     struct device_attribute *attr, const char *buf,
			     size_t count)
{
	offset_usb_charger = simple_strtoul(buf, NULL, 10);
	pr_info("read offset_charger:%04d
", offset_usb_charger);
	return count;
}

static struct device_attribute max8903_discharger_dev_attr = {
	.attr = {
		 .name = "max8903_ctl_offset_discharger",
		 .mode = S_IRUSR | S_IWUSR,
		 },
	.show = max8903_voltage_offset_discharger_show,
	.store = max8903_voltage_offset_discharger_store,
};

static struct device_attribute max8903_charger_dev_attr = {
	.attr = {
		 .name = "max8903_ctl_offset_charger",
		 .mode = S_IRUSR | S_IWUSR,
		 },
	.show = max8903_voltage_offset_charger_show,
	.store = max8903_voltage_offset_charger_store,
};

static struct device_attribute max8903_usb_charger_dev_attr = {
	.attr = {
		 .name = "max8903_ctl_offset_usb_charger",
		 .mode = S_IRUSR | S_IWUSR,
		 },
	.show = max8903_voltage_offset_usb_charger_show,
	.store = max8903_voltage_offset_usb_charger_store,
};

這樣,我們就可以在/sys/devices/platform/max8903-charger.1目錄下看到這樣三個設備文件


我們用cat命令可以讀出當前值,用echo "500">>max8903_ctl_offset_charger 可以修改當前值

這樣我們就可以在系統啟動的時候,用腳本來自動修改者三個值,我用的辦法是在init.rc的on boot階段增加這么三行

#battery charge
    write /sys/devices/platform/max8903-charger.1/max8903_ctl_offset_charger 150
    write /sys/devices/platform/max8903-charger.1/max8903_ctl_offset_discharger 200
    write /sys/devices/platform/max8903-charger.1/max8903_ctl_offset_usb_charger 250

當然大家也可以把這三行命令寫在另外一個腳本里,然后init.rc中調用

三、電池充電

電池充電的電路


一共有4個引腳輸出到cpu中:

CHG_FLT1_B 電池檢測錯誤

UOK_B usb插入

DOK_BDC插入

CHG_STATUS1_B 充電狀態

對于充電狀態的檢測過程,和電量檢測基本相同, 檢測到狀態變化->告訴android層發生變化->android層通過設備文件來讀取變化值

知道了這些我們來看驅動,首先在board文件中添加max8903設備

static struct max8903_pdata charger1_data = {
	.dok = SABRESD_CHARGE_DOK_B,
	.uok = SABRESD_CHARGE_UOK_B,
	.chg = CHARGE_STATE2,
	.flt = CHARGE_STATE1,
	.dcm_always_high = true,
	.dc_valid = true,
	.usb_valid = true, 
};

static struct platform_device sabresd_max8903_charger_1 = {
	.name	= "max8903-charger",
	.id	= 1,
	
	.dev	= {
		.platform_data = &charger1_data,
	},
};
platform_device_register(&sabresd_max8903_charger_1);

然后在/derivers/power/目錄下添加驅動文件。充電狀態的變化都是IO電平的變化,我們來看驅動是怎么處理這4個io的,首先在probe函數中

申請IO

if (pdata->dc_valid) {
		if (pdata->dok && gpio_is_valid(pdata->dok)) {
			gpio = pdata->dok; /* PULL_UPed Interrupt */
			/* set DOK gpio input */
			ret = gpio_request(gpio, "max8903-DOK");
			if (ret) {
				printk(KERN_ERR"request max8903-DOK error!!
");
				goto err;
			} else {
				gpio_direction_input(gpio);
			}
			ta_in = gpio_get_value(gpio) ? 0 : 1;
		} else if (pdata->dok && gpio_is_valid(pdata->dok) && pdata->dcm_always_high) {
			ta_in = pdata->dok; /* PULL_UPed Interrupt */
			ta_in = gpio_get_value(gpio) ? 0 : 1;
		} else {
			dev_err(dev, "When DC is wired, DOK and DCM should"
					" be wired as well."
					" or set dcm always high
");
			ret = -EINVAL;
			goto err;
		}
	}
	if (pdata->usb_valid) {
		if (pdata->uok && gpio_is_valid(pdata->uok)) {
			gpio = pdata->uok;
			/* set UOK gpio input */
			ret = gpio_request(gpio, "max8903-UOK");
			if (ret) {
				printk(KERN_ERR"request max8903-UOK error!!
");
				goto err;
			} else {
				gpio_direction_input(gpio);
			}
			usb_in = gpio_get_value(gpio) ? 0 : 1;
		} else {
			dev_err(dev, "When USB is wired, UOK should be wired."
					"as well.
");
			ret = -EINVAL;
			goto err;
		}
	}
	if (pdata->chg) {
		if (!gpio_is_valid(pdata->chg)) {
			dev_err(dev, "Invalid pin: chg.
");
			ret = -EINVAL;
			goto err;
		}
		/* set CHG gpio input */
		ret = gpio_request(pdata->chg, "max8903-CHG");
		if (ret) {
			printk(KERN_ERR"request max8903-CHG error!!
");
			goto err;
		} else {
			gpio_direction_input(pdata->chg);
		}
	}
	if (pdata->flt) {
		if (!gpio_is_valid(pdata->flt)) {
			dev_err(dev, "Invalid pin: flt.
");
			ret = -EINVAL;
			goto err;
		}
		/* set FLT gpio input */
		ret = gpio_request(pdata->flt, "max8903-FLT");
		if (ret) {
			printk(KERN_ERR"request max8903-FLT error!!
");
			goto err;
		} else {
			gpio_direction_input(pdata->flt);
		}
	}
	if (pdata->usus) {
		if (!gpio_is_valid(pdata->usus)) {
			dev_err(dev, "Invalid pin: usus.
");
			ret = -EINVAL;
			goto err;
		}
	}

注冊DC充電的設備文件

mutex_init(&data->work_lock);
	data->fault = false;
	data->ta_in = ta_in;
	data->usb_in = usb_in;
	data->psy.name = "max8903-ac";
	data->psy.type = POWER_SUPPLY_TYPE_MAINS;
	data->psy.get_property = max8903_get_property;
	data->psy.properties = max8903_charger_props;
	data->psy.num_properties = ARRAY_SIZE(max8903_charger_props);
	ret = power_supply_register(dev, &data->psy);
	if (ret) {
		dev_err(dev, "failed: power supply register.
");
		goto err_psy;
	}

注冊USB充電的設備文件

data->usb.name = "max8903-usb";
	data->usb.type = POWER_SUPPLY_TYPE_USB;
	data->usb.get_property = max8903_get_usb_property;
	data->usb.properties = max8903_charger_props;
	data->usb.num_properties = ARRAY_SIZE(max8903_charger_props);
	ret = power_supply_register(dev, &data->usb);
	if (ret) {
		dev_err(dev, "failed: power supply register.
");
		goto err_psy;
	}

這兩個設備文件都只有一個操作:檢測充電器是否在線

static enum power_supply_property max8903_charger_props[] = {
	POWER_SUPPLY_PROP_ONLINE,
};

操作函數也很簡單

static int max8903_get_property(struct power_supply *psy,
		enum power_supply_property psp,
		union power_supply_propval *val)
{
	struct max8903_data *data = container_of(psy,
			struct max8903_data, psy);

	switch (psp) {
	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = 0;
		if (data->ta_in)
			val->intval = 1;
		data->charger_online = val->intval;
		break;
	default:
		return -EINVAL;
	}
	return 0;
}
static int max8903_get_usb_property(struct power_supply *usb,
		enum power_supply_property psp,
		union power_supply_propval *val)
{
	struct max8903_data *data = container_of(usb,
			struct max8903_data, usb);

	switch (psp) {
	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = 0;
		if (data->usb_in)
			val->intval = 1;
		data->usb_charger_online = val->intval;
		break;
	default:
		return -EINVAL;
	}
	return 0;
}

我們可以通過/sys/devices/platform/max8903-charger.1/power_supply/max8903-ac 目錄和/sys/devices/platform/max8903-charger.1/power_supply/max8903-usb目錄下的設備文件來訪問充電器的狀態

接下來是IO中斷

if (pdata->dc_valid) {
		ret = request_threaded_irq(gpio_to_irq(pdata->dok),
				NULL, max8903_dcin,
				IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
				"MAX8903 DC IN", data);
		if (ret) {
			dev_err(dev, "Cannot request irq %d for DC (%d)
",
					gpio_to_irq(pdata->dok), ret);
			goto err_usb_irq;
		}
	}

	if (pdata->usb_valid) {
		ret = request_threaded_irq(gpio_to_irq(pdata->uok),
				NULL, max8903_usbin,
				IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
				"MAX8903 USB IN", data);
		if (ret) {
			dev_err(dev, "Cannot request irq %d for USB (%d)
",
					gpio_to_irq(pdata->uok), ret);
			goto err_dc_irq;
		}
	}

	if (pdata->flt) {
		ret = request_threaded_irq(gpio_to_irq(pdata->flt),
				NULL, max8903_fault,
				IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
				"MAX8903 Fault", data);
		if (ret) {
			dev_err(dev, "Cannot request irq %d for Fault (%d)
",
					gpio_to_irq(pdata->flt), ret);
			goto err_flt_irq;
		}
	}

	if (pdata->chg) {
		ret = request_threaded_irq(gpio_to_irq(pdata->chg),
				NULL, max8903_chg,
				IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
				"MAX8903 Fault", data);
		if (ret) {
			dev_err(dev, "Cannot request irq %d for Fault (%d)
",
					gpio_to_irq(pdata->flt), ret);
			goto err_chg_irq;
		}
	}

這4個IO的中斷處理函數很類似

static irqreturn_t max8903_dcin(int irq, void *_data)
{
	struct max8903_data *data = _data;
	struct max8903_pdata *pdata = data->pdata;
	bool ta_in;

	ta_in = gpio_get_value(pdata->dok) ? false : true;   //保存當前dok值

	if (ta_in == data->ta_in)
		return IRQ_HANDLED;

	data->ta_in = ta_in;
	pr_info("TA(DC-IN) Charger %s.
", ta_in ?
			"Connected" : "Disconnected");
	max8903_charger_update_status(data);    
	max8903_battery_update_status(data);    
	power_supply_changed(&data->psy);   //報告狀態改變
	power_supply_changed(&data->bat);
	return IRQ_HANDLED;
}
static irqreturn_t max8903_usbin(int irq, void *_data)
{
	struct max8903_data *data = _data;
	struct max8903_pdata *pdata = data->pdata;
	bool usb_in;
	usb_in = gpio_get_value(pdata->uok) ? false : true; //保存當前uok值
	if (usb_in == data->usb_in)
		return IRQ_HANDLED;

	data->usb_in = usb_in;
	max8903_charger_update_status(data);
	max8903_battery_update_status(data);
	pr_info("USB Charger %s.
", usb_in ?
			"Connected" : "Disconnected");
	power_supply_changed(&data->bat);
	power_supply_changed(&data->usb);  //報告狀態改變
	return IRQ_HANDLED;
}

static irqreturn_t max8903_fault(int irq, void *_data)
{
	struct max8903_data *data = _data;
	struct max8903_pdata *pdata = data->pdata;
	bool fault;

	fault = gpio_get_value(pdata->flt) ? false : true;  //保存當前電池錯誤值

	if (fault == data->fault)
		return IRQ_HANDLED;

	data->fault = fault;

	if (fault)
		dev_err(data->dev, "Charger suffers a fault and stops.
");
	else
		dev_err(data->dev, "Charger recovered from a fault.
");
	max8903_charger_update_status(data);
	max8903_battery_update_status(data);
	power_supply_changed(&data->psy);
	power_supply_changed(&data->bat);
	power_supply_changed(&data->usb);   //報告狀態改變
	return IRQ_HANDLED;
}

static irqreturn_t max8903_chg(int irq, void *_data)
{
	struct max8903_data *data = _data;
	struct max8903_pdata *pdata = data->pdata;
	int chg_state;

	chg_state = gpio_get_value(pdata->chg) ? false : true;//保存電池充電狀態

	if (chg_state == data->chg_state)
		return IRQ_HANDLED;

	data->chg_state = chg_state;
	max8903_charger_update_status(data);
	max8903_battery_update_status(data);
	power_supply_changed(&data->psy);
	power_supply_changed(&data->bat);
	power_supply_changed(&data->usb);//報告狀態改變
	return IRQ_HANDLED;
}

到了這里電池充電的流程就走完了。


總結

以上是生活随笔為你收集整理的android电池充电以及电量检测驱动分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久精品免费观看 | 91亚洲国产成人久久精品网站 | 亚洲视频在线免费观看 | 天天躁日日躁狠狠躁av麻豆 | 欧美色久 | 免费手机黄色网址 | 成人国产网址 | 午夜精品久久一牛影视 | 韩国一区在线 | 91亚洲永久精品 | 欧美日韩一区二区在线 | 国产v视频 | 五月婷婷操 | 亚洲黄色片一级 | 国产精品网站一区二区三区 | 日韩色中色 | 国产成人精品av在线 | 久久8精品 | 欧洲高潮三级做爰 | 欧美日韩一区二区三区免费视频 | 国产一级片网站 | 日韩精品免费 | 九九热99视频 | 欧美9999| 中文字幕黄色av | 国产又粗又猛又爽又黄的视频免费 | 国产免费观看久久 | 在线观看亚洲专区 | 免费精品在线视频 | 美女久久久久久久 | 久草热久草视频 | 2020天天干天天操 | 91精品久久久久久久99蜜桃 | 国产精品女 | 国产精品久久久久久久久久免费看 | 久久久久国 | 不卡国产在线 | 日本久久久久久 | 最近最新mv字幕免费观看 | 日日天天干 | 一区二区三区在线观看 | 国产五月色婷婷六月丁香视频 | 亚洲国产午夜精品 | 久久99国产一区二区三区 | 国产精品久久久久av | 天天拍天天操 | 国产无遮挡又黄又爽在线观看 | 久久精品看 | 色综合天天爱 | 国产 色| 免费看的黄色小视频 | 丁香 久久 综合 | 亚洲天堂精品视频在线观看 | 日韩中文字幕免费在线播放 | 国产一区二区电影在线观看 | 色悠悠久久综合 | 国产精品久久久毛片 | 中文在线8新资源库 | 99在线观看免费视频精品观看 | 亚洲欧美一区二区三区孕妇写真 | 最新av网址在线观看 | 国产一级高清 | 最新av电影网址 | 91手机视频 | 天天射天天操天天色 | 国产一二区免费视频 | 久久久久这里只有精品 | 精品国产1区2区 | 97av视频在线 | 91av电影网| 天天干天天插伊人网 | 国产福利91精品一区 | 日韩成人免费电影 | 麻豆va一区二区三区久久浪 | 精品久久久久久国产 | 天天操天天干天天操天天干 | 国产亚洲精品久久久久久久久久久久 | 天天干天天碰 | 国产成人精品福利 | 国产一区二区三区免费在线观看 | 9992tv成人免费看片 | 黄色在线观看免费网站 | 午夜在线看片 | 99综合视频| 国产专区精品 | 96久久久 | 久久五月情影视 | 日韩二区三区在线 | 国产精品黄色在线观看 | 国产91探花 | 91色在线观看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 97av精品| 在线视频观看亚洲 | 亚洲男男gaygay无套 | 欧美日韩国产mv | 久草在线这里只有精品 | 午夜骚影 | 91漂亮少妇露脸在线播放 | 91av播放| 国产成人福利在线观看 | 久久艹影院 | 在线免费观看黄色av | 成人a视频片观看免费 | 亚洲 欧美 国产 va在线影院 | 亚洲另类视频在线观看 | 日韩美精品视频 | 国产精彩在线视频 | 99视频网址 | 中文字幕人成人 | 国内久久久久 | 激情婷婷在线观看 | 国产a高清 | 精品 激情 | 中文字幕色综合网 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美日韩一二三四区 | 国产成人精品久久二区二区 | 综合网伊人 | 丁香婷婷综合色啪 | 免费日韩av片 | 亚洲欧洲精品一区二区 | 午夜91在线 | 午夜视频免费在线观看 | 在线观看你懂的网址 | 国产中文字幕视频在线观看 | 2020天天干天天操 | 国产精品日韩在线播放 | 亚洲第一中文字幕 | 黄色免费网战 | 成 人 黄 色 视频 免费观看 | 中文日韩在线视频 | 中文有码在线视频 | 久久精品视频在线免费观看 | 九九视频免费 | 在线播放 一区 | 国产精品久久久久久久久搜平片 | 青青射 | 中文字幕在线免费97 | 婷婷视频 | 国产精品网在线观看 | 成片免费观看视频999 | 91视频91蝌蚪 | 国产精品视频全国免费观看 | 日韩欧美视频在线免费观看 | 天天综合天天做天天综合 | 日韩欧美国产精品 | 免费av电影网站 | 日韩色一区二区三区 | 日韩高清av | 天天视频亚洲 | www九九热| 日韩免费观看一区二区 | 亚洲成人国产 | 亚洲国产mv | 超碰国产97 | 日韩在线视频网 | 天天摸日日摸人人看 | 99精品视频精品精品视频 | 在线视频免费观看 | 在线观看免费高清视频大全追剧 | 天天爽天天搞 | 国产精品久久久久婷婷 | www.久久免费视频 | 最新国产一区二区三区 | 国产九色视频在线观看 | 日日精品| 久久精品美女 | 成人午夜剧场在线观看 | 色开心| www一起操 | 波多野结衣理论片 | 五月综合色| 欧美日韩在线网站 | 人人爽人人片 | 国产成人久久精品亚洲 | 亚洲欧美成人综合 | 91九色在线视频 | 在线国产片| 国产成人777777 | 日本三级在线观看中文字 | 精品一区二区在线免费观看 | 欧美黄色高清 | 日本成址在线观看 | 视频一区在线免费观看 | 亚洲成人一二三 | 欧美日韩高清一区二区 国产亚洲免费看 | 九九色视频 | 国产成人精品一区二区在线 | 久久精品影视 | 久久久久亚洲精品男人的天堂 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 亚洲国产av精品毛片鲁大师 | 亚洲天堂社区 | 日韩在线观看小视频 | 91c网站色版视频 | 久久在线免费观看 | 亚洲开心激情 | 在线观看mv的中文字幕网站 | 成人黄色小视频 | 国产一区二区三区黄 | 国产手机av在线 | 深爱婷婷激情 | www一起操 | 亚洲综合欧美日韩狠狠色 | 天天色天天搞 | 中国一 片免费观看 | 日韩欧美国产激情在线播放 | 日日干夜夜骑 | 国产分类视频 | 青草视频免费观看 | 国产在线久久久 | 婷婷色在线 | 激情综合网在线观看 | 日韩色在线| 99re国产视频 | 人人添人人 | 色偷偷网站视频 | 欧美小视频在线观看 | 色综合久久88色综合天天人守婷 | 天堂在线成人 | 亚洲第一中文字幕 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产一区久久 | 久久精品99国产国产 | 国产精品一区二区精品视频免费看 | 欧美精品免费在线观看 | 成人一区二区在线观看 | 深爱激情五月婷婷 | 91视频成人免费 | 国产小视频福利在线 | 亚洲激情婷婷 | 亚洲精品午夜视频 | 成 人 黄 色 免费播放 | 激情偷乱人伦小说视频在线观看 | 国产精品视频线看 | 999国产精品视频 | 一级黄视频 | 国产精品久久久久久久久久久久午夜 | 成人午夜电影在线播放 | 亚洲欧美综合 | 在线成人中文字幕 | 国产视频美女 | 欧美日韩不卡在线观看 | 99色免费视频 | 久久综合免费 | 久久婷婷国产色一区二区三区 | 国产免费作爱视频 | 97干com | 亚洲精品国产精品国产 | 97在线观看视频免费 | 五月综合网站 | 丁香婷婷网 | 亚洲砖区区免费 | 国产精品第52页 | 亚洲精品国产精品国自产在线 | 天天射狠狠干 | 国产免费av一区二区三区 | 日韩久久精品 | 中文字幕视频网 | 国产视频高清 | 96av视频 | 欧美日韩国产成人 | 狠日日 | 69欧美视频 | 高清免费在线视频 | 91精品国产欧美一区二区成人 | 在线成人一区二区 | 天天看天天干 | 色在线亚洲 | 亚洲人久久| 成人在线观看资源 | 97香蕉久久国产在线观看 | www.99久久.com | 99精品成人| 婷婷激情站 | 992tv又爽又黄的免费视频 | 久久久免费视频播放 | 国产999免费视频 | 日本电影久久 | 国产一区二区免费看 | 91视频com| 又黄又爽又无遮挡免费的网站 | www好男人 | 日本中文字幕在线一区 | 在线成人免费 | 久久综合色综合88 | 亚洲乱亚洲乱亚洲 | 500部大龄熟乱视频 欧美日本三级 | 欧美精品一区二区三区四区在线 | 精品一区电影国产 | 91精品在线免费 | 国产一区高清在线观看 | 成人免费在线视频 | 国产精品久久久久久妇 | 欧美美女激情18p | 日韩免费在线观看网站 | 久久久午夜视频 | 欧洲精品久久久久毛片完整版 | 成人在线视频网 | 天天干天天操天天爱 | 中文字幕精品一区二区精品 | 黄色片网站 | 天天操天天操天天 | 国产精品99在线播放 | 久久久久久久99 | 天天视频色 | 五月婷婷色 | 在线观看日韩专区 | 国产精品国产三级国产aⅴ无密码 | 麻豆小视频在线观看 | 91漂亮少妇露脸在线播放 | 成人在线视频论坛 | 免费观看成人 | 亚洲视频电影在线 | 中文字幕影视 | 亚洲一片黄 | 亚洲天堂网视频在线观看 | 人人澡人人爱 | 色网站在线看 | 亚洲三级性片 | 久久视频在线观看 | 91视频xxxx| 成人在线免费看视频 | 综合久久五月天 | 亚洲精品视频在线免费播放 | 久久国产精品99久久久久久丝袜 | 97超碰人人澡人人 | 国产麻豆果冻传媒在线观看 | 九九在线播放 | 成人av网页 | 国产 日韩 欧美 自拍 | 91自拍视频在线观看 | 深夜免费网站 | 九九视频免费在线观看 | 91av观看| 亚洲一区视频在线播放 | 亚洲精品啊啊啊 | 美女视频黄网站 | 一区二区三区不卡在线 | 国产色在线,com | 天天操天天干天天插 | www激情久久 | 美女福利视频在线 | www.久久色| 亚洲国产资源 | 人人涩| 香蕉视频在线免费看 | 日韩欧美视频免费看 | 成人黄色电影免费观看 | 中文字幕免费在线 | 91高清免费在线观看 | 亚洲精品免费在线 | 成人网444ppp | 国产精品观看 | 久久久久成| 欧美日产在线观看 | 国产最新在线 | 在线激情影院一区 | 五月激情久久久 | 免费手机黄色网址 | 中文字幕在线观看免费高清电影 | 91久久久久久久一区二区 | 免费av片在线 | 2023国产精品自产拍在线观看 | 91九色视频国产 | 99草视频| 可以免费看av | 欧美午夜性生活 | 日日夜夜天天综合 | 国产精品中文字幕在线 | 欧美亚洲国产一卡 | 九七视频在线观看 | 国产一级淫片在线观看 | 超碰九九 | 日韩高清免费无专码区 | 国产成人精品综合久久久久99 | 91人人爽人人爽人人精88v | 亚洲欧美日韩精品久久久 | 在线观看网站你懂的 | 四虎在线影视 | 操夜夜操 | 日韩亚洲在线 | 午夜精品导航 | 欧美一区二区三区在线视频观看 | 在线观看成人小视频 | 亚洲人成在线电影 | 6080yy午夜一二三区久久 | 国产精品久久99 | 五月天激情视频 | 久久婷婷一区二区三区 | 亚洲精品高清在线观看 | 91麻豆精品国产91久久久使用方法 | 国产精品成人aaaaa网站 | 日韩av快播电影网 | 国产明星视频三级a三级点| 中文在线字幕免 | 免费黄色av片 | 美女黄频视频大全 | 久久不卡av | 欧美日韩视频在线 | 狠狠伊人| 国产手机视频在线观看 | 日本视频久久久 | 九九久久国产精品 | 狠狠色噜噜狠狠狠合久 | 天干啦夜天干天干在线线 | 精品久久五月天 | 亚洲国产日韩欧美 | 99久久99 | 成人免费视频视频在线观看 免费 | 久久美女高清视频 | 97超碰人| 久久精品香蕉 | 亚州av免费 | 麻豆一级视频 | 久久人人97超碰精品888 | 在线观看 亚洲 | 男女视频国产 | 日韩二区三区在线观看 | 激情五月婷婷综合 | 中文字幕在线观看免费高清完整版 | 国产精品第7页 | 99精品电影 | 97av在线 | 国产高清福利在线 | 精品国产亚洲在线 | 在线国产小视频 | 在线免费黄色 | 天天鲁一鲁摸一摸爽一爽 | 日韩精品一区二区三区丰满 | 婷婷干五月 | 久久99热这里只有精品 | 99久久夜色精品国产亚洲96 | 99视频在线 | 婷婷色资源 | 久久久久久久18 | 国产无套精品久久久久久 | 激情在线网址 | 最近中文字幕大全中文字幕免费 | 色婷婷综合激情 | 国产粉嫩在线 | 97视频中文字幕 | 国产日韩在线观看一区 | 日韩网站在线看片你懂的 | 国产精品免费在线视频 | 免费高清在线观看成人 | 日本公妇在线观看 | 亚洲国产精品成人女人久久 | 天海翼一区二区三区免费 | 中文字幕丝袜美腿 | 激情视频一区 | 91九色视频国产 | 国产日韩欧美在线一区 | 天天干,天天射,天天操,天天摸 | 91成熟丰满女人少妇 | 国产精品麻豆三级一区视频 | 色爱区综合激月婷婷 | 色欧美日韩 | 久久久久久久久免费视频 | 国产高清视频免费在线观看 | 在线99热 | 国产成人精品一区二区三区网站观看 | 天天艹天天 | 欧美日韩在线网站 | 国产毛片久久久 | 成人黄色在线视频 | 97视频人人免费看 | 在线观看www91 | 色爽网站 | 久久久黄色av | 久久综合综合久久综合 | 国产精品一区二区免费在线观看 | 国产手机视频在线观看 | 久草a视频| 日本在线成人 | 国产成人精品综合 | 最近免费中文字幕 | 国产成人精品免高潮在线观看 | 国产精品二区在线观看 | 国产专区视频在线 | 国产精品一区二区视频 | 国产视频精品免费 | 丁香六月婷 | 国产精品国产三级国产aⅴ9色 | 久久久免费网站 | 欧美一级视频一区 | 久久久久亚洲国产 | 天堂中文在线播放 | 黄色三级免费 | 国产专区在线视频 | 中文字幕黄色av | 国产精品亚洲片夜色在线 | 亚洲黄色在线播放 | 久久精品爱视频 | 免费毛片一区二区三区久久久 | 黄色在线免费观看网站 | 又色又爽又激情的59视频 | 国产香蕉97碰碰久久人人 | 久久精品一区二区三区中文字幕 | 国产精品第十页 | 麻花豆传媒一二三产区 | 97精品国产手机 | 狠狠色丁香九九婷婷综合五月 | 久久人人爽视频 | 青春草免费视频 | 国产不卡免费视频 | 亚洲最新在线视频 | 中文字幕日韩国产 | 免费看黄的视频 | 婷婷综合成人 | 黄色成年片| 亚洲精品国产综合久久 | 亚洲精品影视 | 毛片永久新网址首页 | 日韩一级电影在线观看 | 久草网免费 | 亚洲少妇自拍 | 美女视频a美女大全免费下载蜜臀 | 在线成人免费 | 麻豆视频入口 | 国产91亚洲 | 亚洲激情电影在线 | 久久久久国产成人免费精品免费 | 午夜视频在线观看一区 | 国产美女免费观看 | 国产免费高清视频 | 99精品视频一区二区 | 国产成人亚洲在线电影 | 久久精品99国产国产 | 亚洲一区二区三区在线看 | 国产精品精品国产 | 精品九九九| 成人av高清在线 | 日韩av高潮| 成人午夜精品久久久久久久3d | 欧美一二三四在线 | 人人讲下载 | 午夜精品一区二区国产 | 最近中文字幕在线播放 | 免费日韩 精品中文字幕视频在线 | 色婷婷亚洲综合 | 亚洲资源网 | 亚洲一区av | 美女网站视频久久 | 免费高清看电视网站 | 超碰精品在线观看 | 国产精品久久久久久爽爽爽 | 婷婷色在线 | 亚洲最新合集 | 国产九九九视频 | 国产一级在线 | 99热播精品 | 人人超碰免费 | 亚洲 欧洲 国产 精品 | 四虎影视国产精品免费久久 | 丁香在线视频 | 操天天操 | 一本一本久久a久久精品综合小说 | 国产免费观看av | 婷婷色视频 | 香蕉视频亚洲 | 99色免费视频 | 国产在线观看xxx | 国产视频精品在线 | 久久夜色精品国产欧美乱极品 | 国产美女免费视频 | 精品亚洲一区二区 | 天天操·夜夜操 | av福利在线导航 | 精品国产一区二区三区蜜臀 | 久久试看| 国产在线a视频 | 五月天视频网 | www.天天射.com | 日韩精品欧美专区 | 日韩精品一区二区在线 | 91超在线| 三级av免费看 | 91精品视频免费观看 | 日韩中文字幕免费 | 天天操人人干 | 日韩电影一区二区在线观看 | 99国产情侣在线播放 | 色视频在线观看 | 国产亚洲精品bv在线观看 | 国产亚洲成人精品 | 99免费在线观看视频 | 国产精品theporn| av国产在线观看 | 91视频啪 | www.久久精品视频 | 91精品国产自产91精品 | 伊香蕉大综综综合久久啪 | 西西人体4444www高清视频 | 色综合夜色一区 | 成人免费视频网站在线观看 | 天天操天天谢 | 波多野结衣综合网 | 成 人 a v天堂 | 国产手机视频在线播放 | 欧美一级片免费在线观看 | 婷婷av网 | 中文字幕美女免费在线 | 女人18毛片a级毛片一区二区 | 国产精品白虎 | 黄色aaa毛片 | 日韩在线免费电影 | 狠狠综合久久 | 午夜精品成人一区二区三区 | 91视频成人免费 | 亚洲国产日韩一区 | 日韩啪视频 | 国产小视频福利在线 | 欧美日韩国产亚洲乱码字幕 | 最近高清中文在线字幕在线观看 | 三上悠亚一区二区在线观看 | 日韩久久视频 | 六月丁香六月婷婷 | 在线观看mv的中文字幕网站 | 热久久视久久精品18亚洲精品 | 99视频精品全部免费 在线 | 国产成人精品久久二区二区 | av不卡在线看 | 麻豆视频在线 | 手机在线免费av | 一级片视频在线 | 亚洲黄色三级 | 五月开心六月伊人色婷婷 | 亚洲一区二区三区毛片 | 99热最新 | 日韩一二区在线观看 | 伊人国产在线播放 | 久久综合色天天久久综合图片 | 伊人六月| 中文字幕观看视频 | 激情网五月婷婷 | 欧美激情视频一二区 | 99理论片 | 麻豆久久久久久久 | 99精品视频免费观看 | 国产欧美精品一区二区三区四区 | 在线观看免费av片 | 在线免费中文字幕 | 国产欧美综合在线观看 | 国产一区二区手机在线观看 | 69av网| 丝袜美腿av | 国产成人精品一区二区三区网站观看 | 天天鲁一鲁摸一摸爽一爽 | 免费人成在线观看网站 | 在线观看日本高清mv视频 | 日韩久久精品 | 久久国产精品一区二区三区 | 日韩av有码在线 | 中文在线免费观看 | 欧美成人va | 狠狠躁夜夜躁人人爽视频 | 日本性高潮视频 | 久久免费视频播放 | 久久久久久久久久久久亚洲 | 一级片免费视频 | 婷婷在线精品视频 | 玖草影院 | 三级av小说 | a级国产片| 日日干天天插 | 成人黄色电影在线 | 91视频91色 | 亚洲最新合集 | a在线免费观看视频 | 久久久高清视频 | 成人夜晚看av| 久草国产视频 | 91免费在线 | 伊人在线视频 | 天天操伊人 | 久久精品欧美视频 | 亚洲美女免费精品视频在线观看 | 久久综合欧美 | 午夜久久久久久久久 | 国产一区二区三区免费在线观看 | 精品福利视频在线 | 成人超碰在线 | 欧美性脚交 | 人人澡超碰碰 | 国产不卡在线观看视频 | 99久久99久久精品免费 | 人人超碰人人 | 国产精品成人免费精品自在线观看 | 免费日韩 精品中文字幕视频在线 | 高清精品在线 | 久久久精品国产免费观看一区二区 | 国内精品视频在线 | www日韩欧美 | 色婷婷九月| 国产精品久久在线观看 | 成年在线观看 | 国产精品嫩草影视久久久 | 最新影院 | 99日韩精品 | 亚洲,播放 | 免费成人av | 四虎国产精品免费观看视频优播 | 久久99中文字幕 | 五月天六月色 | 一区在线电影 | 亚洲女欲精品久久久久久久18 | 福利视频精品 | 美女一区网站 | 97在线视频免费看 | 日韩 精品 一区 国产 麻豆 | 一区二区三区中文字幕在线观看 | 综合网久久 | 亚洲精品大全 | 欧美日韩亚洲第一页 | 在线国产日韩 | 国产一区二区三区黄 | www色片| 在线综合 亚洲 欧美在线视频 | 99色视频 | av中文在线 | 亚洲全部视频 | 国内精品一区二区 | 久久露脸国产精品 | 中文字幕第 | 在线观看中文字幕一区二区 | 天天操天天操天天操天天操 | 日日草天天干 | 久久国产视频网 | 免费精品国产 | 中文字幕首页 | 在线久久 | 久久视频网| www.av中文字幕.com | 亚洲成人av片 | 五月婷婷操 | 亚洲人片在线观看 | 欧美在线free | 91九色在线| 国产精品久久久久久久久久了 | 天天摸日日摸人人看 | 不卡视频国产 | 国产精品一区二区三区久久久 | 93久久精品日日躁夜夜躁欧美 | 国偷自产中文字幕亚洲手机在线 | 日本一区二区三区免费观看 | 色婷婷在线视频 | 亚洲精品a区 | 国产午夜激情视频 | 在线视频精品播放 | 天堂在线视频免费观看 | 成人一级视频在线观看 | 亚洲最新视频在线播放 | 中文字幕你懂的 | 色婷婷综合久久久久 | 特级西西444www大胆高清无视频 | 精品国产精品久久一区免费式 | www.天天色.com| 波多野结衣视频一区 | 亚洲精品久久久久久久蜜桃 | 国产黄网站在线观看 | 亚洲最新视频在线 | 欧美久久成人 | 亚洲视频在线视频 | 久久久久久久久久久久av | 免费观看成年人视频 | 日韩a在线看 | 91黄色影视 | 国产亚洲视频在线免费观看 | 久久久久久久久久久免费视频 | 99久久国产免费看 | 九九天堂| 日韩视频中文字幕在线观看 | 伊人激情网| 国产亚洲在线视频 | 国产精品久久网站 | 久久久久久久久久久久久久免费看 | 精品国产视频一区 | 欧美精品首页 | 国产小视频在线免费观看 | 久久 亚洲视频 | 免费看色视频 | 精品免费观看 | 午夜在线看 | 国产资源在线播放 | 久久免费成人精品视频 | 亚洲欧美日韩一二三区 | 超碰久热 | 最近中文国产在线视频 | 日韩高清在线不卡 | 成人免费网站在线观看 | 狠狠操操操 | 亚洲高清久久久 | 免费高清男女打扑克视频 | 免费在线观看污 | 在线亚洲高清视频 | 91精品久久久久久 | 亚洲区精品视频 | 很黄很污的视频网站 | 亚洲最大av | 国产精品黄色 | 国产精品h在线观看 | 国产成人精品日本亚洲999 | 色网站在线观看 | 91av资源在线 | 久久国产一区二区 | 日韩欧美在线综合网 | 992tv在线观看 | 69国产精品视频免费观看 | 午夜影院先 | 成人一区二区三区在线观看 | www.久久com| www黄色| 欧美极品xxxx| 日韩一区二区三免费高清在线观看 | 亚洲精品五月 | 精品欧美乱码久久久久久 | 五月婷在线观看 | 丁香综合五月 | 午夜丰满寂寞少妇精品 | 亚洲国内精品在线 | 亚洲欧美视频一区二区三区 | 精品久久一二三区 | 97在线视频免费看 | 麻豆一区在线观看 | 在线探花| 5月丁香婷婷综合 | 精品久久一区二区三区 | 国产字幕在线观看 | 日日夜夜精品网站 | 久久免费电影 | 四季av综合网站 | av一级久久| 天天舔天天射天天操 | 日韩视频1 | 久久成人免费视频 | www黄色大片 | 国产精品99久久久久久人免费 | 欧美一区二区三区在线视频观看 | 午夜丁香网 | .国产精品成人自产拍在线观看6 | 国产精品久久久久久久久久久久午 | 精品国产一二三四区 | 色综合久久88色综合天天免费 | 国产精品白浆 | 在线视频免费观看 | 午夜精品一区二区三区免费 | 欧美一区二区三区在线播放 | 久久久久久久久久久免费av | 人人爽人人爽人人爽 | 天天干,天天插 | 一级成人免费视频 | 久久精品国产免费看久久精品 | av中文在线影视 | 亚洲天堂网在线观看视频 | 福利一区视频 | 91免费观看视频在线 | 毛片网在线观看 | 国产精品久久久影视 | 日本久久电影网 | 九九视频一区 | 成人在线观看免费视频 | 午夜精品久久久 | 在线免费av网 | 97国产 | 色之综合网 | 久久精品二区 | 久久久久久毛片 | 久久免费在线观看 | 国产日产欧美在线观看 | 欧美日韩免费观看一区二区三区 | 亚洲第二色 | av大全在线看 | 国产专区免费 | 成人作爱视频 | 狠狠干干 | 欧美国产日韩在线视频 | 国产视频一区二区在线观看 | 一级黄色电影网站 | 少妇bbr搡bbb搡bbb | 日韩午夜三级 | 一区二区三区电影在线播 | 综合色综合 | 色婷婷国产精品 | 国产99久久久精品 | 色黄www小说 | 奇米影视8888在线观看大全免费 | 色多多在线观看 | 91麻豆文化传媒在线观看 | 欧美日韩免费在线视频 | 国产麻豆视频在线观看 | 在线黄色毛片 | 一区二区中文字幕在线观看 | 99色国产 | 欧美在线视频免费 | 欧美日韩国产一区二区三区在线观看 | 成人av中文字幕在线观看 | 欧美网站黄色 | av短片在线观看 | www.狠狠色.com| 免费成视频 | 在线只有精品 | 黄色特级一级片 | 伊在线视频 | 一区二区精品视频 | 欧美日韩一区二区三区免费视频 | 黄色软件在线观看免费 | 91久久偷偷做嫩草影院 | 中文字幕一区二区三区久久 | 中文字幕a∨在线乱码免费看 | 国产又粗又硬又爽视频 | 天天色播 | 天天操天天玩 | 99视频黄| 蜜桃av人人夜夜澡人人爽 | 97色婷婷成人综合在线观看 | 久久国产精品久久w女人spa | 日本黄色大片免费 | 亚洲男女精品 | 五月综合激情婷婷 | 五月的婷婷 | 日韩欧美精品一区二区 | 免费黄色网址网站 | 久久久久国产a免费观看rela | 国产精品福利在线播放 | 久久观看免费视频 | 在线亚洲播放 | 国产精品成人一区二区三区吃奶 | 99久久er热在这里只有精品15 | 欧美日韩一区二区三区在线观看视频 | 999精品在线 | 亚洲最新视频在线播放 | 日本婷婷色 | 国产精品二区在线 | 97av视频在线 | 久久综合色影院 | 激情av综合| 色视频网站在线观看一=区 a视频免费在线观看 | 草久在线 | 国产精品福利一区 | 欧美日韩国内在线 | 国产精品一区免费在线观看 | www.国产在线观看 | 国产 亚洲 欧美 在线 | 天天操天天干天天摸 | 久久午夜免费观看 | 久久爽久久爽久久av东京爽 | 在线观看国产区 | 日韩国产在线观看 | 久久精品99久久久久久 | 成年人黄色免费网站 | 丁香婷婷在线 | 日韩女同一区二区三区在线观看 | 免费看成人片 | 在线欧美a| 日b视频在线观看网址 | 二区三区中文字幕 | 在线观看免费版高清版 | 日韩经典一区二区三区 | 精品国产视频在线观看 | 欧美激情精品 | 国外调教视频网站 | 麻豆久久精品 | 成年人免费在线播放 | www.亚洲在线 | 国产精品v欧美精品 | 999抗病毒口服液 | 97在线播放视频 | av大全在线免费观看 | 免费av成人在线 | 超碰在线公开免费 | 国产精品21区 | 精品96久久久久久中文字幕无 | 韩日成人av | 亚洲精品网站在线 | 亚洲精品久久久久久国 | 日韩电影黄色 | 97国产在线 | 中文字幕在线观看免费 | 国产一区二区不卡视频 | 欧美91视频 | 人人操日日干 | 亚洲国产成人精品电影在线观看 | 综合网伊人 | 国产一区二三区好的 | 国产高清在线 | 日韩网站在线播放 | 在线观看中文字幕第一页 | 久久草在线免费 | 91最新网址在线观看 | 天天射天天射 | 国产高清不卡av | 国产精品免费久久久久久 | 久久久高清免费视频 | 在线播放精品一区二区三区 | 96av在线| 欧美男男激情videos |