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

2023-11-04

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QCM2290平台XBL阶段I2C使能并点亮LED 的相关文章

  • 使用 Eclipse 创建新的 android 项目后,Eclipse 中的 SRC 文件夹为空(未创建 MainActivity 类)

    使用 Eclipse 创建新的 android 项目后 Eclipse 中的 SRC 文件夹为空 未创建 MainActivity 类 我使用 Eclipse 创建了一个新的 android 项目 但我在项目资源管理器中看到 SRC 文件夹
  • 是否可以以编程方式更改操作栏选项卡指示器

    如何以编程方式更改操作栏的选定选项卡指示器 我读过关于选项卡样式 http developer android com guide topics ui actionbar html Style和 Tab setCustomView 方法 但
  • 在 Android 库项目中禁用 Crashlytics 进行调试

    我有一个包含多个模块的项目 模块的公共代码位于库模块中 问题是我们最近将 Crashlytics 添加到了我们的项目中 在库模块中 即使我们处于调试模式 我们也会不断收到错误报告 我在网上搜索了一下 发现库总是被视为Release模式 现在
  • Android spinner 将多列(连接)Sqlite 数据库加载到表中

    我正在学习如何创建一个从 SQLite 加载下拉列表的微调器 我有一个由旋转器和表格组成的用户界面 如果用户单击微调器 表的内容将根据微调器上选定的 ID 根据数据库加载 如果未选择名称 它将加载表中的所有内容 但是我找不到如何根据微调器上
  • 可序列化对象的 ArrayList 的加密保存和解密加载

    我在 SD 卡中保存并加载一个文件 其中包含ArrayList使用这两种方法的可序列化对象 保存方法 public static void saveUserList ArrayList
  • 如何创建轮播ViewPager?

    我想做的只是 Android 中的水平轮播 如果我有 3 个屏幕 A B 和 C 那么我希望我的 ViewPager 允许我像这样移动 A B B C C A GTalk for Android 的对话可以这样切换 三星的主屏幕和应用程序屏
  • 如何在无头Linux中更新Android平台工具?

    我们有一些没有安装 X Window 的 CI 主机 我知道如何使用 android 更新命令更新 SDK 但如何使用此命令更新平台工具 您可以使用以下命令 android list sdk android update sdk no ui
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 检查 key 是否存在 firebase Android

    我想检查 firebase 数据库中是否存在密钥 例如 我想查找关键的 upvotes 以查看它是否存在 Here is an exmaple upvotes key does not exist in here 现在我尝试检查密钥 upv
  • 如何在Android中以编程方式替换视图? [复制]

    这个问题在这里已经有答案了 我有一个复杂的视图 包含多个子视图 例如文本视图和图像视图 我想用另一个 派生的 图像视图替换其中一个图像视图 另一个支持在后台加载图像 如何用新的图像视图替换原始图像视图 我目前的解决方案只是复制粘贴整个 XM
  • onPictureTaken 之后旋转 JPEG 的字节数组

    有没有办法旋转字节数组而不将其解码为位图 目前在 jpeg PictureCallback 中我只是将字节数组直接写入文件 但图片是旋转的 我想旋转它们而不解码为位图 希望这能节省我的记忆 BitmapFactory Options o n
  • 更新到 3.2.0 后 Gradle 构建失败

    因此 在将 Gradle 插件更新到 3 2 0 并将 gradle wrapper 更新到 4 6 后 我遇到了问题 Android Studio 版本是 3 2 使用 Gradle 版本 即 alpha 11 也没有结果 什么地方出了错
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • Firebase 邀请发送电子邮件,但不发送短信。返回结果代码 0

    我正在尝试使用 Firebase 在我的 Android 应用程序中实现应用程序邀请系统 该代码与他们中给出的完全相同guide https firebase google com docs invites android private
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 如何在没有片段的情况下使用导航抽屉?

    我正在尝试遵循这个tutorial https developer android com training implementing navigation nav drawer html关于如何创建导航抽屉 但我不想在用户从抽屉列表中选择
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • Android动态功能模块,找不到资源

    当下载的功能模块发布到 Play 商店时 我在启动活动时遇到问题 它总是在下载模块活动中的 setContentView 上崩溃 java lang RuntimeException Unable to start activity Com
  • 片段已添加 IllegalStateException

    我在容器 Activity 上使用此方法来显示 BFrag public void showBFrag Start a new FragmentTransaction FragmentTransaction fragmentTransact
  • 更改 ActionMode 溢出图标

    有没有办法更改 ActionMode Overflow 图标而不更改 正常 ActionBar 的图标 我仍然需要弄清楚如何仅更改 ActionMode Actionbar 内部的溢出图标 因为我更改了默认操作栏中的溢出图标 该图标在 Ac

随机推荐

  • el-select绑定值赋值后,页面无法显示对应label值

    el select绑定值赋值后 页面无法显示对应label值 this lunwen achmId 1 页面也显示1 无法显示1对应的label值 这种情况大多数是数据类型不统一 比如页面绑定为number类型 而赋值为string类型 或
  • 多模态深度学习综述总结 与 目标检测多模态融合领域论文推荐

    文章目录 一 多模态学习定义及应用 二 模态表示 2 1 单模态表示 2 1 1 语句模态表示 2 1 2 视觉模态表示 2 1 3 声音模态表示 略 2 2 多模态表示 2 2 1 模态共作用语义表示 联合表示 2 2 2 模态约束语义表
  • 无公网IP,在外公网远程访问RabbitMQ服务「内网穿透」

    文章目录 前言 1 安装erlang 语言 2 安装rabbitMQ 3 内网穿透 3 1 安装cpolar内网穿透 支持一键自动安装脚本 3 2 创建HTTP隧道 4 公网远程连接 5 固定公网TCP地址 5 1 保留一个固定的公网TCP
  • Leedcode编程题283:移动零----C++实现

    目的 旨在记录在Leedcode网上刷题的过程 记录心得 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 示例 输入 0 1 0 3 12 输出 1 3 12 0 0 说明 必须在原数组上
  • SpringBoot连接超时导致的502错误案例

    1 问题描述 内部系统之间通过Nginx来实现路由转发 但最近发现有一个系统 经常报502错误 每天达到上百次 完全无法忍受 2 原因排查 于是进行排查 发现配置人员把连接超时时间 server tomcat connection time
  • 006 从不同的角度理解数组名的意义——“C”

    一 数组名的意义是什么 引入 1 数组名的意义 sizeof 数组名 这里的数组名表示整个数组 计算的是整个数组的大小 数组名 这里的数组名表示整个数组 取出的是整个数组的地址 除此之外所有的数组名都表示首元素的地址 2 strlen函数基
  • js 修改服务器控件,js设置服务器控件的值

    js设置服务器控件的值 内容精选 换一换 规划数据服务器与集群处于同一内网 数据服务器IP为192 168 0 90和192 168 0 91 数据源文件格式为CSV 创建导入的目标表tpcds reasons CREATE TABLE t
  • 驱动开发概念详解

    1 什么是驱动 能够驱使硬件实现特定功能的软件代码 可以根据驱动程序是否依赖于系统内核将其分为裸机驱动和系统驱动 1 1裸机驱动 编写的驱动代码中没有进行任何内核相关的API调用 开发者查询资料配置寄存器完成硬件相关控制 不依赖于系统内核
  • 企业治理实战-经验分享

    该文章已同步到语雀公开知识库 大数据技术架构手册 1 中 公众号后台回复 小程序注册码 可免费查看面试题小程序 前言 作为一名数据人 常常自嘲为SQL Boy 某天突然发现原来SQL boy还有一些更高级的工作内容 数据治理 这两年也有很多
  • 第41篇-小某书timestamp2参数分析【2022-08-15】

    提前声明 该专栏涉及的所有案例均为学习使用 如有侵权 请联系本人删帖 文章目录 一 前言 二 加密分析 三 改版 一 前言 今天我们来分析一下timestamp2参数 aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29t
  • 图的深度遍历(DFS)和广度遍历(BFS)详解

    目录 1 前奏 邻接表 2 深度遍历 3 广度遍历 1 前奏 邻接表 图作为种比较繁琐的数据结构 在进行图的操作之前 首先应该用合适的数据类型来存储图的信息 我们使用邻接表来存储 它是一种链式的存储结构 所谓邻接表就是对途中的每个顶点建立一
  • 从0搭建go+walk界面应用开发程序(windows)

    从0搭建go walk界面应用开发程序 第一步 安装GO SDK 1 1 下载sdk 从官网下载SDK 进入https golang google cn dl 点击 download 或者直接使用浏览器或迅雷下载笔者自己上传的SDK htt
  • memo、useMemo和useCallback的区别

    memo用来优化函数组件的重复渲染行为 当传入属性值都不变的情况下不会触发组件的重新渲染 否则就会触发组件的重新渲染 和类组件的PureComponent的功能是类似的 在hooks环境下 几乎所有组件都是函数式组件 我们使用memo的几率
  • koa2 post请求ctx.request.body空获取不到的解决办法

    header请求头添加Content type application json
  • Java中的四种引用类型是哪些?

    从一开始学习Java我们就知道Java的数据类型一般有两种 一种是基本数据类型 另一种是引用数据类型 其中 基本数据类型的值通常储存在栈内存中 用于对该类型的对象进行存储 而引用数据类型则在存储堆中对需要引用的对象进行引用 引用是Java面
  • nps auth_key未授权访问漏洞

    一 漏洞简介 nps是一款轻量级 高性能 功能强大的内网穿透代理服务器 目前支持tcp udp流量转发 可支持任何tcp udp上层协议 访问内网网站 本地支付接口调试 ssh访问 远程桌面 内网dns解析等等 此外还支持内网http代理
  • 微信常见错误码及解决方案

    40001 获取access token时AppSecret错误 或者access token无效 这个错误代码表示您的访问令牌 access token 已经过期或者无效 需要重新获取 40003 openid错误 openid是微信公众
  • devServer-host解析

    devServer的其他配置 host解析 host设置主机地址 默认值是localhost 如果希望其他地方也可以访问 可以设置为 0 0 0 0 localhost 和 0 0 0 0 的区别 localhost 本质上是一个域名 通常
  • C语言实现队列

    文章目录 一 什么是队列 二 队列的实现 2 1 队列的结构 2 2 队列的几个功能 2 2 1 初始化队列 2 2 2 队列判空 2 2 3 队尾入队列 2 2 4 队头出队列 2 2 5 获取队列头部元素 2 2 6 获取队列队尾元素
  • QCM2290平台XBL阶段I2C使能并点亮LED

    描述 qcm2290平台上 在低压充电阶段 XBL 需要驱动LED灯芯片 提供接口供充电模块调用 显示充电指示灯功能 说明 LED控制芯片是I2C接口 我只需要提供接口即可 我这边实现了在开机时led灯闪烁 在充电相关PmicLib目录下添