日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

USB port 如何识别不同的Charger类型

發(fā)布時(shí)間:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB port 如何识别不同的Charger类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于Qualcom 8960/8921平臺(tái)

一,軟件分析

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

???調(diào)試路徑:/sys/kernel/debug/msm_otg

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

??????????????? a.函數(shù)register_android_server_BatteryService將為被frameworks/base/services/jni/onload.cpp中的JNI_OnLoad調(diào)用,用于關(guān)聯(lián)javaC++之間的變量

??????????????? b.jclass clazz = env->FindClass("com/android/server/BatteryService"); //根據(jù)java的路徑找到batteryservice.java對(duì)應(yīng)的jclass????

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

??????????????? ? gFieldIds.mUsbOnline = env->GetFieldID(clazz, "mUsbOnline", "Z"); //用于關(guān)聯(lián)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},

??????????????????????????????? };

??????????????? ???關(guān)聯(lián)到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"); //注冊(cè)監(jiān)聽該uevent

??????????????? b.???? private UEventObserver mPowerSupplyObserver = new UEventObserver() {

??????????????????????????????? public void onUEvent(UEventObserver.UEvent event) { //如果就收到來(lái)自kerneluevent,觸發(fā)該函數(shù)

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

??????????????????????????????? }

??????????????? ?????? };

??????????????? c. native_update函數(shù)會(huì)通過(guò)JNI調(diào)用得到更新的mAcOnlinemUsbOnline

??????????????? d. processValues會(huì)根據(jù)mAcOnlinemUsbOnline對(duì)mPlugType賦值

??????????????????????????????? if (mAcOnline) {

??????????????????????????????? ??? mPlugType = BatteryManager.BATTERY_PLUGGED_AC;

??????????????????????????????? } else if (mUsbOnline) {

??????????????????????????????? ??? mPlugType = BatteryManager.BATTERY_PLUGGED_USB;

??????????????????????????????? } else {

??????????????????????????????? ??? mPlugType = BATTERY_PLUGGED_NONE;

??????????????????????????????? }

??????????????? e. sendIntent函數(shù)會(huì)準(zhǔn)備Intent并且broadcast這個(gè)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_CHANGEDintent

??????????????????????????????? // Register battery receiver.

??????????????????????????????? registerReceiver(mBatteryInfoReceiver, mIntentFilter);

??????????????? ??? }?????????

??????????????? b. parseIntent?得到最新的"plugged"值賦給mPlugged

??????????????? c. updateViews?更新charger類型顯示

###內(nèi)核空間

1.?插入充電器觸發(fā)的過(guò)程@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,先進(jìn)入OTG_STATE_UNDEFINED case,然后進(jìn)入OTG_STATE_B_IDLE
case-->motg->chg_state=USB_CHG_STATE_UNDEFINED-->
啟動(dòng)msm_chg_detect_work

??????????????? d.msm_chg_detect_work?該函數(shù)主要完成USB charger類型的識(shí)別

??????????????? ??????????????? USB_CHG_STATE_UNDEFINED //其中psy = power_supply_get_by_name("usb");很關(guān)鍵,表明只是獲取usbpower_supply,實(shí)際上就是chip->usb_psy@pm8921-charger.c

??????????????????????????????? USB_CHG_STATE_WAIT_FOR_DCD???????? //Waiting for Data pins contact.

????????????????????????????????然后多次(MSM_CHG_DCD_MAX_RETRIES=6)檢測(cè)USB狀態(tài),啟動(dòng)queue_delayed_work(motg->wq,
&motg->chg_work, delay); //motg->chg_work=msm_chg_detect_work

??????????????????????????????? USB_CHG_STATE_DETECTED //最后USB charge類型檢測(cè)完畢

??????????????? e.?啟動(dòng)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.?發(fā)送uevent到用戶層

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

??????????????? b. -->msm_otg_notify_chg_type@msm_otg.c,該函數(shù)中充電類型只歸納成4POWER_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_propertydc_psy.get_property
(
在函數(shù)中pm8921_charger_probe)讀取property時(shí)

????????????????????????????????如果是USB type,則在pm_power_get_property_usb讀取POWER_SUPPLY_PROP_ONLINE的值,其中POWER_SUPPLY_TYPE_USBPOWER_SUPPLY_TYPE_USB_CDPPOWER_SUPPLY_TYPE_USB_ACA都被歸納成USB
charger

????????????????????????????????如果是AC type,則在pm_power_get_property_mains讀取POWER_SUPPLY_PROP_ONLINE的值,只有POWER_SUPPLY_TYPE_USB_DCPAC
charger
.

??????????????? e. psy=chip->usb_psy@pm8921-charger.c,所以繼續(xù)調(diào)用的是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?,?就會(huì)馬上發(fā)送ueventuser
space,
然后user space通過(guò)sysfs得到USB
type
變化后的信息,參考用戶空間的分析

?

二、硬件分析

主要是通過(guò)特殊設(shè)計(jì)的電路,檢測(cè)不同的pin的狀態(tài),從而確定是何種類型的Charger. 更details的內(nèi)容省略。

總結(jié)

以上是生活随笔為你收集整理的USB port 如何识别不同的Charger类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。