充电学习—1、psy框架梳理

一、linux充电驱动代码框架:

在这里插入图片描述
在这里插入图片描述

  • APP 层
    该部分属于电量上报的最后的环节。其主要工作是:监听系统广播并对 UI 作出相应更新,包括电池电量百分比,充电状态,低电提醒,led 指示灯,异常提醒等
  • FrameWork 层
    本层的 Battery 服务使用 Java 代码写成,运行在 FrameWork 中的SystemServer 进程。该系统服务的主要作用是:监听电池信息变化消息,并将该消息以系统广播的形式转发至 Android 系统中各处
  • Native 层
    Healthd 守护进程属于 Android Native 层的一个系统服务,负责接受 Kernel Driver 层上报的 uevent 事件,对电池信息和充电状态实时监控。
  • Kernel 层
    本层属于电池的驱动部分,由 Charger-manager 驱动、充电 IC 驱动、Fuel 驱动构成,负责与硬件交互,注册 Power supply 属性,并生成 uevent 上报 Native 层。包含充电状态管理、电量统计与更新
  • 关机充电
    关机充电单独启动的一个 linux 应用,通过系统调用直接读取 sysfs 来获取电池信息,init 进程会根据启动模式来启动 charge 服务,不会启动 android 相关进程

二、power supply:

psy是linux供电系统抽象出来的一个 子系统,它是一个中间层,在kernel中属于设备驱动的一部分,负责硬件信息检测更新和对用户空间汇报各类信息变化。对它汇报的信息,抽象出来一个枚举类型:power_supply_property;
驱动层有两大模块:

  • 1、电池模块:
  • 2、充放电模块:
    这两部分都处理硬件相关的逻辑,在硬件发声变化时,触发对应的中断处理,然后会更新对应的psy属性的节点值,然后hal层会去读取这些节点,并在用户层做相应的更新。

三、power supply核心数据结构体:

1、struct power_supply
2、struct power_supply_desc:该描述符定义了psy的属性,包括它的type,psy包含的属性列表和属性个数,等
3、power_supply_batteryinfo:管理静态电池参数的结构

四、相关结构函数:

1、power_supply_core.c文件主要负责设备状态变化逻辑
power_supply_sysfs.c文件主要负责文件节点相关信息变化逻辑
2、power_supply_changed:驱动中检测到硬件变化时调用,通过此函数会去调度起psy中的changed work;该队列会去发送notify和uevent进行changed上报
3、power_supply_register:注册一个psy设备,在probe时调用注册
4、power_supply_get_by_name:通过名字去获取一个psy指针
5、power_supply_put:释放获取到的psy指针,和power_supply_get_by_name成对使用

五、充电驱动描述:

kernel驱动可以有三部分:charger manager、 fuel gauge、 charger ic ; 此三部分是作为独立的设备驱动,都注册都power_supply下,每一个设备都是单独的psy设备,psy设备之间通过属性相互访问,
fgu和IC其实是服务于CM的,CM不需要知道硬件的任何细节,会获取相应功能的psy设备实例,然后通过psy设备的属性获得想要信息

  • 1、CM – charger manager : 充电控制策略层
    修复并更新电量百分比
    充电流程管理(charging notcharging full充电状态转换管理)
    安全管理(OVP health charging-timeout)
    温控管理(jeita功能 thermal限流)
    电池电量显示策略(充放电曲线)
    电池容量管理(容量自学习功能)

  • 2、FGU–Fuel Gauge:
    pmic部分主要负责:
    库仑计电量积分
    充电器类型获取
    电池在位检测
    开机电压管理
    内阻–温度 容量–温度 等补偿算法

  • 3、charger IC:
    打开关闭充电
    设置充电电流
    设置截止充电电流
    打开关闭OTG

六、获取电量的方式:

1、内核通过power_supply_register函数注册battery电池psy设备
2、healthd通过power_supply_property接口获取电量:
psy->desc->name = “battery”
psp = POWER_SUPPLY_PROP_CAPACITY
电池在位检测:
psp = POWER_SUPPLY_PROP_PRESENT

七、一个IC的驱动流程:

在这里插入图片描述
在这里插入图片描述

相关推荐

  1. 【Go】面向萌新的Gin框架知识梳理学习笔记

    2024-06-18 16:56:07       12 阅读
  2. 【大模型】1. 深度学习框架和推理框架概念

    2024-06-18 16:56:07       13 阅读
  3. 深度学习相关概念梳理

    2024-06-18 16:56:07       12 阅读
  4. 数字图像处理知识梳理——1

    2024-06-18 16:56:07       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 16:56:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 16:56:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 16:56:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 16:56:07       20 阅读

热门阅读

  1. ffmpeg压缩视频

    2024-06-18 16:56:07       4 阅读
  2. 公有云和私有云有什么区别?详情介绍有关内容

    2024-06-18 16:56:07       5 阅读
  3. OpenGL绘制Bezier曲线

    2024-06-18 16:56:07       6 阅读
  4. Mybatis和Hibernate的作用区别及底层原理分析

    2024-06-18 16:56:07       8 阅读
  5. 李宏毅深度学习项目——HW1个人笔记

    2024-06-18 16:56:07       7 阅读
  6. Linux 常用命令 - rm 【删除文件或目录】

    2024-06-18 16:56:07       9 阅读
  7. 【二维码】

    2024-06-18 16:56:07       5 阅读
  8. Docker的安装 - 简单易懂

    2024-06-18 16:56:07       4 阅读