Android rom开发:高通平台充电-Micro_usb&&USB_VBUS

基于高通MSM8909+android 7.1,充电模块PM8909。

正常情况下,充电是走micro_usb接口,数据线接入充电,DP DM通信后确定充电类型是usb还是适配器充电,具体内容本文不展开,可自行查阅内核里面的usb驱动phy-msm-usb.c。

本文实现外接5V供电到USB_VBUS即可充电,无需dp dm通信。


1.首先usb驱动phy-msm-usb.c中固定设置充电模式为USB_CDP_CHARGER,最大电流1500ma,即可实现快充,无需dp dm通信,也不影响数据线接入后micro_usb与电脑端通信

2.充电驱动qpnp-linear-charger.c,修改点:

  1. usb接入判断---->一直return 1
  2. 使能充电模式---->一直使能
  3. 设置充电电流---->固定设置为CDP模式的最大电流1500ma
diff --git a/kernel/drivers/power/qpnp-linear-charger.c b/kernel/drivers/power/qpnp-linear-charger.c
old mode 100755
new mode 100644
index 99f1313..f7953a2
--- a/kernel/drivers/power/qpnp-linear-charger.c
+++ b/kernel/drivers/power/qpnp-linear-charger.c
@@ -646,7 +646,8 @@ static int qpnp_lbc_is_usb_chg_plugged_in(struct qpnp_lbc_chip *chip)
 
        pr_debug("rt_sts 0x%x\n", usbin_valid_rt_sts);
 
-       return (usbin_valid_rt_sts & USB_IN_VALID_MASK) ? 1 : 0;
+       //return (usbin_valid_rt_sts & USB_IN_VALID_MASK) ? 1 : 0;
+       return 1;
 }
 
 static int qpnp_lbc_is_chg_gone(struct qpnp_lbc_chip *chip)
@@ -676,10 +677,10 @@ static int qpnp_lbc_charger_enable(struct qpnp_lbc_chip *chip, int reason,
 
        pr_debug("reason=%d requested_enable=%d disabled_status=%d\n",
                                        reason, enable, disabled);
-       if (enable)
-               disabled &= ~reason;
-       else
-               disabled |= reason;
+       //if (enable)
+               disabled &= ~4;
+       //else
+       //      disabled |= reason;
 
        if (!!chip->charger_disabled == !!disabled)
                goto skip;
@@ -693,8 +694,8 @@ static int qpnp_lbc_charger_enable(struct qpnp_lbc_chip *chip, int reason,
                return rc;
        }
 skip:
-       chip->charger_disabled = disabled;
-       return rc;
+       chip->charger_disabled = 0;
+       return 0;
 }
 
 static int qpnp_lbc_is_batt_present(struct qpnp_lbc_chip *chip)
@@ -1381,7 +1382,7 @@ static void qpnp_lbc_set_appropriate_current(struct qpnp_lbc_chip *chip)
                        chip->thermal_mitigation[chip->therm_lvl_sel]);
 
        pr_debug("setting charger current %d mA\n", chg_current);
-       qpnp_lbc_ibatmax_set(chip, chg_current);
+       qpnp_lbc_ibatmax_set(chip, 1500);//固定设置CDP模式的最大电流1500ma
 }
 
 static void qpnp_batt_external_power_changed(struct power_supply *psy)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
if (ptr != pd->usb_psy || evt != PSY_EVENT_PROP_CHANGED) return 0; ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_TYPEC_MODE, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB TYPEC_MODE: %d\n", ret); return ret; } typec_mode = val.intval; ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_PE_START, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB PROP_PE_START: %d\n", ret); return ret; } /* Don't proceed if PE_START=0; start USB directly if needed */ if (!val.intval && !pd->pd_connected && typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) { ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_REAL_TYPE, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB TYPE: %d\n", ret); return ret; } if (val.intval == POWER_SUPPLY_TYPE_USB || val.intval == POWER_SUPPLY_TYPE_USB_CDP || val.intval == POWER_SUPPLY_TYPE_USB_FLOAT) { usbpd_dbg(&pd->dev, "typec mode:%d type:%d\n", typec_mode, val.intval); pd->typec_mode = typec_mode; queue_work(pd->wq, &pd->start_periph_work); printk("psy_change:start_periph_work\n");/////////////////////////////////////////////////////////////// } return 0; } ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_PRESENT, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB PRESENT: %d\n", ret); return ret; } pd->vbus_present = val.intval; /* * For sink hard reset, state machine needs to know when VBUS changes * - when in PE_SNK_TRANSITION_TO_DEFAULT, notify when VBUS falls * - when in PE_SNK_DISCOVERY, notify when VBUS rises */ if (typec_mode && ((!pd->vbus_present && pd->current_state == PE_SNK_TRANSITION_TO_DEFAULT) || (pd->vbus_present && pd->current_state == PE_SNK_DISCOVERY))) { usbpd_dbg(&pd->dev, "hard reset: typec mode:%d present:%d\n", typec_mode, pd->vbus_present); pd->typec_mode = typec_mode; if (!work_busy(&pd->sm_work)) kick_sm(pd, 0); else usbpd_dbg(&pd->dev, "usbpd_sm already running\n"); return 0; } if (pd->typec_mode == typec_mode) return 0; pd->typec_mode = typec_mode; usbpd_dbg(&pd->dev, "typec mode:%d present:%d orientation:%d\n", typec_mode, pd->vbus_present, usbpd_get_plug_orientation(pd));代码分析
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值