高通平台power_supply 框架下添加第三方充电IC的驱动方法

2024-02-05 12:32

本文主要是介绍高通平台power_supply 框架下添加第三方充电IC的驱动方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.power_supply电源框架介绍

power supply framework在kernel/drivers/power/下。内核抽象出来power supply子系统为驱动提供了统一的框架。

功能包括:

1.抽象PSY设备的共性,向用户空间提供统一的API;

2.为底层PSY驱动的编写,提供简单、统一的方式,同时封装并实现公共逻辑。

power supply class位于drivers/power/目录中,主要由3部分组成(可参考下图的软件架构):

1)power_supply_core,用于抽象核心数据结构、实现公共逻辑。位于drivers/power/power_supply_core.c中。

2)power_supply_sysfs,实现sysfs以及uevent功能。位于drivers/power/power_supply_sysfs.c中。

3)power_supply_leds,基于Linux led class,提供PSY设备状态指示的通用实现。位于drivers/power/power_suppply_leds.c中。

最后,驱动工程师可以基于power supply class,实现具体的PSY drivers,主要处理平台相关、硬件相关的逻辑。这些drivers都位于drivers/power/power_supply目录下。

power_supply的软件架构:

在具体设备文件中在/sys/class/power_supply,具体如下:

 

power_supply 框架工作流程

Linux的设备文件目录中可以在sys/class/下看到power_supply目录;这个power_supply的类是通过power_supply_core.c文件中的power_supply_class_init()中的class_create()函数来进行power_supply类的创建,如下:

进入power_supply的目录下:

我们可以看到出现了battery与usb两个目录,这两个目录就是充电IC(battery)与USB(usb)电源管理部分的注册的设备节点内容的集合。

进入battery目录下

可以看到很多设备节点,这些节点就是通过power_supply的电源框架提供的方法进行注册并实现其内容的。

对于上述的节点内容,是怎么实现的,其实power_supply都提供了相应的节点名称,在文件/kernel/include/linux/power_supply.h中提供了相关的属性枚举定义。如下:

这里提供了大部分的设备节点属性。作为驱动工程师,只需要选取芯片存在的并且自己需要的属性并实现其内容即可。

在power_supply的结构体中:

在这个结构体中,可以看到有set_property与get_property两个属性的函数指针,这两个函数指针就是用来具体实现相关属性功能的。

 

power_supply_sysfy文件系统

power_supply_sysfs.c文件中,具体进行的是设备节点的注册过程,以及相关功能的实现:

从上面可以看出,在power_supply_sysfs文件中主要是实现power_supply_attrs数组中的成员的show与store。

先看power_supply_attrs数组

从上述内容看,power_supply_attrs数组其实就是实现之前power_supply.h文件中的枚举power_supply_property。而POWER_SUPPLY_ATTR(online)中括号内容即是具体设备节点。

在POWER_SUPPLY_ATTR结构体中,有show与store两个指针。

show的内容就是使用cat  xxxx节点的操作显示出来的内容的:

从上面可以看到有些节点显示的内容并不是数字,而是在show函数中被转换成了相关的字符串。如:


而store函数是echo xx > xxx节点的操作写入的内容。

在上述节点中,存在uevent这个节点,可以看看uevent节点的内容:

这个节点由power_supply_sysfs文件中的power_supply_uevent函数实现的。

这个函数的作用就是将该设备节点下所有节点的内容组合成字符串发送到uevent中,在通过内核的uevent框架发送到用户空间。

当设备节点内容发生变化时,会调用power_supply_changed函数:

可以看到该函数是将psy->changed_work加入到工作队列中,具体的调用设备的changed_work的工作队列,看看具体做什么:

可以看到,对该类中查询每个设备的更新操作,再更新led灯的操作,还有就是发送新的事件通知应用层。

至此power_supply就介绍结束了。

 

2. I2C驱动设备的添加与驱动的编写:

首先在具体平台的dtsi设备树文件中添加相应的I2C设备:

这里需要通过硬件电路图,了解设备所挂载的I2C总线,以及通过芯片手册获取设备地址。

芯片的驱动文件的具体编写如下:

第一.在具体设备驱动文件中可以按照其他的I2C设备驱动进行相关的驱动文件进行基本框架结构的编写。

第二.在具体的芯片驱动文件中probe函数的实现

首先设计驱动的参数结构体数据:

在结构体的最后,定义一个该结构体的全局结构体指针。

再回到probe函数中:

  1. 由于充电IC驱动的结构体中,存在usb_psy的成员指针变量,所以,在probe中,需要将usb_psy进行实例化,通过power_supply_get_by_name获取usb的电源相关的驱动文件,并将地址赋给power_supply类型的usb_psy指针。
  2. 给驱动文件开辟内存空间,在这里使用devm_kzalloc而不用kzalloc,好处在于devm_kzalloc自带内存释放和回收机制
  3. 给充电驱动的结构体的一些成员变量进行赋初值。其中将usb_psy赋给充电IC的成员变量usb_psy。这里是为了获取USB的相关状态,以便对充电IC的状态进行相应的操作。
  4. 获取PMIC端对电池的电压采集的节点,使用qpnp-get-vadc将pmic的电压采集pin脚的地址传递给充电IC的vadc_dev的成员变量。

5.给充电IC的驱动文件中填充power_supply的相关内容,用于sys/class/power_supply/目录下生成battery的目录内容;最后通过 power_supply_register进行power_supply类型的设备文件进行设备驱动的注册。

6.进行充电前芯片的硬件初始化工作,主要是对一些寄存器进行设置,如充电安全寄存器的设置。

7.注册一个延时工作队列,进行循环处理充电过程的相关操作。

第三.填充实现power_supply的相关属性:

上述的power_supply的相关属性,是在power_supply的框架里的内容的一部分,由于power_supply的电源管理框架将大部分的属性都做了枚举,我们根据具体的充电IC,进行部分的实现,在get_property中进行具体的实现,这样的结果就是可以在具体节点下cat到具体的值。

第四.对充电IC的硬件进行初始化工作:

这里主要是针对充电IC的硬件特性,进行相关的功能的寄存器的设定工作,确保芯片能正常工作。

第五.就是延时工作队列中的工作内容的添加与实现:

在延时工作队列中主要是对充电的相关功能的实现,如:

  1. USB的插入检测,并使能充电芯片的充电工作;
  2. 对电池的CV进行检测,并设定正确的CV值(constant voltage);
  3. 获取电池的实时电压,并针对当前电压进行相关的操作,如,复充的实现;
  4. 对电池的温度进行检测,获取到电池NTC温度之后,根据电池规格书中对电池充电温度的要求,获取充电过程中,电池的健康状态,并设置不同的充电电流;
  5. 对充电器的类型检测,设置不同的输入电流;
  6. 通过power_supply_changed函数向uevent发送节点属性改变事件;
  7. dump寄存器的值,以便调试人员从log中查看充电IC的实时状态;
  8. 针对充电不同的状态,修改延时工作队列的延时时间。

以上充电IC的驱动添加方法。

这篇关于高通平台power_supply 框架下添加第三方充电IC的驱动方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680924

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti