【device_create_file 创建sysfs 属性文件一些笔记】
文章目录代码引入1. 定义属性结构体2. 在 probe 中创建属性文件3. 在 remove 中清理属性添加sysfs套路解读1、属性定义2、注册属性3、文件操作绑定4、回调到具体函数_show / _store函数宏展开原理为什么不直接使用函数名在 Linux 内核中通过 device_create_file 创建的 sysfs 属性文件其读写操作最终会回调到我们提供的 show 和 store 函数这是由 sysfs 框架和 VFS虚拟文件系统 共同实现的。以下是简要的原理说明代码引入这段代码截取自是充电ic芯片圣邦微sgm41513驱动。我将HIZ 模式寄存器的读写暴露在了sys/class/power_supply节点下。以下是代码片段1. 定义属性结构体在 sgm415xx.c 中添加一个 struct device_attribute 和一个对应的 show / store 函数。staticssize_thiz_enable_show(structdevice*dev,structdevice_attribute*attr,char*buf){structsgm4154x_device*sgmdev_get_drvdata(dev-parent);// 注意dev 是 power_supply 设备它的 parent 是 i2c 设备其 drvdata 指向 sgmbool en;intret;if(!sgm||!sgm-chg_dev)return-EINVAL;retsgm4154x_is_enable_hiz(sgm-chg_dev,en);if(ret)returnret;returnscnprintf(buf,PAGE_SIZE,%d\n,en?1:0);}staticssize_thiz_enable_store(structdevice*dev,structdevice_attribute*attr,constchar*buf,size_tcount){structsgm4154x_device*sgmdev_get_drvdata(dev-parent);bool en;intret;if(!sgm||!sgm-chg_dev)return-EINVAL;retkstrtobool(buf,en);if(ret)returnret;retsgm4154x_set_hiz_en(sgm-chg_dev,en);if(ret)returnret;returncount;}staticDEVICE_ATTR_RW(hiz_enable);注意dev_get_drvdata(dev-parent) 是因为 dev 是 power_supply 设备它的 parent 指向 i2c 设备而 i2c 设备的 drvdata 正是 sgm 结构体。2. 在 probe 中创建属性文件在 sgm4154x_driver_probe 函数中当 power_supply 注册成功后调用 device_create_file 创建属性。staticintsgm4154x_driver_probe(structi2c_client*client){// ... 现有代码 ...retsgm4154x_power_supply_init(sgm,dev);if(ret){pr_err(Failed to register power supply\n);returnret;}// 创建 hiz_enable 属性retdevice_create_file(sgm-charger-dev,dev_attr_hiz_enable);if(ret)dev_warn(dev,Failed to create hiz_enable sysfs file\n);// ... 后续代码 ...}3. 在 remove 中清理属性在 sgm4154x_charger_remove 中删除该属性文件。staticvoidsgm4154x_charger_remove(structi2c_client*client){structsgm4154x_device*sgmi2c_get_clientdata(client);device_remove_file(sgm-charger-dev,dev_attr_hiz_enable);// ... 其他清理 ...}添加sysfs套路解读1、属性定义#defineDEVICE_ATTR_RW(_name)\structdevice_attributedev_attr_##_name__ATTR_RW(_name)使用 DEVICE_ATTR_RW(hiz_enable) 宏会生成一个 struct device_attribute 类型的变量 dev_attr_hiz_enable其中包含两个函数指针structdevice_attribute{structattributeattr;ssize_t(*show)(structdevice*dev,structdevice_attribute*attr,char*buf);ssize_t(*store)(structdevice*dev,structdevice_attribute*attr,constchar*buf,size_tcount);};hiz_enable_show 和 hiz_enable_store 函数地址被赋值给这两个指针。2、注册属性device_create_file(sgm-charger-dev, dev_attr_hiz_enable) 将该属性关联到具体设备sgm-charger-dev。内核会在 sysfs 中创建对应的文件节点并记录该文件对应的 device_attribute 结构。3、文件操作绑定sysfs 文件系统为所有属性文件提供了统一的 file_operations如 sysfs_file_operations其中包含 .read sysfs_read_file 和 .write sysfs_write_file 等回调。当用户进程读写该文件时VFS 会调用这些统一的函数。4、回调到具体函数统一的读写函数内部会根据文件的 inode 找到关联的 device_attribute 结构然后调用其 show 或 store 方法。例如读操作最终会调用 hiz_enable_show传入对应的 dev 和 attr 参数。写操作最终会调用 hiz_enable_store。因此当您在用户空间执行 echo 1 /sys/class/power_supply/sgm4154x-charger/hiz_enable 时内核会自动将写入操作路由到您实现的 hiz_enable_store 函数中完成对 HIZ 模式的设置。_show / _store函数宏展开原理hiz_enable_show 和 hiz_enable_store 之所以与属性文件自动关联并不是因为文件名本身而是因为 DEVICE_ATTR_RW 宏的展开规则强制要求函数名与宏参数一致。#defineDEVICE_ATTR_RW(_name)\structdevice_attributedev_attr_##_name__ATTR_RW(_name)#define__ATTR_RW(_name)__ATTR(_name,0644,_name##_show,_name##_store)#define__ATTR(_name,_mode,_show,_store){\.attr{.name__stringify(_name),.mode_mode},\.show_show,\.store_store,\}DEVICE_ATTR_RW(hiz_enable) 展开后生成一个名为 dev_attr_hiz_enable 的 struct device_attribute 变量。该变量的 .show 成员被赋值为 hiz_enable_show.store 成员被赋值为 hiz_enable_store。如果这两个函数不存在编译会报错为什么不直接使用函数名宏通过字符串拼接##将传入的 _name 与 _show / _store 拼接成函数名这是一种编译时的命名约定目的是让开发者只需关心属性名称而无需显式填写函数指针。这种方式在内核的 DEVICE_ATTR 系列宏中广泛使用。

相关新闻

AIGC开源推荐-企业内部agent框架-Goose

AIGC开源推荐-企业内部agent框架-Goose

一、执行摘要 Goose 是由 Block 发布的开源、可扩展的「工程/企业向 AI agent 平台」,侧重把企业既有工具(通过 MCP 扩展)与本地执行能力结合,解决工具碎片化、隐私合规、多 agent 编排与工程效率提升等问题。该报告整合了源码架…

2026/7/3 12:17:17 阅读更多 →
行业首个信创本跑通OpenClaw:联想开天重新定义国产算力天花板

行业首个信创本跑通OpenClaw:联想开天重新定义国产算力天花板

春节期间,OpenClaw可以说是横空出世,彻底颠覆了人们对于传统AI助手的认知。OpenClaw不是“神”,但这类AI智能体的出现,必将为自动化办公带来巨大改变和提升。但同时,一个非常棘手问题摆在中国政企客户面前:…

2026/7/5 21:40:12 阅读更多 →
ssm+java2026年毕设青年旅舍管理系统【源码+论文】

ssm+java2026年毕设青年旅舍管理系统【源码+论文】

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于酒店信息化管理问题的研究,现有研究主要以大型连锁酒店管理系统或通用预订平台为主,专门针对中小型…

2026/7/6 10:23:18 阅读更多 →

最新新闻

ChanlunX缠论分析插件:从手工绘图到算法识别的技术跃迁

ChanlunX缠论分析插件:从手工绘图到算法识别的技术跃迁

ChanlunX缠论分析插件:从手工绘图到算法识别的技术跃迁 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经花费数小时在K线图上手动绘制缠论结构,却依然无法确定自己的分析…

2026/7/7 8:36:18 阅读更多 →
练拳击之后,我发现“代码耦合”和“动作僵硬”是同一件事

练拳击之后,我发现“代码耦合”和“动作僵硬”是同一件事

在杭州练拳击大半年了。我是程序员,最近发现一件事——代码里的高耦合和拳击里的动作僵硬,是同一回事。高耦合是怎么发生的?模块之间依赖太紧密,改一个地方要牵连好几个地方。代码写死了,动不了。动作僵硬是怎么发生的…

2026/7/7 8:36:18 阅读更多 →
LinuxCNC终极指南:3步搭建你的开源数控系统,从零到加工只需30分钟!

LinuxCNC终极指南:3步搭建你的开源数控系统,从零到加工只需30分钟!

LinuxCNC终极指南:3步搭建你的开源数控系统,从零到加工只需30分钟! 【免费下载链接】linuxcnc LinuxCNC controls CNC machines. It can drive milling machines, lathes, 3d printers, laser cutters, plasma cutters, robot arms, hexapods…

2026/7/7 8:34:17 阅读更多 →
用AI轻松搞定PRD!小白程序员必备的文档神器,收藏学习更高效!

用AI轻松搞定PRD!小白程序员必备的文档神器,收藏学习更高效!

本文介绍了如何利用AI工具优化PRD文档编写流程,通过需求分析、AI生成结构、补充流程规则异常、定稿等步骤,让AI成为文档助手,提升效率。同时强调AI不能替代产品经理的判断,最终PRD质量仍需产品经理负责。AI时代的产品经理应学会用…

2026/7/7 8:34:17 阅读更多 →
vLLM与SGLang推理框架性能横评的技术文章大纲

vLLM与SGLang推理框架性能横评的技术文章大纲

引言 背景介绍:大模型推理框架的重要性及当前技术挑战vLLM与SGLang的定位与核心目标性能横评的意义:帮助开发者选择适合的推理框架 vLLM框架概述 核心特性:PagedAttention、高吞吐量设计、内存优化适用场景:批量推理、长文本生成、…

2026/7/7 8:32:17 阅读更多 →
专业级开源卡拉OK唱歌游戏UltraStar Deluxe快速上手指南:打造家庭KTV的完整实战教程 [特殊字符]

专业级开源卡拉OK唱歌游戏UltraStar Deluxe快速上手指南:打造家庭KTV的完整实战教程 [特殊字符]

专业级开源卡拉OK唱歌游戏UltraStar Deluxe快速上手指南:打造家庭KTV的完整实战教程 🎤 【免费下载链接】USDX The free and open source karaoke singing game UltraStar Deluxe, inspired by Sony SingStar™ 项目地址: https://gitcode.com/gh_mirr…

2026/7/7 8:28:16 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻