基于Qualcom 8960/8921平台

一,软件分析

1.  USB charger types & Power supply types

USB_INVALID_CHARGER              Invalid USB charger.

USB_SDP_CHARGER                       Standard downstream port. Refers to a downstream port  on USB2.0 compliant host/hub.

USB_DCP_CHARGER                      Dedicated charger port (AC charger/ Wall charger).

USB_CDP_CHARGER                      Charging downstream port. Enumeration can happen and IDEV_CHG_MAX can be drawn irrespective of USB state.

USB_ACA_A_CHARGER                                B-device is connected on accessory port with charger connected on charging port. This configuration allows charging in host mode.

USB_ACA_B_CHARGER                 No device (or A-device without VBUS) is connected on accessory port with charger connected on charging port.

USB_ACA_C_CHARGER                 A-device (with VBUS) is connected on accessory port with charger connected on charging port.

USB_ACA_DOCK_CHARGER        A docking station that has one upstream port and one or more downstream ports. Capable of supplying IDEV_CHG_MAX irrespective of devices connected on 
accessory ports.

USB_PROPRIETARY_CHARGER   A proprietary charger pull DP and DM to specific voltages between 2.0-3.3v for identification.

POWER_SUPPLY_TYPE_USB,                      /* Standard Downstream Port */

POWER_SUPPLY_TYPE_USB_DCP,           /* Dedicated Charging Port */

POWER_SUPPLY_TYPE_USB_CDP,           /* Charging Downstream Port */

POWER_SUPPLY_TYPE_USB_ACA,           /* Accessory Charger Adapters */

POWER_SUPPLY_TYPE_BMS,                     /* Battery Monitor System */

2. How to classify or identify charger?

USB_SDP_CHARGER

POWER_SUPPLY_TYPE_USB

USB Charger

USB_CDP_CHARGER

POWER_SUPPLY_TYPE_USB_CDP

USB_ACA_DOCK_CHARGER

POWER_SUPPLY_TYPE_USB_ACA

USB_ACA_A_CHARGER

USB_ACA_B_CHARGER

USB_ACA_C_CHARGER

USB_DCP_CHARGER

POWER_SUPPLY_TYPE_USB_DCP

AC Charger

USB_PROPRIETARY_CHARGER

As for the DMS, refer to bold font items, so it is USB charger.

3. Analysis about source codes

*******************************************************************

###用户空间的分析如下:

1. 检查 /sys/class/power_supply/pm8921-dc/online和 /sys/class/power_supply/usb/online 的值,可以知道是何充电器类型

@frameworks/base/services/jni/com_android_server_batteryservice.cpp中有

int register_android_server_BatteryService(JNIEnv* env)

if (strcmp(buf, "Mains") == 0) { ///sys/class/power_supply/pm8921-dc/type == Mains

snprintf(path, sizeof(path), "%s/%s/online", POWER_SUPPLY_PATH, name);

if (access(path, R_OK) == 0)

gPaths.acOnlinePath = strdup(path);

}

如果/sys/class/power_supply/pm8921-dc/online==1,则插入的充电器是wall
charger

      /sys/class/power_supply/usb/online==1, 则插入的充电器是usb charger

调试路径:/sys/kernel/debug/msm_otg

2. 分析frameworks/base/services/jni/com_android_server_batteryservice.cpp

a.函数register_android_server_BatteryService将为被frameworks/base/services/jni/onload.cpp中的JNI_OnLoad调用,用于关联java和C++之间的变量

b.jclass clazz = env->FindClass("com/android/server/BatteryService"); //根据java的路径找到batteryservice.java对应的jclass

gFieldIds.mAcOnline = env->GetFieldID(clazz, "mAcOnline", "Z");

gFieldIds.mUsbOnline = env->GetFieldID(clazz, "mUsbOnline", "Z"); //用于关联batteryservice.java中变量private
boolean mAcOnline和gFieldIds.mAcOnline

c. android_server_BatteryService_update

static JNINativeMethod sMethods[] = {

/* name, signature, funcPtr */

{"native_update", "()V", (void*)android_server_BatteryService_update},

};

关联到native_update@frameworks/base/services/java/com/android/server/batteryservice.java

3. 分析frameworks/base/services/java/com/android/server/batteryservice.java

a. mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply"); //注册监听该uevent

b.     private UEventObserver mPowerSupplyObserver = new UEventObserver() {

public void onUEvent(UEventObserver.UEvent event) { //如果就收到来自kernel的uevent,触发该函数

update(); //-->native_update();和processValues();

}

};

c. native_update函数会通过JNI调用得到更新的mAcOnline和mUsbOnline值

d. processValues会根据mAcOnline和mUsbOnline值对mPlugType赋值

if (mAcOnline) {

mPlugType = BatteryManager.BATTERY_PLUGGED_AC;

} else if (mUsbOnline) {

mPlugType = BatteryManager.BATTERY_PLUGGED_USB;

} else {

mPlugType = BATTERY_PLUGGED_NONE;

}

e. sendIntent函数会准备Intent并且broadcast这个Intent

Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); //public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";@batteryservice.java

intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY

| Intent.FLAG_RECEIVER_REPLACE_PENDING);

intent.putExtra(BatteryManager.EXTRA_PLUGGED, mPlugType);

ActivityManagerNative.broadcastStickyIntent(intent, null);

4. 分析vendor/semc/packages/apps/debugmenu/src/com/sonyericsson/debugmenu/battery.java

a. 接收intent

private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context arg0, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {

mPowerInformation.parseIntent(intent);

updateViews();

}

}

};

public void registerBroadcastReceivers() {

IntentFilter mIntentFilter;

mIntentFilter = new IntentFilter();

mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); //只接收Intent.ACTION_BATTERY_CHANGED的intent

// Register battery receiver.

registerReceiver(mBatteryInfoReceiver, mIntentFilter);

}

b. parseIntent 得到最新的"plugged"值赋给mPlugged

c. updateViews 更新charger类型显示

###内核空间

1. 插入充电器触发的过程@kernel/drivers/usb/otg/msm_otg.c

a. CONFIG_PM_RUNTIME 定义 @kernel/arch/arm/configs/viskan_huashan_defconfig

b.msm_otg_runtime_resume-->msm_otg_resume-->??-->msm_otg_sm_work

c.msm_otg_sm_work,先进入OTG_STATE_UNDEFINED case,然后进入OTG_STATE_B_IDLE
case-->motg->chg_state=USB_CHG_STATE_UNDEFINED-->启动msm_chg_detect_work

d.msm_chg_detect_work 该函数主要完成USB charger类型的识别

USB_CHG_STATE_UNDEFINED //其中psy = power_supply_get_by_name("usb");很关键,表明只是获取usb的power_supply,实际上就是chip->usb_psy@pm8921-charger.c

USB_CHG_STATE_WAIT_FOR_DCD         //Waiting for Data pins contact.

然后多次(MSM_CHG_DCD_MAX_RETRIES=6)检测USB状态,启动queue_delayed_work(motg->wq,
&motg->chg_work, delay); //motg->chg_work=msm_chg_detect_work

USB_CHG_STATE_DETECTED //最后USB charge类型检测完毕

e. 启动queue_work(motg->wq, &motg->sm_work); //motg->sm_work=msm_otg_sm_work

f. 由于motg->chg_state==USB_CHG_STATE_DETECTED,

motg->chg_type==USB_DCP_CHARGER -->msm_otg_notify_charger(motg,IDEV_CHG_MAX);//IDEV_CHG_MAX=1500

2. 发送uevent到用户层

a. msm_otg_notify_charger@kernel/drivers/usb/otg/msm_otg.c

b. -->msm_otg_notify_chg_type@msm_otg.c,该函数中充电类型只归纳成4种:POWER_SUPPLY_TYPE_USB,POWER_SUPPLY_TYPE_USB_CDP,POWER_SUPPLY_TYPE_USB_DCP,POWER_SUPPLY_TYPE_USB_ACA,POWER_SUPPLY_TYPE_BATTERY

c. -->power_supply_set_supply_type@power_supply_core.c // set type of
the power supply

d. -->psy->set_property(psy, POWER_SUPPLY_PROP_TYPE,&ret);

那么在用usb_psy.get_property和dc_psy.get_property
(在函数中pm8921_charger_probe)读取property时

如果是USB type,则在pm_power_get_property_usb读取POWER_SUPPLY_PROP_ONLINE的值,其中POWER_SUPPLY_TYPE_USB,POWER_SUPPLY_TYPE_USB_CDP和POWER_SUPPLY_TYPE_USB_ACA都被归纳成USB
charger

如果是AC type,则在pm_power_get_property_mains读取POWER_SUPPLY_PROP_ONLINE的值,只有POWER_SUPPLY_TYPE_USB_DCP为AC
charger.

e. psy=chip->usb_psy@pm8921-charger.c,所以继续调用的是pm_power_set_property_usb@pm8921-charger.c

f. -->pm8921_set_usb_power_supply_type(val->intval)@pm8921-charger.c

-->power_supply_changed(&the_chip->usb_psy);

-->power_supply_changed(&the_chip->dc_psy);

g. power_supply_changed@pm8921-charger.c , 就会马上发送uevent给user
space,然后user space通过sysfs得到USB
type变化后的信息,参考用户空间的分析

二、硬件分析

主要是通过特殊设计的电路,检测不同的pin的状态,从而确定是何种类型的Charger. 更details的内容省略。

USB port 如何识别不同的Charger类型的更多相关文章

  1. USB接口无法识别设备

    http://windows.microsoft.com/zh-cn/windows/answers?tId=14fa1e44-0a19-48ef-9ba7-b7e512a837a4 小琼子 提问 2 ...

  2. USB设备被识别流程

    源:   USB设备被识别流程

  3. 识别哈希算法类型hash-identifier

    识别哈希算法类型hash-identifier hash-identifier是一款哈希算法识别工具.通过该工具,用户可以识别哈希值所使用的哈希算法.确定算法后,就可以采用对应的工具进行xx.执行该命 ...

  4. usb设备无法识别

    之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上,调试ok的,现在新设计的板子回来了,wifi模块是连接在usb2口上的,系统起来后发现wlan0不存在,用lsusb查看wifi模块的usb ...

  5. winpcap usb山寨网卡识别

    买了个沐阳的JP-1081 USB外置有线网卡 装上RD9700的驱动 WINPCAP 4.1.3 运行程序发现没有找到这个网卡 后来才发现 winpcap4.1之后  获取的网卡信息是该次随系统启动 ...

  6. 苹果充电器USB端的识别电阻的设置

    苹果为充电器定义了3种充电电流,分别是0.5A/1A/2.1A.具体是由3种不同的电阻组合来实现的.当苹果的设备ipad,iphone,ipod接入USB口充电器时,会先检测USB D+和D-上的电压 ...

  7. USB设备被识别流程【转】

    转自:http://blog.csdn.net/myarrow/article/details/8286876 USB模块包括usb core,host,hub,device驱动,其中hub会启动一个 ...

  8. allegro生成光绘文件时,通过cam打开,*.drl钻孔文件不识别,为Unknow类型

    生成钻孔文件时,NC_Parameters中,应该选Absolute

  9. C++ 运行时类型识别 知道实例父类类型,显示出子类类型

    typeid(nets_[i]).name() 其中的nets_[i]是一个对象

随机推荐

  1. JDBC使用MySQL存储过程错误

    JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur ...

  2. c#前3章总结

    01.net和c#的区别 大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务. .net Framework:要想让 ...

  3. GDC2016 【全境封锁】的全局照明技术

    现在全力支持公司的GAD平台了,很多的内部分享也可以放出来 http://gad.qq.com/article/detail/7159232

  4. Android RSA加密解密

    概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数 ...

  5. CCEA OCX

    <HTML> <HEAD> <TITLE>CCEAActiveX演示页面</TITLE> <meta http-equiv="Conte ...

  6. Avada主题通过自定义CSS全局更换微软雅黑字体

    Avada主题的菜单.正文.标题.面包屑路径等等如果想更换为“微软雅黑”中文字体,只需要进入Avada主题的选项,倒数第二项有个Custom CSS,把下面的代码粘贴进去即可.当然你也可以自行改变字体 ...

  7. 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变

    今天有朋友问到我关于"iframe自适应高度"的问题,原本以为是很简单的问题,没想到折腾了20分钟才搞定.期间遇到几个问题,要么是高度自适应了,但是当窗口改变时会出现滚动条.也就是 ...

  8. OWASP WEB会话管理备忘单 阅读笔记

    https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Session_ID_Properties 会话简介 HTTP是一种无状态 ...

  9. JQuery 表单校验插件 validate 使用纪录

    JS诞生其中一个目的就是将, 服务器端的校验在客户端提前完成, 以避免用户提交数据后, 后台校验报错的糟糕用户体验. 基于JQuery库的有很多优秀的插件, 其中对于浏览器端表单进行验证的基本功能也有 ...

  10. [HTML5]移动开发不同手机弹出数字键盘问题

    这里还是先那么先交代一下遇到的问题.其实无论是tel还是number都不是完美的:type="tel"优点是iOS和Android的键盘表现都差不多缺点是那些字母好多余,虽然我没有 ...