1. 需求描述

项目背景:基于 Qualcomm MDM9x07 平台的 4G MIFI 产品,使用 Silergy 公司的 SY6974 充电 IC
需求内容: 在环境 /sys/class/power_supply/sy6794/enable 下增加一个 sysfs 节点,用于控制是否允许充电:
cat /sys/class/power_supply/sy6974/enable # 读取充电启用状态
echo 0 > /sys/class/power_supply/sy6974/enable # 禁止充电
echo 1 > /sys/class/power_supply/sy6974/enable # 启用充电

2. SY6974 充电芯片简介

  • 厂商:Silergy (China)
  • 通信方式:I2C
  • 功能:
    • 支持常压充电
    • 支持温度、电压、电流等相关监测
    • 多级充电结束条件

3. 工作原理 & 软件流程

  • 设备通过 I2C 形成 Linux 中的 /dev/i2c-X
  • SY6974 驱动在 probe 时连接 I2C client,初始化 GPIO 与 power_supply
  • 通过 power_supply_register 注册一个 sy6974名称的 power supply 设备
  • Linux power_supply 框架会自动创建 /sys/class/power_supply/sy6794/ 节点
  • 属性访问由 power_supply_class 接管,通过标准 get_property 接口提供信息

4. 原始驱动框架

  • 使用简单版 power_supply_register()
struct power_supply charger;
power_supply_register(dev, &charger);
  • 无 power_supply_desc 和 power_supply_config
  • charger.dev 为 NULL,需要后期根据 name 查找 device

5. 可行方案分析

方案 1:改为 power_supply_desc 模型

  • ✅ 优点:规范,正确
  • ❌ 缺点:需要重写多数代码,不适合现有已使用 power_supply_register() 的组织

方案 2:把 enable 节点挂载到 i2c client 节点

  • ✅ 简单易行
  • ❌ 但节点路径不符合需求(在 /sys/devices/.../enable)

方案 3(已采用):查找 power_supply 对应 device,挂载 sysfs 节点

  • ✅ 保持原驱动结构不变
  • ✅ 节点出现在 /sys/class/power_supply/sy6794/enable
  • ✅ 兼容 power_supply 框架
  • ❌ 需要多一步查找名称,不能直接传递 driver_data

6. 最终方案详解

修改清单

  • 修改函数:sy6974_power_supply_init()、sy6974_power_supply_exit()
  • 新增函数:enable_show、enable_store、power_supply_match_by_name
  • 使用静态全局变量保存 charger 设备指针,避免覆盖 power_supply 框架数据

1). 实现方法

新增变量和头文件:
#include <linux/sysfs.h>
#include <linux/device.h>
#include <linux/power_supply.h>
static struct sy6974_device *g_sy6974 = NULL;

实现 sysfs 操作函数:

static ssize_t enable_show(struct device *dev, struct device_attribute *attr, char *buf) 
{if (!g_sy6974)return -ENODEV;return sprintf(buf, "%d\n", g_sy6974->charge_enabled);
}static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) 
{unsigned long val;if (!g_sy6974)return -ENODEV;if (kstrtoul(buf, 10, &val))return -EINVAL;sy6974_set_charge_enable(g_sy6974, !!val);return count;
}static DEVICE_ATTR(enable, 0664, enable_show, enable_store);

2). 查找 power_supply class 的 device,并添加属性文件

在 sy6974_power_supply_init() 注册完成 power_supply 后添加:

extern struct class *power_supply_class; 
static int power_supply_match_by_name(struct device *dev, const void *data) 
{ const char *name = data; struct power_supply *psy = dev_get_drvdata(dev); if (!psy || !psy->name) return 0; return strcmp(psy->name, name) == 0; 
}

然后添加以下代码:

// 保存设备指针 
g_sy6974 = bq; 
struct device *psy_dev = class_find_device(power_supply_class, NULL, bq->charger.name, power_supply_match_by_name); 
if (!psy_dev) 
{ dev_err(bq->dev, "Failed to find power_supply device\n"); return -ENODEV; 
} ret = device_create_file(psy_dev, &dev_attr_enable); 
if (ret) dev_err(bq->dev, "Failed to create enable sysfs node\n"); 
else bq->charger.dev = psy_dev;

3). 清理函数中移除 sysfs 节点

在 sy6974_power_supply_exit() 函数中添加:

if (bq->charger.dev) device_remove_file(bq->charger.dev, &dev_attr_enable); g_sy6974 = NULL;

4). 测试路径

ls /sys/class/power_supply/sy6974/enable 
cat /sys/class/power_supply/sy6974/enable # 输出 1 或 0 
echo 1 > /sys/class/power_supply/sy6974/enable # 启用充电 
echo 0 > /sys/class/power_supply/sy6974/enable # 禁用充电 
dmesg | tail

7. 测试与验证

测试项

操作

预期

1. 节点创建

ls /sys/class/power_supply/sy6974/enable

正常显示

2. 状态读取

cat enable

输出 0 或 1

3. 禁用充电

echo 0 > enable

芯片停止充电,log打印“DISABLED”

4. 启用充电

echo 1 > enable

芯片开始充电,log打印“ENABLED”

5. 充电状态监测

使用电表或测试桩

充电电流变化

8 FAQ 常见问题

Q1: 为何节点不在 /sys/class/power_supply/ 下?

请确保你没有使用 dev_set_drvdata() 覆盖了 power_supply 框架的 drvdata,此方案是通过 class_find_device 查找原始节点并挂载的。

Q2: 为什么 cat enable 会崩溃?

通常是 g_sy6974 为 NULL,可能是在调用前未初始化或退出时未清空,请检查 init/exit 的赋值与清理。

Q3: 有多个 charger 怎么处理?

不要使用全局变量 g_sy6974,改为一个以 name 哈希或数组形式维护的指针表,根据 dev 获取。

Q4: 如何调试节点写入失败?

检查 device_create_file() 返回值是否成功,并确认 power_supply_class 正确初始化,使用 dmesg 输出帮助判断。

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

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

相关文章

趣玩-Ollama-Llm-Chatrbot

软件说明 这个软件本人是从零开始实现的聊天机器人。基于Ollama&#xff08;PythonApi &#xff09; Pyside&#xff0c;实现了聊天机器的基本功能&#xff0c;还有一些个性化的功能比如模型管理&#xff0c;敏感词过滤&#xff0c;个性化主题设置&#xff0c;头像设置等功能。…

在mac 上zsh 如何安装最新的 go 工具

文章目录方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09;方法二&#xff1a;从官网下载安装包方法三&#xff1a;使用 g&#xff08;Go 版本管理器&#xff09;方法四&#xff1a;使用 gvm&#xff08;Go Version Manager&#xff09;验证安装和配置常用 Go 工具…

(十九)深入了解 AVFoundation-编辑:使用 AVMutableVideoComposition 实现视频加水印与图层合成(上)——理论篇

一、引言在短视频、Vlog、剪辑工具日益流行的今天&#xff0c;给视频添加 Logo、水印、时间戳或动态贴纸&#xff0c;已经成为非常常见的功能需求。这类效果看似简单&#xff0c;其实背后都涉及到“图层合成”的处理&#xff1a;如何将一个静态或动态的图层&#xff08;如文字、…

Android NDK与JNI深度解析

核心概念定义&#xff1a;NDK (Native Development Kit): 是什么&#xff1a; 一套由 Google 提供的工具集合。目的&#xff1a; 允许 Android 开发者使用 C 和 C 等原生&#xff08;Native&#xff09;语言来实现应用程序的部分功能。包含内容&#xff1a; 交叉编译器&#xf…

Golang各版本特性

1. Go各版本特性 | FeelingLife 2. https://chatgpt.com/share/68808f58-ae5c-800a-8153-5358098f301b 3.https://tonybai.com/2024/11/14/go-map-use-swiss-table/

HTML 转 Word API 接口

HTML 转 Word API 接口 支持网页转 Word&#xff0c;高效转换为 Word&#xff0c;提供永久链接。 1. 产品功能 超高性能转换效率&#xff1b;支持将传递的 HTML 转换为 Word&#xff0c;支持 HTML 中的 CSS 格式在 Word 文档中的呈现&#xff1b;支持传递网站的 URL&#xff…

Lucid Search: 极简、隐私友好的问答式搜索引擎技术解析

Lucid Search: 极简、隐私友好的问答式搜索引擎技术解析 产品定位与价值主张 Lucid Search 是一款革命性的问答式搜索引擎&#xff0c;其核心价值在于&#xff1a; 极简体验&#xff1a;无账户、无广告、前端完全静态隐私保护&#xff1a;不写入 Cookie、不记录 IP、无追踪即…

卷积神经网络:模型评估标准

一、分类模型评价指标在模型评估中&#xff0c;有多个标准用于衡量模型的性能&#xff0c;这些标准包括准确率&#xff08;Accuracy&#xff09;、精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分数&#xff08;F1-Score&#xff09;等…

【前端工程化】前端开发中想做好发布管理可以从哪些方面着手?

在企业级后台系统中&#xff0c;发布管理是整个开发流程的最终环节&#xff0c;也是最为关键的一环。它不仅涉及代码构建完成后的部署操作&#xff0c;还包括版本控制、灰度发布、回滚机制等保障系统稳定性的措施。 本文主要围绕发布流程设计、版本控制、部署方式、灰度策略和回…

替分布式=成本下降50% !

在数字化转型的浪潮中&#xff0c;数据库作为医疗信息系统的“心脏”&#xff0c;其稳定性与效率直接关乎医疗服务的质量。2024年10月30日&#xff0c;绵阳市第三人民医院集成平台的CDR数据库成功从分布式数据库Citus切换为国产集中式数据库KingbaseES&#xff0c;并稳定运行至…

【Linux系统编程】基础指令

基础指令1. adduser指令&&passwd指令2. userdel指令3. pwd指令4. ls指令5. cd指令6. tree指令7. touch指令8. mkdir指令9. rmdir指令&&rm指令10. man指令11. cp指令12. mv指令13. cat指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal…

区块链之以太坊Hardhat开发框架——部署在windows为例

Hardhat 提供了一个灵活且易于使用的开发环境&#xff0c;可以轻松地编写、测试和部署智能合约。Hardhat还内置了Hardhat 网络&#xff08;Hardhat Node&#xff09;&#xff0c;它是为开发而设计的本地以太坊网络。 下面是hardhat的官方文档 https://hardhat.org/hardhat-ru…

Ubuntu 1804 编译ffmpeg qsv MediaSDK libva 遇到的问题记录

之前都是 用的xeon服务器的cpu 不支持intel QSV 硬件加速 最近把自己的 14年买的pc机装上了ubuntu 1804 然后准备开启ffmpeg qsv 硬件加速功能 CPU i3-4170 内存DDR3 16G 硬盘机械盘500G 主板ASUS B85M-G首先安装vainfo工具apt install vainfo装完提示如下出错了 网上说是…

Elasticsearch(ES)介绍和安装

目录 一、Elasticsearch(ES)介绍 1.为什么需要单独的搜索服务 2.全文检索 3.Elasticsearch简介 1.Elasticsearch的特点 2.应用场景 3.ElasticSearch数据的存储和搜索原理 二、Elasticsearch(ES)安装 1、拉取镜像 2、创建目录并给目录赋权 3、创建并编辑配置文件 4、…

html结构解析

<!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html lang"zh-CN">&#xff1a;根元素&#xff0c;指定页面语言为中文 <meta charset"UTF-8">&#xff1a;设置字符编码&#xff0c;确保中文正常显示 <meta name"viewport"…

面试150 最大子数组和

思路 贪心法&#xff1a;设定最小标志result为float(‘-inf’),遍历一次数组元素进行求和&#xff0c;如果当前元素大于result&#xff0c;则更新result的值&#xff0c;如果sum小于0&#xff0c;则重新置0进行计算&#xff0c;最后返回result class Solution:def maxSubArray(…

MyBatis动态SQL实战:告别硬编码,拥抱智能SQL生成

MyBatis动态SQL实战&#xff1a;告别硬编码&#xff0c;拥抱智能SQL生成在电商平台的用户管理模块中&#xff0c;需要面对多种不同的用户查询组合条件。当使用传统的硬编码SQL方式时&#xff0c;代码膨胀到了2000多行&#xff0c;维护成本极高。而引入MyBatis动态SQL后&#xf…

Web前端开发:JavaScript遍历方法详解与对比

1. 传统 for 循环const arr [10, 20, 30]; for (let i 0; i < arr.length; i) {console.log(索引 ${i}: 值 ${arr[i]}); } // 输出&#xff1a; // 索引 0: 值 10 // 索引 1: 值 20 // 索引 2: 值 30特点&#xff1a;最基础的循环&#xff0c;可通过索引精准控制适用场景&…

Python 爬虫(一):爬虫伪装

目录 1 简介2 伪装策略 2.1 Request Headers 问题2.2 IP 限制问题 3 总结 1 简介 对于一些有一定规模或盈利性质比较强的网站&#xff0c;几乎都会做一些防爬措施&#xff0c;防爬措施一般来说有两种&#xff1a;一种是做身份验证&#xff0c;直接把虫子挡在了门口&#xff…

TODAY()-WEEKDAY(TODAY(),2)+1

这个Excel公式 TODAY()-WEEKDAY(TODAY(),2)1 用于计算 当前周的周一日期。下面详细解释它的逻辑和用法&#xff1a;公式解析TODAY()返回当前日期&#xff08;例如今天是2023年12月20日&#xff0c;则 TODAY() 2023/12/20&#xff09;。WEEKDAY(TODAY(), 2)计算当前日期是星期几…