PMIC 介绍

最近看reboot 问题, 对PMIC 概念一头雾水
QCOM:掉电分析:

VPH_PWR【主要供电,接入电源后,PMU ,默认点】
     --->VDD_CORE 【CPU 上电,发送PS_HOLD】
         ---->PS_HOLD 【PMU 收到PS_HOLD 之后才真正启动,与CPU 沟通】

PON_RST_IN  是PMU 给出让CPU 复位的。【如果runing 时候,PON_RST_IN  复位,查看PMU 哪里出现了问题】
PON_RST_OUT 这个给用户控制使用的
CPU 出现问题,可以关闭控制PMIC 中某个部分的电源

reboot 问题分析,保存重启之前的log,pstore . 开启更多的log日志
qcom 平台开启更多的log 日志

echo -n "file dp_display.c +p" > /d/dynamic_debug/control
echo -n "file dp_drm.c +p" > /d/dynamic_debug/control
echo -n "file dp_link.c +p" > /d/dynamic_debug/control
echo -n "file dp_ctrl.c +p" > /d/dynamic_debug/control
echo -n "file dp_catalog.c +p" > /d/dynamic_debug/control
echo -n "file dp_usbpd.c +p" > /d/dynamic_debug/control
echo -n "file dp_aux.c +p" > /d/dynamic_debug/control
echo -n "file dp_panel.c +p" > /d/dynamic_debug/control
echo -n "file dp_audio.c +p" > /d/dynamic_debug/control
echo -n "file sde_edid_parser.c +p" > /d/dynamic_debug/control
echo 'file qpnp-pdphy.c +p' > /d/dynamic_debug/control
echo 'file policy_engine.c +p' > /d/dynamic_debug/control
echo 'file phy-msm-ssusb-qmp.c +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file dwc3-msm.c +p' > /sys/kernel/debug/dynamic_debug/control

1-基础功能

PMIC(Power Management IC)又称电源管理IC,是一种特定用途的集成电路,其功能是为主系统作管理电源等工作。PMIC常用于以电池作为电源的装置,例如移动电话或便携式媒体播放器。由于这类装置一般有多于一个电源(例如电池及USB电源),系统又需要多个不同电压的电源,加上要控制电池的充放电,以传统方式满足这样的需求会占用不少空间,同时增加产品开发时间,因此造就了PMIC的出现。
PMIC 主要功能:[电源管理,充电控制,开关机控制电路]

  • 直流-直流转换器
  • 低压差稳压器(LDO)
  • 电池充电器
  • 电源选择
  • 动态电压调节
  • 各电源开启、关闭次序控制
  • 各电源电压检测
  • 温度检测
  • 其他功能

外还整合了过/欠压(OVP/UVP)、过温(OTP)、过流(OCP)等保护电路
主要意义:调整充电电流和系统电流分配关系,最大程度保证系统的正常工作

LDO是利用较低的工作压差,通过负反馈调整输出电压使之保持不变的稳压器件。压差小的话用LDO,带可关断功能便于电源管理。压差大的还是用DC-DC效率高。

从PMIC 看开机流程:

POWER 按键
    -->LDO ,DC-DC开启
         -->CPU 上电 复位
            --> CPU PS_HOLD 输出到PMIC
               --> PMIC 正常工作。

关机的时候:CPU将PS_HOLD拉低电,PMIC关闭进入关机

CPU工作正常后,可以通过I2C接口对PMIC的各个模块进行控制。比如系统变频的时候,不同的工作频率要调整core电压到对应的电压。RTC时间的设置和ALARM的时钟。同时PMIC可以将异常事件产生中断信号给CPU,CPU再进行中断处理。因此bug 有可能是PMIC 中断CPU ,CPU PS HOLD 通知PMIC 导致关机

PMIC的电源越多,对系统的模块供电就越细,各个模块的电源受牵连就小,所以就越省电。

2-PMIC 框架:

PMIC 模块功能实现角度考虑

a . input power management
b . output power management
c . genera housekeeping
d . user Interface 
e . IC Interface 
f . configurable pins - functions within other categories(Multipurpose pins (MPP) and General Purpose Input Output (GPIO)).

Linux PMIC software architecture

3- OCP 例子

在设备中设置alarm闹铃,然后选择震动和闹铃和屏幕最低亮度。确保进入vddmin后,当闹铃响的时候,会crash,OCP:过电流保护OCP(英文名称:over current protection)
预定当被测电流增大超过允许值时执行相应保护动作(如使断路器跳闸)的一种措施保护。

kernel log :

[    0.722600] qcom,qpnp-power-on qpnp-power-on-2: PMIC@SID0 Power-on reason: Triggered from KPD (power key press) and 'cold' boot
[    0.722638] qcom,qpnp-power-on qpnp-power-on-2: PMIC@SID0: Power-off reason: Triggered from GP_FAULT0

Power-off reason: Triggered from GP_FAULT0
流程:
kernel/drivers/regulator/core.c

regulator_enable
    ---->_regulator_enable
        --->drms_uA_update

/* Calculate the new optimum regulator operating mode based on the new total
 * consumer load. All locks held by caller */
static void drms_uA_update(struct regulator_dev *rdev)
{
    struct regulator *sibling;
    int current_uA = 0, output_uV, input_uV, err;
    unsigned int regulator_curr_mode, mode;

    err = regulator_check_drms(rdev);

    /* get output voltage */
    output_uV = _regulator_get_voltage(rdev); //得到需要的输出电压
    printk("xhlin %s: output voltage: %d\n",__func__,output_uV);

    /* get input voltage */
    input_uV = 0; //得到输入电压,不明白什么是输入电压,回来要看?
    if (rdev->supply)input_uV = regulator_get_voltage(rdev->supply);
    if (input_uV <= 0)input_uV = rdev->constraints->input_uV;
    if (input_uV <= 0)return;
    printk("xhlin %s: input voltage: %d\n",__func__,input_uV);

    /* calc total requested load */------------------计算每个LDO所需要的全部电流,就是把每个consumer的电流全部加起来,注意这些电流都软件写死的,不是瞬时电流
    list_for_each_entry(sibling, &rdev->consumer_list, list)
    {   
        printk("xhlin %s: rdev name %s, current_uA %d, sib_ua_load %d\n",__func__, rdev->desc->name, current_uA, sibling->uA_load);
        current_uA += sibling->uA_load;
    }

    /* now get the optimum mode for our new total regulator load */
    mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, output_uV, current_uA);--------------------------根据以上的数据确定mode,注意有LPM和NPM两种模式

    /* check the new mode is allowed */
    err = regulator_mode_constrain(rdev, &mode);

    //重要,这个就是加log的重点:得到OPC之前的LDO是什么状态,是哪一个LDO
    printk("xhlin %s: rdev name %s, current_uA %d, mode %d\n",__func__, rdev->desc->name, current_uA, mode);
    
    /* return if the same mode is requested */
    if (rdev->desc->ops->get_mode) {
        regulator_curr_mode = rdev->desc->ops->get_mode(rdev);
        printk("xhlin %s: -------regulator_curr_mode = %d-----------1--------------\n",__func__,regulator_curr_mode);
        if (regulator_curr_mode == mode)
        {
        printk("xhlin %s: -------regulator_curr_mode = %d-----------2--------------\n",__func__,regulator_curr_mode);
        return;}
    } else
        return;

    if (err == 0)
        rdev->desc->ops->set_mode(rdev, mode);
}

调试之后:

[  110.800881] CPU1: Booted secondary processor
[  110.810993] xhlin drms_uA_update: output voltage: 1800000
[  110.815515] xhlin drms_uA_update: input voltage: 1800000
[  110.820766] xhlin drms_uA_update: rdev name pm660_l11, current_uA 0, sib_ua_load 5000 ---- 第一个consumer为5ma,后面会分析它从哪里来
[  110.828744] xhlin drms_uA_update: rdev name pm660_l11, current_uA 5000, sib_ua_load 100 ---- 第二个consumer为0.1ma 
[  110.836586] xhlin drms_uA_update: rdev name pm660_l11, current_uA 5100, sib_ua_load 0 ---- 第三个consumer为0ma,说明不需要用到电流,跟硬件对应吗?
[  110.844596] xhlin drms_uA_update: rdev name pm660_l11, current_uA 5100, mode 4,err=0  ---- 进入的mode 为4 ,这个应该对应LPM,低功耗模式? 
[  110.852124] xhlin drms_uA_update: -------regulator_curr_mode = 4-----------1--------------
[  110.860441] xhlin drms_uA_update: -------regulator_curr_mode = 4-----------2--------------

根据最后出现的LDO为:pm660_l11,可以判断LDO11引起了OCP问题。
通过检查硬件原理图,发现LDO11被以下三个部件使用:SPKR,SNS和DISP,分别为音频的喇叭,sensor和显示部分,因为闹铃只用到喇叭和显示器,所以sensor的电流应该为0
通过查找dts发现:

    msm_digital_codec: msm-dig-codec@771c000 {
        compatible = "qcom,msm-digital-codec";
        reg = <0x0771c000 0x0>;
        cdc-vdd-digital-supply = <&pm660_l11>;
        qcom,cdc-vdd-digital-voltage = <1800000 1800000>;
        qcom,cdc-vdd-digital-current = <5000>;
        qcom,cdc-on-demand-supplies = "cdc-vdd-digital";
        qcom,subsys-name = "modem";
    };

qcom,cdc-vdd-digital-current = <5000>;可以看出DTS 配置电流是5000
注意电流值是dts里面配置的,而不是实际电流
当每个LDO所有consumer加起来的电流<LPM规定的某个值,即为LPM模式,否则为NPM模式
当处于LPM模式下的设备,此时的实际电流大于 这个LDO所有consumer加起来的电流(加起来的电流是设备树的电流,而不是实际电流)就会发生OCP

因此修改调整如下:解决问题
qcom,cdc-vdd-digital-current = <5000>; -------------- <10000>

获取新的Log:

[  108.034455] xhlin drms_uA_update: output voltage: 1800000
[  108.038821] xhlin drms_uA_update: input voltage: 1800000
[  108.044198] xhlin drms_uA_update: rdev name pm660_l11, current_uA 0, sib_ua_load 10000
[  108.052081] xhlin drms_uA_update: rdev name pm660_l11, current_uA 10000, sib_ua_load 100
[  108.060132] xhlin drms_uA_update: rdev name pm660_l11, current_uA 10100, sib_ua_load 0
[  108.068005] xhlin drms_uA_update: rdev name pm660_l11, current_uA 10100, mode 2,err=0
[  108.075861] xhlin drms_uA_update: -------regulator_curr_mode = 2-----------1--------------
[  108.080439] CPU2: Booted secondary processor
[  108.088345] xhlin drms_uA_update: -------regulator_curr_mode = 2-----------2--------------

REF:
https://zh.wikipedia.org/wiki/%E9%9B%BB%E6%BA%90%E7%AE%A1%E7%90%86IC
https://blog.csdn.net/m0_37166404/article/details/80807252
http://huaqianlee.github.io/2015/06/24/Android/qcom-pmic-driver/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,722评论 2 59
  • 记录“使用国产PMIC器件”的苦难经历。仅有一份Datasheet,貌似资料页中还有很多“说的不一定真是这样的”坑...
    有追求的王爷阅读 1,702评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,523评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,564评论 0 11
  • 在妖界我有个名头叫胡百晓,无论是何事,只要找到胡百晓即可有解决的办法。因为是只狐狸大家以讹传讹叫我“倾城百晓”,...
    猫九0110阅读 3,261评论 7 3