SY6974芯片添加enable充電控制節點

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)計算當前日期是星期幾…