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

news2024/11/14 17:54:58

背景

最近公司某产品用到了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.coloradmin.cn/o/1398257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超高质量的 8个免费设计素材网站,设计师必备。

设计师一般都去哪里找素材?找高质量且免费的设计素材,就上这8个网站,平面、UI、电商等设计素材都能找到,赶紧收藏一波~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站,主要是站内…

第十三章 MySQL

第十三章 MySQL 下面是创建数据库操作 删除数据库 右上角选择要操作的数据库 如果关闭了这个控制台,下次如何找到它呢 也可以对其改名

C++类包含编译模型实战

文章目录 一、实战概述二、实战步骤(一)C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序,查看结果 (二)C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后,Unity报错:显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

Leetcode 用队列实现栈

题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

中使用 MOOTDX库读取通达信的数据,WIN+PYTHON,最新问题排查

M项目概述 - MOOTDXhttps://www.mootdx.com/zh-cn/latest/帮助文档https://www.mootdx.com/zh-cn/latest/​​​​​​​​​​​​​​​​​​​​​ 库的安装 注:我这的安装过程必须要ROOT权限,所以我用管理员的权限运行了控制台 pip install moot…

OCR识别网络CRNN理解与Pytorch实现

CRNN是2015年的论文“An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition”提出的图像字符识别网络,也是目前工业界使用较为广泛的一个OCR网络。论文地址:https://arxiv.org/…

SCI好看的配图-汇总

文章目录 图源:Sustainable Cities and Society【期刊】条形图2热力图-地图 图源:Sustainable Cities and Society【期刊】 引自:A machine learning-driven spatio-temporal vulnerability appraisal based on socio-economic data for COV…

【Vue】使用 Vuex 作为状态管理

【Vue】使用 Vuex 作为状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它使用单一状态树,这意味着这个对象包含了全部的应用层级状态,并且以一种相对集中的方式存在。这也意味着,通常单个项目中只有一个 Vuex store。Vue…

AI大模型开发架构设计(2)——AI绘画技术架构应用实践

文章目录 1 AI绘画整体流程2 AI绘画技术架构文生图核心算法原理文生图工程架构 3 AI绘画的应用实践 1 AI绘画整体流程 第一步:输入 Prompt 提示词:/mj 提示词第二步:文生图(Text-to-Image)构图第三步:图片渲染第四步:…

代码里下毒了,支付下单居然没加幂等

又是一个风和日丽没好的一天,小猫戴着耳机,安逸地听着音乐,撸着代码,这种没有会议的日子真的是巴适得板。 不料祸从天降,组长火急火燎地跑过来找到了小猫。“快排查一下,目前有A公司用户反馈积分被多扣了”…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论…

100天精通鸿蒙从入门到跳槽——第8天:TypeScript 知识储备:泛型

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站,通过信息收集插件wappalyzer,发现ZABBIX-监控系统: 使用谷歌搜索历史漏洞:zabbix漏洞 通过目录扫描扫描到后台,谷歌搜索一下有没有默认弱口令 成功进去了…

nginx配置内网代理,前端+后端分开配置

安装好后nginx,进入配置文件 我这块安装在了home里面,各位根据自身情况选择 打开nginx.conf文件 在底部查看是否包含这段信息:含义是配置文件包含该路径下的配置文件 include /home/nginx/conf/conf.d/*.conf; # 该路径根据自己的安装位置…

【从0到1学Python】第二讲:Python中的各种“量”(一)

也许你知道学习一门语言的第一件事就是在屏幕上输出"Hello world!"。 但是请别着急!在本系列文章中,我希望在讲如何输出之前,先谈谈Python中的各种量。因为,输出、输入语句也是基于各种“量”来完成的。我想&#xff0c…

基于springboot+vue的宠物领养系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景及意…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念(1)视点(Position&#…

【机器学习】四大类监督学习_模型选择与模型原理和场景应用_第03课

监督学习中模型选择原理及场景应用 监督学习应用场景 文本分类场景: o 邮件过滤:训练模型识别垃圾邮件和非垃圾邮件。 o 情感分析:根据评论或社交媒体内容的情感倾向将其分类为正面、负面或中性评价。 o 新闻分类:将新闻文章自动…

第一篇【传奇开心果】Vant 开发移动应用:从helloworld开始

传奇开心果系列博文 博文系列目录Vant of Vue 开发移动应用示例博文目录一、从helloworld开始二、添加几个常用组件三、添加组件事件处理四、添加页面和跳转切换路由五、归纳总结知识点六、知识点示例代码 博文系列目录 Vant of Vue 开发移动应用示例 博文目录 一、从hellow…