高通平台 pmic—gpio修改(2)

根据上一篇文章中的结论:如果在xbl阶段希望修改pmic相关的gpio,可以查看这个gpio是否已经有功能对其进行初始化。那么需要考虑一种情况:如果这个gpio从未被用过呢?因此本篇就是从根本上解决这个问题

根据高通文档可以得到的信息:

1.本平台最终是通过解析pm.dtsi这个设备树来进行gpio的初始化的

2.该设备树中的节点,在pm_sbl_boot_oem.c中进行解析

代码分析:

根据示例PM_CLK_ENABLE             PM_BUSID_0   PMIC_A  PM_CLK_RF_1  PM_TRUE,可以知道在pm.dtsi内要如何添加一个gpio的信息

  sw-config {
    compatible = "qcom,pm-sw";

    // verbose: Set to TRUE will output verbose PON reason into uart log.
    //          Set to 2 will output verbose PON reason and raw data into uart log
    // By default setting to FALSE to avoid impacting boot performance
    verbose = <PM_FALSE>;
    driver-post-init = <
      // PM_CLK_ENABLE             PM_BUSID_0   PMIC_A  PM_CLK_RF_1  PM_TRUE
    ...
    /*Delay*/
      PM_DELAY(10)
    > ;

    apply-rsns-trim = <PM_FALSE>;
    rsns-trim-value = <0>;

    };

再查看pm_sbl_boot_oem.c内是如何解析这个设备树内的节点信息的

static pm_err_flag_type
pm_post_driver_init_dt_config( void )
{
  pm_err_flag_type err_flag = PM_ERR_FLAG_SUCCESS;
  uint16 spmi_clk_data_cfg = 0;
  uint32 pmic_index = 0;
  uint32 periph_id = 0;
  uint32 value = 0;
  uint32 operation = 0;
  uint32 bus_id = 0;
  int i = 0;
  pm_model_type model = PMIC_IS_INVALID;

  pm_dt_sw_config  *sw_dt_config = NULL;
  sw_dt_config = pm_dt_get_node( PMIC_DT_NODE_PM_SW_CONFIG );
  if((sw_dt_config != NULL) && (sw_dt_config->post_driver_init != NULL) && (sw_dt_config->post_driver_init_count > 0))
  {
    for(i = 0; i < sw_dt_config->post_driver_init_count; i++)
    {
      operation = sw_dt_config->post_driver_init[i * 5];
      bus_id = sw_dt_config->post_driver_init[(i * 5) + 1];
      pmic_index = sw_dt_config->post_driver_init[(i * 5) + 2];
      periph_id = sw_dt_config->post_driver_init[(i * 5) + 3];
      value = sw_dt_config->post_driver_init[(i * 5) + 4];

      ...
    switch( operation )
      {
        case PM_LDO_SET_ENABLE:
          err_flag |= pm_ldo_sw_enable(pmic_index, periph_id, value, TRUE);
          break;
        case PM_LDO_SET_VOLT:
          err_flag |= pm_ldo_volt_level(pmic_index, periph_id, value * 1000, TRUE); // *1000 to change to uv
          break;
        case PM_LDO_SET_MODE:
          err_flag |= pm_ldo_sw_mode(pmic_index, periph_id, value);
          break;

      ...
        }
        
      }
    }
}

解析设备树的时候,会根据post_driver_init内的5个属性进行解析,分别为operation、bus_id、pmic_index、periph_id、value。再跟一下代码,可以看到operation就是就是作为选择项去调用各个对应的api,对剩余的4个参数进行修改。再看看哪里定义了这些operation,从而找到我们想要使用的

//GPIO
#define PM_GPIO_SET_ENABLE          60
#define PM_GPIO_SET_CFG_MODE        61
#define PM_GPIO_SET_OUTPUT_LVL      62
#define PM_GPIO_SET_VOLT_SRC        63
#define PM_GPIO_SET_OUT_BUFF_CONFIG 64
#define PM_GPIO_SET_OUT_DRV_STR     65
#define PM_GPIO_SET_OUT_SRC_CFG     66
#define PM_GPIO_SET_PULL_SEL        67

根据我们的需求,我们需要先将这个gpio设置为IN模式,将这个gpio默认变为拉低状态,接收从mcu传来拉低的状态再去做我们的功能

那么我们的pm.dtsi内要如何设置也可以得出结论了:

  sw-config {
    compatible = "qcom,pm-sw";

    // verbose: Set to TRUE will output verbose PON reason into uart log.
    //          Set to 2 will output verbose PON reason and raw data into uart log
    // By default setting to FALSE to avoid impacting boot performance
    verbose = <PM_FALSE>;
    driver-post-init = <
      // PM_CLK_ENABLE             PM_BUSID_0   PMIC_A  PM_CLK_RF_1  PM_TRUE
         PM_GPIO_SET_ENABLE        PM_BUSID_0   PMIC_B  PM_GPIO_06   TRUE
         PM_GPIO_SET_CFG_MODE      PM_BUSID_0   PMIC_B  PM_GPIO_06   TRUE
         PM_GPIO_SET_PULL_SEL      PM_BUSID_0   PMIC_B  PM_GPIO_06   PM_GPIO_PULL_UP_30UA
    ...

    /*Delay*/
      PM_DELAY(10)
    > ;

    apply-rsns-trim = <PM_FALSE>;
    rsns-trim-value = <0>;

    };

至此结束。编译后使用示波器进行量取对应的GPIO波形,修改之前为高电平,修改之后为低电平,并且abl内能判断逻辑也pass。

如有不对,麻烦大佬指点,谢谢

### 回答1: Android PMIC(功率管理集成电路)是指安卓系统中的功率管理芯片。功率管理芯片是一种用于控制电源供应和节能管理的关键组件,用于监控和管理移动设备中的电池和电源相关的功能。 Android PMIC主要功能有以下几点: 1. 电源管理:Android PMIC负责给移动设备供电,同时监控电池的电量情况,并提供电池充电控制功能。它能够在充电器接入时,根据需要对电池进行充电,并在电池电量过低时发出警告。 2. 节能管理:Android PMIC能够监测处理器和其他组件的使用情况,并根据需要动态调整电源输出以节省能源。它可以在设备不活动时进入休眠模式,减少功耗并延长续航时间。 3. 温度管理:Android PMIC能够监测设备内部和外部的温度,并根据需要调整功率输出和散热策略,确保设备不会过热。 4. 电源管理:Android PMIC还具备多种电源管理功能,如USB充电器检测、电流和电压保护等。它能够检测外部充电器的参数,并根据设备需求调整电源输出。 总而言之,Android PMIC是移动设备中的一种关键电路芯片,用于管理供电和节能。它监控电池状态、控制充电过程、管理功耗和温度,并确保移动设备的正常运行和延长续航时间。 ### 回答2: Android PMIC是指Android系统中的功率管理集成电路(Power Management Integrated Circuit)。 Android是一种广泛使用的移动操作系统,它运行在各种移动设备上,如智能手机、平板电脑和可穿戴设备等。为了保证这些移动设备的正常运行,需要一个专门的电源管理系统来提供电源、调节电压和电流,以及控制各种电源模式。 PMIC是这个电源管理系统的核心部件。它是一种专用的集成电路芯片,具有多个功能模块,包括DC-DC转换器、充电管理、电池监测和电池保护等。PMIC负责从电源或电池获取电能,并将其转换为设备所需的稳定电压和电流。它还可以监测电池的状态,以预测电池寿命和提供适当的保护措施。 Android PMIC可以根据设备的使用需求,动态地调节电源模式以提供最佳的电池寿命和性能。当设备处于待机状态时,PMIC可以将电源电压降低到最低限度,以节省电池能量。而在设备进入高负载操作时,PMIC可以提供更高的电源电压和电流,以确保设备正常工作。 总之,Android PMICAndroid系统中的一个重要部件,它负责设备的电源管理和供电控制。通过优化电源管理,PMIC可以提供更长的电池寿命和更高的性能,为用户提供更好的移动体验。 ### 回答3: Android PMIC(Power Management Integrated Circuit)是一种用于管理和控制电源的集成电路,主要用于Android设备。 Android PMIC主要功能包括电源管理、电池管理和充电管理。它负责监控设备的电池电量,并通过电池管理器来管理电池的充放电过程,以确保电池的安全使用和延长寿命。同时,Android PMIC还能够提供电源给设备内部的各个模块,如处理器、内存、无线模块等,保证它们能正常工作。 Android PMIC在电源管理方面的功能主要包括采集电池电量信息、电池电压和电流监测、电池保护(如过充、过放、短路保护等)、电源模块的开关控制和转换(如DC-DC转换器)等。它能够根据实际需要,自动调整设备的供电模式,以提高电池的使用效率和续航时间。 在充电管理方面,Android PMIC负责监控设备的充电状态和过程,确保安全且高效的充电。它能够根据电池的状态和充电需求,智能调整充电电流和电压,同时还能提供快速充电(如QC)、无线充电等功能。 Android PMIC的设计和选择对于Android设备的性能和使用体验至关重要。一个高质量的PMIC能够提供稳定的电源供应,延长电池寿命,同时最大程度地提高设备的性能和效率。因此,在Android设备的开发过程中,PMIC的选择和优化是非常重要的一环。 总之,Android PMIC是一种集成电路,用于管理和控制电源的功能,包括电源管理、电池管理和充电管理。它对于Android设备的性能和续航时间有重要影响,是Android设备开发过程中需要重视的一部分。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值