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、