当前位置: 首页 > article >正文

从零开始:手把手教你为嵌入式设备编写一个简单的Power Supply驱动(基于Linux 4.19.111)

从零开始手把手教你为嵌入式设备编写一个简单的Power Supply驱动基于Linux 4.19.111在嵌入式Linux开发中电源管理是一个至关重要的环节。无论是智能家居设备、工业控制器还是便携式医疗设备稳定可靠的电源供应都是系统正常运行的基础。本文将带你深入Linux内核的Power Supply子系统从零开始构建一个完整的电池驱动。1. 理解Linux Power Supply子系统Linux内核中的Power Supply子系统为各类电源设备提供了统一的抽象框架。这个框架的核心思想是将电源状态信息抽象为属性properties并通过sysfs接口向用户空间暴露这些信息。1.1 子系统架构Power Supply子系统主要由三个部分组成Core位于drivers/power/power_supply_core.c提供核心数据结构和公共逻辑Sysfs位于drivers/power/power_supply_sysfs.c实现sysfs接口和uevent功能LEDs位于drivers/power/power_supply_leds.c提供电源状态LED指示功能典型的电源管理硬件通常包含两个主要组件Fuel Gauge电量计监测电池电量、健康状态等信息Charger充电管理处理电源插拔检测和充放电过程1.2 关键数据结构开发Power Supply驱动需要理解三个核心数据结构struct power_supply_config { struct device_node *of_node; struct fwnode_handle *fwnode; void *drv_data; char **supplied_to; size_t num_supplicants; }; struct power_supply_desc { const char *name; enum power_supply_type type; enum power_supply_property *properties; size_t num_properties; int (*get_property)(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val); int (*set_property)(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val); /* 其他成员省略 */ }; struct power_supply { const struct power_supply_desc *desc; struct device dev; /* 其他成员省略 */ };2. 硬件准备与数据手册分析假设我们基于i.MX6UL平台开发使用TI的BQ27425电量计芯片通过I2C接口通信。2.1 硬件连接典型的连接方式如下i.MX6UL引脚BQ27425引脚功能描述I2C1_SCLSCLI2C时钟I2C1_SDASDAI2C数据GPIO1_IO02INT中断输出VDD_3V3VCC电源(3.3V)GNDGND地线2.2 关键寄存器分析从BQ27425数据手册中我们需要关注以下寄存器寄存器地址名称描述访问权限0x02Voltage电池电压(mV)只读0x04AverageCurrent平均电流(mA)只读0x06RelativeStateOfCharge剩余电量百分比(%)只读0x08InternalTemperature内部温度(0.1°K)只读0x0AFullChargeCapacity满充容量(mAh)只读3. 驱动开发实战3.1 初始化与注册首先定义驱动所需的数据结构struct bq27425_data { struct i2c_client *client; struct power_supply *psy; struct delayed_work monitor_work; int voltage; int current; int capacity; int temp; };然后实现驱动的probe函数static int bq27425_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bq27425_data *data; struct power_supply_config psy_cfg {}; int ret; /* 分配并初始化数据结构 */ data devm_kzalloc(client-dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; >static enum power_supply_property bq27425_props[] { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CURRENT_NOW, POWER_SUPPLY_PROP_CAPACITY, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_TECHNOLOGY, }; static const struct power_supply_desc bq27425_psy_desc { .name bq27425-battery, .type POWER_SUPPLY_TYPE_BATTERY, .properties bq27425_props, .num_properties ARRAY_SIZE(bq27425_props), .get_property bq27425_get_property, }; static int bq27425_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { struct bq27425_data *data power_supply_get_drvdata(psy); switch (psp) { case POWER_SUPPLY_PROP_STATUS: val-intval POWER_SUPPLY_STATUS_DISCHARGING; break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val-intval >static int bq27425_read_word(struct i2c_client *client, u8 reg) { int ret; ret i2c_smbus_read_word_data(client, reg); if (ret 0) return ret; return le16_to_cpu(ret); } static void bq27425_update_data(struct bq27425_data *data) { >static void bq27425_monitor_work(struct work_struct *work) { struct bq27425_data *data container_of(work, struct bq27425_data, monitor_work.work); /* 更新数据 */ bq27425_update_data(data); /* 通知子系统数据变化 */ power_supply_changed(data-psy); /* 重新调度工作队列每5秒更新一次 */ schedule_delayed_work(data-monitor_work, 5 * HZ); }4. 设备树配置在设备树中添加节点描述硬件连接i2c1 { status okay; bq27425: fuel-gauge55 { compatible ti,bq27425; reg 0x55; monitored-battery battery; }; }; battery: battery { compatible simple-battery; voltage-min-design-microvolt 3000000; voltage-max-design-microvolt 4200000; energy-full-design-microwatt-hours 10000000; charge-full-design-microamp-hours 2500000; };5. 测试与验证驱动加载后可以通过sysfs接口验证功能# 查看电源设备列表 ls /sys/class/power_supply/ # 查看电池属性 cat /sys/class/power_supply/bq27425-battery/voltage_now cat /sys/class/power_supply/bq27425-battery/capacity也可以通过内核日志查看驱动运行状态dmesg | grep bq274256. 高级功能扩展6.1 实现充电状态检测扩展驱动以支持充电状态检测/* 在属性数组中添加 */ POWER_SUPPLY_PROP_STATUS, /* 在get_property中添加处理 */ case POWER_SUPPLY_PROP_STATUS: if (data-current 0) /* 正电流表示充电 */ val-intval POWER_SUPPLY_STATUS_CHARGING; else if (data-capacity 100) val-intval POWER_SUPPLY_STATUS_FULL; else val-intval POWER_SUPPLY_STATUS_DISCHARGING; break;6.2 添加温度监控实现温度监控和过热保护/* 在监控工作函数中添加检查 */ if (data-temp 500) { /* 50°C */ dev_warn(data-client-dev, Battery temperature too high: %d\n, >/* 在监控工作函数中添加检查 */ if (data-capacity 15) { power_supply_changed(data-psy); /* 触发uevent */ dev_info(data-client-dev, Low battery: %d%%\n,>

相关文章:

从零开始:手把手教你为嵌入式设备编写一个简单的Power Supply驱动(基于Linux 4.19.111)

从零开始:手把手教你为嵌入式设备编写一个简单的Power Supply驱动(基于Linux 4.19.111) 在嵌入式Linux开发中,电源管理是一个至关重要的环节。无论是智能家居设备、工业控制器还是便携式医疗设备,稳定可靠的电源供应都…...

【AISMM模型实战指南】:3大产品创新瓶颈的精准诊断与7天落地路径

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与产品创新能力 核心构成与创新映射关系 AISMM(Artificial Intelligence Software Maturity Model)并非传统能力成熟度模型的简单延伸,而是将AI工程化实践…...

如何快速掌握数据流同步技术:Lab Streaming Layer完整使用指南

如何快速掌握数据流同步技术:Lab Streaming Layer完整使用指南 【免费下载链接】labstreaminglayer LabStreamingLayer super repository comprising submodules for LSL and associated apps. 项目地址: https://gitcode.com/gh_mirrors/la/labstreaminglayer …...

C++ 虚函数全解:从基础原理到高级特性(多重继承 / 菱形继承 / CRTP 对比)

前言虚函数是 C运行时多态的核心,也是面试、底层开发、嵌入式 C 必考重难点。本文从零梳理:定义、特点、底层原理、覆盖与隐藏、final、纯虚函数、虚析构、构造虚函数、默认参数坑、多重继承内存模型、菱形继承,最后对比 CRTP 静态多态&#…...

避开FPGA实现SoftMax的坑:Verilog浮点运算的精度与资源权衡实战

FPGA实现SoftMax的工程实践:精度与资源的深度博弈 在边缘计算场景下,FPGA部署神经网络时总会遇到一个绕不开的难题——如何用有限的硬件资源实现高精度的SoftMax运算。这个看似简单的归一化函数,却让不少工程师在项目后期陷入时序紧张和资源超…...

保姆级避坑指南:在VMware Workstation 17上搞定macOS Ventura虚拟机(附Intel/AMD配置差异)

VMware Workstation 17上完美运行macOS Ventura虚拟机的终极指南 在Windows环境下运行macOS虚拟机一直是开发者和技术爱好者的热门需求,尤其是对于需要跨平台测试或体验苹果生态的用户。然而,这个过程充满了各种技术陷阱和兼容性问题。本文将深入探讨在V…...

通信工程毕业设计必过课题大全

【单片机毕业设计项目分享系列】 🔥 这里是DD学长,单片机毕业设计及享100例系列的第一篇,目的是分享高质量的毕设作品给大家。 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的单片机项目缺少创新和亮点…...

观察使用 Taotoken 后月度 AI 模型 API 开支的清晰度与预测性变化

观察使用 Taotoken 后月度 AI 模型 API 开支的清晰度与预测性变化 作为项目管理者,协调多个开发团队使用不同的大模型 API 是一项日常工作。过去,每个项目可能使用不同的供应商,账单分散在各个平台,月末汇总成本时总像在拼凑一张…...

如何高效部署RTL8821CU无线网卡驱动:Linux系统完整解决方案

如何高效部署RTL8821CU无线网卡驱动:Linux系统完整解决方案 【免费下载链接】rtl8821CU Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8821CU 在Linux环境中部署Realtek RTL8811CU/RTL8…...

3分钟解决Blender到Unity的FBX旋转难题:终极坐标转换指南

3分钟解决Blender到Unity的FBX旋转难题:终极坐标转换指南 【免费下载链接】blender-to-unity-fbx-exporter FBX exporter addon for Blender compatible with Unitys coordinate and scaling system. 项目地址: https://gitcode.com/gh_mirrors/bl/blender-to-uni…...

如何用Playnite打造你的终极游戏库:统一管理20+平台游戏

如何用Playnite打造你的终极游戏库:统一管理20平台游戏 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: ht…...

Gemini3.1Pro:HR招聘神器,一键生成专业面试题

对 HR 来说,招聘最花时间的,往往不是发职位,而是出题、筛选、追问、比对、整理面试记录。尤其是技术岗、产品岗、运营岗、设计岗这些岗位,面试题如果出得不准,就会出现两个问题:要么问得太浅,看…...

2026年学AI必看:从零到项目实战路线图,小白也能轻松掌握(收藏版)

随着AI技术的快速发展,学习AI已成为大学生的必修课。本文提供了一份从零到项目的完整学习路线图,帮助读者了解2026年学AI的新趋势和实用技能。文章分为六个阶段,包括认知建立、工具上手、编程入门、核心技能、项目实战和持续进阶,…...

如何用Python的SALib库在10分钟内完成模型敏感性分析

如何用Python的SALib库在10分钟内完成模型敏感性分析 【免费下载链接】SALib Sensitivity Analysis Library in Python. Contains Sobol, Morris, FAST, and other methods. 项目地址: https://gitcode.com/gh_mirrors/sa/SALib 你是否曾经面对复杂的数学模型&#xff0…...

大模型应用开发火了?小白程序员如何入行?收藏这份岗位解析与学习指南!

大模型应用开发岗位在招聘市场上需求旺盛,引发广泛关注。本文解析了该岗位的核心内容,指出其与传统开发(C/Java/Go)及算法岗的并列关系而非替代关系。文章详细区分了算法工程师(改模型)、LLM应用工程师&…...

Java老兵转型AI开发:小白必备实战指南,收藏版!

本文为Java程序员提供一份AI开发实战指南,从Java技能的复用到Python学习,再到机器学习、深度学习和大模型API调用,详细阐述了转型AI开发的学习路径和实用技巧。文章强调边做边学,理解核心概念,避免陷入数学难题和过早购…...

BepInEx架构解析:解锁Unity游戏插件开发的无限可能

BepInEx架构解析:解锁Unity游戏插件开发的无限可能 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个专为Unity和.NET游戏设计的现代化插件框架&#xff0c…...

别再乱写版本号了!从Android到华为,聊聊SemVer、VRC那些事儿(附实战避坑指南)

版本号管理的艺术:从SemVer到VRC的工程实践指南 在软件开发的世界里,版本号就像产品的身份证,看似简单的数字组合背后隐藏着团队协作的智慧结晶。我曾见过一个中型SaaS团队因为版本号混乱导致生产环境部署错乱,最终不得不回滚三天…...

奇点大会独家披露:AISMM认证体系背后的NIST AI RMF 2.0对齐矩阵(含5大能力域+17项可量化评估指标)

更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM培训认证 2026奇点智能技术大会(Singularity Intelligence Summit 2026)正式发布全新一代人工智能系统管理与建模(AISMM&…...

手把手教你用devmem2工具直接读写PCIe设备配置空间(附ARM64/X86实战命令)

实战指南:用devmem2工具直接操作PCIe设备配置空间 在嵌入式开发和硬件验证领域,快速访问PCIe设备配置空间是一项基础但关键的技能。当我们需要验证新硬件是否被正确识别,或者调试驱动问题时,往往需要在编写完整内核驱动前先进行一…...

SITS2026正式落地:3大颠覆性变化、5类高危误判场景及2026年合规自检清单(立即下载)

更多请点击: https://intelliparadigm.com 第一章:SITS2026正式落地:AISMM行业基准数据 SITS2026(Software Intelligence Testing Standard 2026)作为首个面向AI系统可信性验证的国家级测试标准,已于2024年…...

构建工业级AI平台的关键技术和难点

构建工业级 AI 平台,本质上是在解决“AI 算法的随机性”与“工业生产的确定性”之间的矛盾。在「资产数字化 → 互联 → 共享 → 共生」框架下,通过系统工程,搭建一个具备“工业龙虾”特质的 AI 仿真环境。一、 关键技术:构建平台…...

对比直接使用厂商 API 与通过 Taotoken 聚合调用的接入复杂度差异

对比直接使用厂商 API 与通过 Taotoken 聚合调用的接入复杂度差异 当开发者需要将大模型能力集成到自己的应用或项目中时,通常会面临一个选择:是直接对接各个模型厂商的原生 API,还是通过一个统一的聚合平台进行接入。本文将从开发者实际操作…...

Obsidian笔记内播放B站视频的终极指南:Media Extended插件完整教程

Obsidian笔记内播放B站视频的终极指南:Media Extended插件完整教程 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 想在Obsidian笔记中无缝观看B站视频吗?Media Extended B站插件就是你的完美解决…...

UniversalSplitScreen技术解析:多输入设备游戏分屏的终极解决方案

UniversalSplitScreen技术解析:多输入设备游戏分屏的终极解决方案 【免费下载链接】UniversalSplitScreen Split screen multiplayer for any game with multiple keyboards, mice and controllers. 项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitS…...

Doramagic:从GitHub仓库提取项目灵魂,让AI助手成为领域专家

1. 项目概述:从代码到灵魂的提取器如果你用过 GitHub Copilot 或者 Claude Code,肯定有过这样的体验:你让 AI 帮你写一个功能,它确实能生成代码,但代码背后的设计哲学、社区里踩过的坑、那些文档里永远不会写的“潜规则…...

终极PS4游戏修改神器:三步上手GoldHEN Cheats Manager完整指南

终极PS4游戏修改神器:三步上手GoldHEN Cheats Manager完整指南 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 你是否曾在PS4游戏中卡关数小时无法前进?是否…...

如何从GoPro视频中提取GPS轨迹数据:终极完整指南

如何从GoPro视频中提取GPS轨迹数据:终极完整指南 【免费下载链接】gopro2gpx Parse the gpmd stream for GOPRO moov track (MP4) and extract the GPS info into a GPX (and kml) file. 项目地址: https://gitcode.com/gh_mirrors/go/gopro2gpx 想要将GoPro…...

BepInEx终极指南:5步打造你的Unity游戏修改神器

BepInEx终极指南:5步打造你的Unity游戏修改神器 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个功能强大的Unity游戏插件框架,它能让你在不修…...

为 Hermes Agent 配置 Taotoken 自定义供应商的详细步骤

为 Hermes Agent 配置 Taotoken 自定义供应商的详细步骤 Hermes Agent 是一个功能强大的 AI 代理开发框架,支持通过自定义供应商接入不同的模型服务。如果你正在使用 Taotoken 平台来统一管理和调用多种大模型,将其配置为 Hermes Agent 的自定义供应商是…...