将TI的电量计Linux驱动从4.4内核移植到5.10

背景

最近公司某产品用到了TI的电量计芯片BQ40Z50,我负责为其开发Linux驱动,搜了下,github上有TI为其写好的开源驱动,太好了。

看了下代码,比较简单,连Makefile都没写,不过这也挺好,说明对编译环境没有要求。自己编写好Makefile后编译,出现3个编译错误:

bq40z50_fg.c:609:2: error: 'POWER_SUPPLY_PROP_RESISTANCE_ID' undeclared here (not in a function); did you mean 'POWER_SUPPLY_PROP_VOLTAGE_MIN'?609 |  POWER_SUPPLY_PROP_RESISTANCE_ID,|  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|  POWER_SUPPLY_PROP_VOLTAGE_MIN
bq40z50_fg.c:610:2: error: 'POWER_SUPPLY_PROP_UPDATE_NOW' undeclared here (not in a function); did you mean 'POWER_SUPPLY_PROP_CHARGE_NOW'?610 |  POWER_SUPPLY_PROP_UPDATE_NOW,|  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~|  POWER_SUPPLY_PROP_CHARGE_NOW
bq40z50_fg.c:777:22: error: 'POWER_SUPPLY_TYPE_BMS' undeclared (first use in this function); did you mean 'POWER_SUPPLY_TYPE_UPS'?777 |  bq->fg_psy_d.type = POWER_SUPPLY_TYPE_BMS;|                      ^~~~~~~~~~~~~~~~~~~~~|                      POWER_SUPPLY_TYPE_UPS

分析一番发现,是因为我们产品是基于5.10内核的,而TI的开源驱动是基于4.4内核的,有些宏定义在5.10内核找不到。

解决过程

首先检查出错的宏是不是改名了,一番对比后确认,不是改名,就是删掉了,估计是觉得跟其他相关宏定义重合度太高。

移植POWER_SUPPLY_TYPE_BMS

先检查POWER_SUPPLY_TYPE_BMS,感觉意思跟它相近的是POWER_SUPPLY_TYPE_BATTERY,发现4.4内核只有TI的电量计bq40z50、bq34z100、bq28z610、bq27z860、bq27z561、bq27532、bq27426芯片驱动选的是前者,其他厂家的驱动都选的别的,其中选后者的有84个,甚至TI自己的bq2560x、bq25700、bq2588x、bq27xxx也是。

再看4.4内核drivers/power/power_supply_core.c对二者的处理,发现压根没处理BMS类型,所以我决定将BMS改成BATTERY。

移植POWER_SUPPLY_PROP_RESISTANCE_ID

该属性没有对应的替代,不过查看TI对该属性的实现,发现get是固定返回0,set没实现,那还有什么意义?直接删除了事。

移植POWER_SUPPLY_PROP_UPDATE_NOW

该属性也没有对应的替代,不过查看TI对该属性的实现,发现get也是固定返回0,set是dump所有I2C寄存器,只是方便调试,删了也没啥影响。

加载运行效果

做了前述修改后,代码在5.10内核上编译通过,加载成功,在sysfs里能看到各种电量计属性,有些属性的值明显有误,这是因为I2C总线有硬件问题,跟驱动无关。
bq40z50驱动的应用层接口

最终代码补丁

Index: bq40z50_fg.c
===================================================================
--- bq40z50_fg.c        (版本 418)
+++ bq40z50_fg.c        (版本 419)
@@ -606,8 +593,6 @@/*POWER_SUPPLY_PROP_HEALTH,*//*implement it in battery power_supply*/POWER_SUPPLY_PROP_CHARGE_FULL,POWER_SUPPLY_PROP_TECHNOLOGY,
-       POWER_SUPPLY_PROP_RESISTANCE_ID,
-       POWER_SUPPLY_PROP_UPDATE_NOW,};static int fg_get_property(struct power_supply *psy, enum power_supply_property psp,
@@ -710,13 +695,6 @@val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO;break;-       case POWER_SUPPLY_PROP_RESISTANCE_ID:
-               val->intval = 0;
-               break;
-       case POWER_SUPPLY_PROP_UPDATE_NOW:
-               val->intval = 0;
-               break;
-default:return -EINVAL;}
@@ -738,9 +716,6 @@bq->fake_soc = val->intval;power_supply_changed(bq->fg_psy);break;
-       case POWER_SUPPLY_PROP_UPDATE_NOW:
-               fg_dump_registers(bq);
-               break;default:return -EINVAL;}
@@ -757,7 +732,6 @@switch (prop) {case POWER_SUPPLY_PROP_TEMP:case POWER_SUPPLY_PROP_CAPACITY:
-       case POWER_SUPPLY_PROP_UPDATE_NOW:ret = 1;break;default:
@@ -774,7 +748,7 @@struct power_supply_config fg_psy_cfg = {};bq->fg_psy_d.name = "bms";
-       bq->fg_psy_d.type = POWER_SUPPLY_TYPE_BMS;
+       bq->fg_psy_d.type = POWER_SUPPLY_TYPE_BATTERY;bq->fg_psy_d.properties = fg_props;bq->fg_psy_d.num_properties = ARRAY_SIZE(fg_props);bq->fg_psy_d.get_property = fg_get_property;

总结

芯片厂商开发Linux驱动时,为了节省人力,一般会选择一个内核版本进行开发,开发完毕后一般不会随Linux大版本的发布而更新,因为人家的驱动代码主要是做演示用的,版本发布导致的内核接口变更需要工程师自己去适配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库结构文档生成方法二(EZDML)

EZDML 下载链接:EZDML - 下载 我们常用的是数据建模有PowerDesigner,EZDML也是一款数据建模工具,而且功能很多,除了生成sql,还可以生成前端后端代码等等。 我们直接下载最新版后点击安装,打开后会默认打开示例&#…

免费三款备受推崇的爬虫软件

在信息爆炸的时代,爬虫软件成为了数据采集、信息挖掘的得力工具。为了解决用户对优秀爬虫软件的需求,本文将专心分享三款备受推崇的爬虫软件,其中特别突出推荐147采集软件,为您开启爬虫软件的奇妙世界。 一、爬虫软件的重要性 爬…

Github仓库使用方式

主要参考: 「详细教程」使用git将本地项目上传至Github仓库(MacOS为例)_github上传代码到仓库-CSDN博客 新建文件夹参考: GitHub使用指南——建立仓库、建立文件夹、上传图片详细教程-CSDN博客 一、新建一个 github 仓库&#…

Pytorch从零开始实战17

Pytorch从零开始实战——生成对抗网络入门 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成对抗网络入门环境准备模型定义开始训练总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch1.8cpu&#xf…

【文本到上下文 #2】:NLP 的数据预处理步骤

一、说明 欢迎阅读此文,NLP 爱好者!当我们继续探索自然语言处理 (NLP) 的广阔前景时,我们已经在最初的博客中探讨了它的历史、应用和挑战。今天,我们更深入地探讨 NLP 的核心——数据预处理的复杂世界。 这篇文章是我们的“完整 N…

Java医药WMS进销存系统

技术架构: jdk8 IntelliJ IDEA maven Mysql5.7 有需要的可以私信我。 系统功能与介绍: 医药进销存系统,主要分两种角色:员工、客户。本系统具有进销存系统的通用性,可以修改为其它进销存系统,如家电进…

丰果管道——2024中国家装管道十大品牌

丰果管道——2024中国家装管道十大品牌 丰果(中国)有限公司 丰果管道品牌创立于1999年,是国内最早从事PPR家装管道生产的品牌之一,在业内有着良好的口碑和市场美誉度,在全国的头部装企更是有相当高的市场占有率。2023年…

如何在Docker下部署MinIO存储服务通过Buckets实现文件的远程上传

📑前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &#…

list上

文章目录 初步了解list面试题:为什么会有list?vector的缺点:vector、list优点 list结构迭代器的分类list的简单运用insert、erase、迭代器失效(和vector的区别)erase class和structlist的迭代器为什么这个迭代器的构造…

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借鉴了不少项目,最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错,因此进行了实现。 一、核心功能设计 总的来说,我们需要能够实现实时检测视…

Spring高手之路-Spring事务失效的场景详解

目录 前言 Transactional 应用在非 public 修饰的方法上 同一个类中方法调用,导致Transactional失效 final、static方法 Transactional的用法不对 Transactional 注解属性 propagation 设置不当 Transactional注解属性 rollbackFor 设置错误 用错注解 异常…

Ubuntu中查看IP地址的常用命令及使用方法

在Ubuntu操作系统中,了解和查看IP地址是进行网络配置、故障排除以及连接其他设备的重要一步。 以下是几个常用的命令来查看IP地址: 一、ifconfig命令 输入ifconfig 输出如图所示,即为ip地址 如若提示没有ifconfig命令,则可以使用…