描述:qcm2290平台上,在低压充电阶段(XBL),需要驱动LED灯芯片,提供接口供充电模块调用,显示充电指示灯功能。
说明:LED控制芯片是I2C接口,我只需要提供接口即可,我这边实现了在开机时led灯闪烁,在充电相关PmicLib目录下添加灯效时i2c_api.h引用失败,所以将代码添加到了Display文件中。
配置如下:
在文件i2c_devcfg.c中已经定义好所有的i2c实例,只需要定义相应的宏控编译打开即可,使用的I2C SDA和SCL对应的gpio为gpio6和gpio7,需要在源文件中定义宏ENABLE_QUP_02。
diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.c b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.c
index 5ecb3f36d..28fc5c77d 100755
--- a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.c
+++ b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.c
@@ -149,6 +149,7 @@ plat_device_config i2c_device_config_02 =
};
#endif
+#define ENABLE_QUP_02
#ifdef ENABLE_QUP_02
plat_device_config i2c_device_config_03 =
{
diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.xml b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.xml
index ab92f30d0..0816c918a 100755
--- a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.xml
+++ b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Settings/I2C/core/i2c_devcfg.xml
@@ -28,10 +28,11 @@ when who what, where, why
<device name="/dev/i2c2">
<props name="config" type="DALPROP_ATTR_TYPE_STRUCT_PTR"> i2c_device_config_02 </props>
</device>
- <!--
+
<device name="/dev/i2c3">
<props name="config" type="DALPROP_ATTR_TYPE_STRUCT_PTR"> i2c_device_config_03 </props>
</device>
+ <!--
<device name="/dev/i2c4">
<props name="config" type="DALPROP_ATTR_TYPE_STRUCT_PTR"> i2c_device_config_04 </props>
</device>
diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/Include/i2c_api.h b/BOOT.XF.4.1/boot_images/QcomPkg/Include/i2c_api.h
index e111c3772..ef4ee4ec1 100755
--- a/BOOT.XF.4.1/boot_images/QcomPkg/Include/i2c_api.h
+++ b/BOOT.XF.4.1/boot_images/QcomPkg/Include/i2c_api.h
@@ -295,7 +295,7 @@ typedef enum
{
I2C_INSTANCE_001 = 1, /**< Instance 01. */
I2C_INSTANCE_002, /**< Instance 02. */
- I2C_INSTANCE_003, /**< Instance 03. */
+ I2C_INSTANCE_003, /**< Instance 03. */
I2C_INSTANCE_004, /**< Instance 04. */
I2C_INSTANCE_005, /**< Instance 05. */
I2C_INSTANCE_006, /**< Instance 06. */
diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.inf b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.inf
index 3ba007af1..9570c646f 100755
--- a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.inf
+++ b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.inf
@@ -29,6 +29,7 @@
[LibraryClasses]
DebugLib
NpaApiLib
+ I2CApiLib
[Protocols]
gEfiPlatformInfoProtocolGuid
diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.c b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.c
index e95a55865..d6477f6de 100755
--- a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.c
+++ b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/AgattiPkg/Library/MDPPlatformLib/MDPPlatformLib.c
@@ -39,6 +39,8 @@ extern "C" {
#include "pmapp_npa.h"
#include "DDITlmm.h"
#include "HALDSILib.h"
+#include <i2c_config.h>
+#include "i2c_api.h"
/* -----------------------------------------------------------------------
** Defines
@@ -216,6 +218,97 @@ const PanelDTInfoType fastBootPanelList[] =
PANEL_CREATE_ENTRY("", MDPPLATFORM_PANEL_NONE, "", DISP_INTF_NONE, DISP_TOPOLOGY_CONFIG_NONE, DISP_TIMING_CONFIG_NONE, PLL_OVERRIDE_NONE, DISP_MODE_NONE, DISP_MODE_DUAL_DSI | DISP_MODE_SKIP_BOOTLOADER, DISP_MODE_DUAL_DSI | DISP_MODE_SKIP_BOOTLOADER),
};
+struct aw21024_cfg {
+ UINT16 reg;
+ UINT16 val;
+};
+
+static struct aw21024_cfg aw21024_breath_red_leds_on[] = {
+ {0x00, 0x91},
+ {0x01, 0x60},
+ {0x49, 0x00},
+ {0x4a, 0x00},
+ {0x6e, 0x80},
+ {0x7e, 0xa8},
+ {0x7f, 0x18},
+ {0x90, 0xff},
+ {0x91, 0xff},
+ {0x92, 0xff},
+ {0xa0, 0x03},
+ {0xa1, 0x05},
+ {0xa2, 0x44},
+ {0xa3, 0x44},
+ {0xa4, 0x00},
+ {0xa5, 0x10},
+ {0xa6, 0x00},
+ {0xa7, 0x66},
+ {0xa8, 0x66},
+ {0xa9, 0x00},
+ {0xaa, 0x00},
+ {0xab, 0x07},
+ {0xac, 0x08},
+};
+
+void aw21024_init(){
+ i2c_status istatus = I2C_SUCCESS;
+
+ VOID *i2c_handle = NULL;
+ UINT32 bytes_written = 0;
+ UINT16 offset = 0;
+
+ uint8 data_write = 0;
+
+ int size_W = 0;
+ int i = 0,j = 0;
+
+ i2c_slave_config cfg;
+ struct aw21024_cfg *init_setup_cfg = aw21024_breath_red_leds_on;
+
+ istatus = i2c_open(I2C_INSTANCE_003, &i2c_handle);
+ if (I2C_SUCCESS != istatus)
+ {
+ DEBUG((EFI_D_ERROR, "Failed to initialize I2C %d\n", istatus));
+ goto error;
+ }
+
+ cfg.bus_frequency_khz = 400;
+ cfg.slave_address = 0x30;
+ cfg.mode = I2C;
+ cfg.slave_max_clock_stretch_us = 500;
+ cfg.core_configuration1 = 0;
+ cfg.core_configuration2 = 0;
+ offset = 0x00;
+
+ size_W = sizeof(aw21024_breath_red_leds_on) / sizeof(struct aw21024_cfg);
+ cfg.slave_address = 0x30;
+ for(j = 0;j < 2; j++){
+ for (i = 0; i < size_W; i++){
+ offset = init_setup_cfg[i].reg;
+ data_write = init_setup_cfg[i].val;
+ istatus = i2c_write (i2c_handle, &cfg, offset, 1, &data_write, 1, &bytes_written, 2500);
+ if (I2C_SUCCESS != istatus)
+ {
+ DEBUG((EFI_D_ERROR, "Write 0x%02x Failed %d,%d\n", offset,(uint32) istatus, bytes_written));
+ goto error;
+ }
+ else
+ {
+ DEBUG((EFI_D_ERROR, "Write REG:0x%02x SUCCESS\n",offset));
+ }
+ }
+ }
+
+
+error:
+ if (i2c_handle != NULL)
+ {
+ if (I2C_SUCCESS != i2c_close(i2c_handle))
+ {
+ DEBUG((EFI_D_ERROR, "Failed to DeInitialize I2C %d\n", istatus));
+ }
+ }
+
+}
/*===========================================================================
Function Definitions
===========================================================================*/
@@ -232,6 +325,8 @@ MDP_Status PlatformClientInit(MDP_Display_IDType eDisplayId, Panel_PowerCtrlPara
{
MDP_Status Status = MDP_STATUS_OK;
+ aw21024_init();
+
NPAClientName aNPAClientName[MDP_DISPLAY_MAX] =
{
{PMIC_NPA_GROUP_ID_DISP_PRIM, "DisplayPrim"},
以上是xbl阶段所有的修改,另外,还需要在TZ中打开I2C的权限配置
注意:I2C的权限配置不是qupv3_perms_default下,而在函数qupv3_perms_default_Genoa下配置(目前还没跟踪为啥是在这个函数下面),I2C的工作模式配置为FIFO
diff --git a/TZ.XF.5.1/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/agatti/QUPAC_Access.c b/TZ.XF.5.1/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/agatti/QUPAC_Access.c
index 7b7af87a1..32803522c 100755
--- a/TZ.XF.5.1/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/agatti/QUPAC_Access.c
+++ b/TZ.XF.5.1/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/agatti/QUPAC_Access.c
@@ -86,7 +86,7 @@ const QUPv3_se_security_permissions_type qupv3_perms_default_Genoa[] =
/*PeriphID, ProtocolID, Mode, NsOwner, bAllowFifo, bLoad, bModExcl */
{ QUPV3_0_SE0, QUPV3_PROTOCOL_UART_4W, QUPV3_MODE_FIFO, AC_HLOS, TRUE, TRUE, FALSE }, // Diag UART
{ QUPV3_0_SE1, QUPV3_PROTOCOL_UART_2W, QUPV3_MODE_FIFO, AC_HLOS, TRUE, TRUE, FALSE }, // SMB/NFC/EEPROM/PM8008 //[jira:MC0266-13]modified by gyx for uart2 22.08.22
- { QUPV3_0_SE2, QUPV3_PROTOCOL_I2C, QUPV3_MODE_GSI, AC_HLOS, FALSE, TRUE, FALSE }, // Legacy Touch
+ { QUPV3_0_SE2, QUPV3_PROTOCOL_I2C, QUPV3_MODE_FIFO, AC_HLOS, TRUE, TRUE, FALSE }, // Legacy Touch
{ QUPV3_0_SE3, QUPV3_PROTOCOL_UART_4W, QUPV3_MODE_FIFO, AC_HLOS, TRUE, TRUE, FALSE }, // BT HCI
{ QUPV3_0_SE4, QUPV3_PROTOCOL_UART_2W, QUPV3_MODE_FIFO, AC_HLOS, TRUE, FALSE, FALSE }, // Debug UART
{ QUPV3_0_SE5, QUPV3_PROTOCOL_SPI, QUPV3_MODE_GSI, AC_HLOS, FALSE, TRUE, TRUE }, // Fingerprint//[Jira:MC0224-606]modified by gyx for releasing spi 22.08.16