UEFI PMIC部分研究
1、PMIC驱动结构
2、
Driver | Source path | Functionality |
AdcDxe | <src root> \uefi\edk2\QcomPkg\ Drivers\AdcDxe |
Provides abstraction of ADC functionality through protocols Not platform-specific |
AdcLib | <src root> \uefi\edk2\QcomPkg\ Library\AdcLibB |
Implements register-level access of ADC functionalities Platform-specific |
QcomChargerDxe | <src root> \uefi\edk2\QcomPkg\ Drivers\QcomChargerDxe |
Provides abstraction of charging and gauge functionality of the system Interface between Microsoft® UEFI charger applications or other high-level UEFI applications (such as FLASH) Battery management customization |
PmicShutdownLib | <src root> \uefi\edk2\QcomPkg\ Library\PmicShutdownLib |
Implementation of boot time and runtime shutdown/reset functionality |
PmicDxe | <src root> \uefi\edk2\QcomPkg\ Drivers\PmicDxe |
Provides abstraction of most PMIC functionalities through protocols (see Section 3.3.1) Not platform-specific |
PmicLib | <src root> \uefi\edk2\QcomPkg\ Library\PmicLib |
Implements register-level access of PMIC functionality Platform-specific |
SPMIDxe | <src root> \uefi\edk2\QcomPkg\ Drivers\SPMIDxe |
Implementation of SPMI communication with PMIC |
3、UEFI PMIC protocols
PMIC protocols | Header file | Usage |
PMIC_CLKBUFF_PROTOCOL | EFIPmicClkBuff.h | Protocol for the PMIC CLK buffer |
PMIC_GPIO_PROTOCOL | EFIPmicGpio.h | Protocol for PMIC GPIO |
PMIC_IBB_PROTOCOL | EFIPmicIbb.h | Protocol for PMIC IBB |
PMIC_LAB_PROTOCOL | EFIPmicLab.h | Protocol for PMIC LAB |
PMIC_LPG_PROTOCOL | EFIPmicLpg.h | Protocol for PMIC LPG |
PMIC_MIPIBIF_PROTOCOL | EFIPmicMipiBif.h | Protocol for PMIC MipiBif |
PMIC_MPP_PROTOCOL | EFIPmicMpp.h | Protocol for PMIC MPP |
PMIC_PWM_PROTOCOL | EFIPmicPwm.h | Protocol for PMIC PWM |
PMIC_PWRON_PROTOCOL | EFIPmicPwrOn.h | Protocol for PMIC PON |
PMIC_RGB_LED_PROTOCOL | EFIPmicRgbLed.h | Protocol for PMIC RGB |
PMIC_RTC_PROTOCOL | EFIPmicRTC.h | Protocol for PMIC RTC |
PMIC_SCHG_PROTOCOL | EFIPmicSchg.h | Protocol for PMIC SCHG |
PMIC_FG_PROTOCOL | EFIPmicFg.h | Protocol for PMIC FG |
PMIC_VIB_PROTOCOL | EFIPmicVib.h | Protocol for PMIC VIB |
PMIC_VREG_PROTOCOL | EFIPmicVreg.h | Protocol for PMIC LPG |
PMIC_PWM_PROTOCOL | EFIPmicPwm.h | Protocol for PMIC VREG |
PMIC_WLED_PROTOCOL | EFIPmicWled.h | Protocol for PMIC WLED |
4、UEFI PMIC driver call flow
@RealTimeLib | @PmicDxe |
EFI_QCOM_PMIC_PWRON_PROTOCOL *pmic_pwron; Status = gBS->LocateProtocol(&gQcomPmicPwrOnProtocolGuid, NULL, (VOID**) &pmic_pwron; Status = pmic_pwron->GetPonPblStatus ( RTCInternal.nPmicIndex, EFI_PM_PWRON_PON_PBL_STATUS_XVDD_RB_OCCURRED, &pmicWasBatteryRemoved); |
EFI_QCOM_PMIC_PWRON_PROTOCOL PmicPwronProtocolImplementation = { PMIC_PWRON_REVISION, … EFI_PmicPwronGetPonPblStatus, }; struct _EFI_QCOM_PMIC_PWRON_PROTOCOL { UINT32 Revision; … EFI_PM_PWRON_GET_PON_PBL_STATUS GetPonPblStatus; }; EFI_STATUS EFIAPI EFI_PmicPwronGetPonPblStatus ( IN UINT32 PmicDeviceIndex, IN EFI_PM_PWRON_PON_PBL_STATUS_TYPE PblStatusType, OUT BOOLEAN *Status ) { … errFlag = pm_pon_pbl_status_get(PmicDeviceIndex, (pm_pwron_pon_pbl_status_type)PblStatusType, Status); … return EFI_SUCCESS; } |
@PmicLib | |
pm_err_flag_type pm_pon_pbl_status_get(unsigned pmic_device_index, pm_pwron_pon_pbl_status_type pbl_status_type, boolean *status) { … return ((pm_pwron_data_type*)mappedResource)->ipwron_get_pon_pbl_status( mappedResource, pbl_status_type, status, (uint8)resourceIndex); … } pmiC_PmicResource* pm_pwron_driver_init( pmiC_PmicDevice *device ) { ... pmiC_PmicResource_Init(pwron, PWRON_ModuleType, device); … ((pm_pwron_data_type*)pwron)->ipwron_get_pon_pbl_status = pm_pwron_get_pon_pbl_status_alg; |
5、
6、PMIC各文件夹介绍
API – boot_images\QcomPkg\Include\api\systemdrivers\pmic
Structure – boot_images\QcomPkg\Library\PmicLib
Directory structure
Folder | Description |
app | High-level application drivers: • Dead battery charging • Reset APIs • RGB/WLED interface |
comm | SPMI communication interface files |
config | PMIC specific configuration files |
drivers | Low-level drivers for each PMIC module |
framework | Common code required to load PMIC configuration: • SPMI initialization • XBL core PMIC initialization • XBL loader PMIC initialization • Load chipset specific configuration • Fuel gauge SRAM |
npa | Node power architecture interface (see the Regulator/NPA Software Architecture diagram) |
pmic_devices | PMIC hardware version information |
psi | Entry point to the PMIC ELF image |
scripts | Debug scripts |
target | MSM chipset specific configuration files • PMIC PBS RAM sequence – PMIC warm reset and sleep enter/exit sequences are defined here • PMIC SBL (boot) sequence – All essential PMIC module configuration is done here |
utils | Required utility functions for PMIC drivers (internal) |
7、LAB IBB解释以及输出电源
Display ± bias A.
LCD/AMOLED boost (LAB) for + B.
Inverting buck/boost (IBB) for -
8、NPA相关
A driver may use the Node Power Architecture (NPA) to represent
resources controlled by the driver
(1).定义npa node definition
static npa_resource_definition sleep_uber_resource[] =
{
{
"/sleep/uber", /* Name */
"on/off", /* Units */
0x7, /* Max State */
&npa_or_plugin, /* Plugin */
NPA_RESOURCE_DEFAULT, /* Attributes */
NULL, /* User Data */
}
};
npa_node_definition sleep_uber_node =
{
"/node/sleep/uber", /* name */
sleep_uber_driver, /* driver_fcn */
NPA_NODE_DEFAULT, /* attributes */
NULL, /* data */
0, NULL, /* dependency count, dependency list */
NPA_ARRAY(sleep_uber_resource)
};
(2).npa_define_node(&sleep_uber_node, initial_state, NULL),调用这个函数初始化这个NPA node
(3).创建Client
uber_node_handle = npa_create_sync_client("/sleep/uber",
"sleep",
NPA_CLIENT_REQUIRED);
(4).npa_issue_required_request(uber_node_handle, request) : request
NPA client的创建函数是:npa_create_sync_client()
NPA clien request的函数是:npa_issue_required_request()
NPA client创建并request这个资源,必须要适用像下面这样的npa node。这个可以直接像下面这样定义。然后再使用。