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

【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*sgm=dev_get_drvdata(dev->parent);// 注意:dev 是 power_supply 设备,它的 parent 是 i2c 设备,其 drvdata 指向 sgmbool en;intret;if(!sgm||!sgm->chg_dev)return-EINVAL;ret=sgm4154x_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*sgm=dev_get_drvdata(dev->parent);bool en;intret;if(!sgm||!sgm->chg_dev)return-EINVAL;ret=kstrtobool(buf,&en);if(ret)returnret;ret=sgm4154x_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){// ... 现有代码 ...ret=sgm4154x_power_supply_init(sgm,dev);if(ret){pr_err("Failed to register power supply\n");returnret;}// 创建 hiz_enable 属性ret=device_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*sgm=i2c_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 系列宏中广泛使用。

http://www.jsqmd.com/news/436427/

相关文章:

  • t.1.1 关于第一次例会讨论内容的思考
  • MySQL如何用最少的磁盘读取次数,在 B+ 树的叶子节点中定位到这些数据的庖丁解牛
  • 2026年口碑好的提花天鹅绒 品牌推荐:化纤类天鹅绒生产商哪家强 - 行业平台推荐
  • MySQL在 B+ 树架构中,每一次磁盘读取(Page Read)都意味着毫秒级的延迟。
  • 2026年热门的瓷砖胶 厂家推荐:地面瓷砖胶/厨房瓷砖胶/墙面瓷砖胶推荐TOP生产厂家 - 行业平台推荐
  • 计算机的时间尺度的庖丁解牛
  • python 获取音频采样率
  • 语音回答断句
  • BEM 命名法的庖丁解牛
  • deque容器——双端队列
  • 第3章 Windows运行机理-3.5 PE结构分析(2)
  • 2026年质量好的神州飞碟游乐设施 厂家推荐:旋风骑士游乐设施/旋转的士高游乐设施/家庭过山车游乐设施生产厂家推荐几家 - 行业平台推荐
  • 2026年中山空气干燥机厂家推荐:冷冻式、风冷高温冷冻式、吸附式、微气耗鼓风热再生、零气耗鼓风热再生、微气耗压缩热再生、零气耗压缩热再生吸附式干燥机 - 海棠依旧大
  • 第3章 Windows运行机理-3.5 PE结构分析(3)
  • 2026年比较好的铝型材深加工 工厂推荐:工业铝型材深加工生产商哪家强 - 行业平台推荐
  • 一文深入了解深拷贝 和 浅拷贝
  • 2026年知名的反弹缓冲隐藏轨 工厂推荐:三节缓冲隐藏轨/抽屉缓冲隐藏轨/定制缓冲隐藏轨实力厂家如何选 - 行业平台推荐
  • MySQL范围查询的“截断”效应的庖丁解牛
  • 【人工智能】一文看懂SecondMe协议(SMP):你的AI数字分身“代言人”
  • 2026年比较好的白刚玉砂 品牌推荐:白刚玉磨料/白刚玉微粉/白刚玉颗粒正规生产厂家推荐 - 行业平台推荐
  • CSS 规则的庖丁解牛
  • phpstorm 设置 vmoptions后生成的在什么具体位置
  • HRP体系与独立成本核算管理系统应用价值分析 - 业财科技
  • 阶跃星辰深度开源,Agent 模型潜力几何?
  • 微服务开发面试题标准答案+速记要点
  • MyBatis-Plus 批量操作 SQL 日志不打印问题解决方案
  • 2026年口碑好的水环真空机组 厂家推荐:长吊引水真空机组值得信赖的生产厂家 - 行业平台推荐
  • 多模态大模型对齐实战教程(非常硬核),数据有限也能搞定,收藏这一篇就够了!
  • 2026年热门的EVA TAIC交联剂 品牌推荐:粉末TAIC交联剂/50粉末TAIC交联剂品牌厂家哪家靠谱 - 行业平台推荐
  • Node 快捷方式路径怎么获取