USB port 如何识别不同的Charger类型
基于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类型相关推荐
- FTDI 234XD USB转串口 PC识别串口固定的解决方法
生产和测试反馈,调试多个设备的时候,总是要安装驱动,识别的设备的串口总是在变.今天抽空去官网(https://www.ftdichip.cn/FTFirmware.htm)上了解了一下,有两种解决方案 ...
- 【原创】IP摄像头技术纵览(一)---linux 内核编译,USB摄像头设备识别
IP摄像头技术纵览(一)- linux 内核编译,USB摄像头设备识别 开始正文之前先来认识一下我的开发环境: 系统:ubuntu 10.04 开发板:AT91SAM9260 + Linux-2.6. ...
- usb控制器和usb port之间有什么联系-usbview工具的使用?
usbview 是一个可以查看usb 拓扑的工具,可以通过这个工具查看当前USB Host控制器的个数和连接device信息. UBUNTU系统上安装usbview: 我用的小米笔记本,可以看到,有两 ...
- 识别哈希算法类型hash-identifier
识别哈希算法类型hash-identifier hash-identifier是一款哈希算法识别工具.通过该工具,用户可以识别哈希值所使用的哈希算法.确定算法后,就可以采用对应的工具进行xx.执行该命 ...
- pemicro识别不了驱动_usb驱动无法识别怎么办-usb驱动无法识别通常解决办法 - 河东软件园...
在我们使用电脑的过程中,我们常常需要插入USB设备来存储/传输文件或者进行其他的操作,而部分用户在插入USB设备后发现,可能会出现USB驱动无法识别的问题,我们的USB设备不能正常使用,部分用户可能认 ...
- linux hash 算法,识别哈希算法类型hash-identifier
识别哈希算法类型 hash-identifier 是一款哈希算法识别工具.通过该工具,用户可以识别哈希值所使用的哈希算法.确定算法后,就可以采用对应的工具进行xx.执行该命令如下所示: root@da ...
- 台式计算机usb口不识别鼠标,usb鼠标不能识别怎么办解决教程
现在好多台式电脑都已经改为usb鼠标了,也就是由以前的ps2接口鼠标升级到现在的usb鼠标了,这样电脑就能少一种接口,但对于使用来说,usb鼠标会出现一些问题,比如常见的usb无法识别,这样就无法使用 ...
- usb接口驱动_技术丨USB接口无法识别设备的处理方法
在使用计算机时,如果本来能识别U盘/移动硬盘的USB接口,突然不能识别该设备了,要怎么办呢?本文,我们就为大家讲讲USB接口不识别设备的问题. 01 排除USB硬件问题 首先我们要排除USB硬件问题. ...
- 台式计算机usb口不识别鼠标,如何解决插入鼠标提示无法识别USB设备的问题
如何解决插入鼠标提示无法识别USB设备的问题 有的小伙伴在使用电脑过程中,为了方便使用鼠标,因此插入了鼠标,但是却看到了无法识别USB设备的提示框,那么如何解决这一问题呢?小编就来为大家介绍一下吧. ...
最新文章
- 为啥led灯用一年后暗了很多_嫌原车的卤素“蜡烛灯”太暗,想换掉,该选氙气灯还是LED灯?...
- PHP设计模式之装饰者模式
- python gevent缺点_python的flask框架结合gevent性能反而大幅度下降?
- Java经典面试题:一个线程两次调用start()方法会出现什么情况?
- 补发《超级迷宫》站立会议三
- css解决li边框重合问题
- openshift_OpenShift上的Java EE工作流(技术提示#64)
- php调用文章标题,zblogphp标题格式的标签调用详细说明
- @value 注入静态属性_TP6依赖注入是如何实现的
- Excel数据分析实用小技巧【过坑】
- unity将本地文件上传到mysql_unity上传数据到数据库
- mybatis加载属性
- 深度学习caffe:激活函数
- 电路设计中的防爆设计原理与注意事项分析
- 关于网页消息提示音问题解决与实现
- BAT批处理脚本实例学习(三)清理系统垃圾
- QEMU,Dynamips,IOL区别
- 华为HCNE考试练习题经典模拟题
- 一个在线显示doc文本的实例
- dellr420部署os_戴尔dell poweredge r730服务器系统安装配置详解教程
热门文章
- oracle和mysql文件怎么打开_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明-sql文件怎么打开...
- Property ‘configuration‘ and ‘configLocation‘ can not specified with together
- 063_提升Hoisting
- 安智armeabi 和 armeabi-v7a 的库文件增加法则
- mysql查询数据教程_MySQL 查询数据
- 果园种树java_Java版淘金果园系统
- html中双重id标签怎么写,PHP读取HTML并处理双重ID外观
- 坡道行驶电动小车_基于动力性指标的纯电动汽车电机参数设计
- vs2017运行显示系统找不到指定的文件_windows 平台使用 VS2017 编译 libevent 源码
- 安卓自定义View进阶-Matrix Camera