QCM2290平台XBL阶段I2C使能并点亮LED

描述: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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值