Linux IIO子系统
因实际项目资料涉密在此将项目中Linux common的部分和学习心得总结于此以备时习之。部分示例代码为脱敏经过删减和简化处理仅供参考请见谅参考图来源于网络侵删。keywordIIO、Industrial I/O、ADC、DAC一.background工业及消费电子手机、物联网、可穿戴设备中大量使用ADC将模拟物理量转为数字量。加速度计、光传感器、陀螺仪、气压计、磁力计等许多传感器内部均集成ADC并通过IIC/SPI接口对外提供数据。同时某些SoC也提供on chip的ADC pin。为统一管理这类ADC传感器Linux内核推出了IIO子系统开发者需基于IIO子系统编写驱动。二.简介IIOIndustrial I/O工业输入输出是Linux内核中专用于管理模数转换器ADC和数模转换器DAC类设备的子系统。它于2009年由Jonathan Cameron加入Linux内核旨在为各类传感器和数据转换设备提供统一的驱动框架。当你使用的传感器本质是 ADC 或 DAC 器件时可以优先考虑使用 IIO 驱动框架。1.iio_dev 结构体IIO 子系统使用结构体 iio_dev 来描述一个具体 IIO 设备此设备结构体定义在include/linux/iio/iio.h 文件中使用IIO子系统的外设需要根据该结构体的成员进行注册。struct iio_dev { int modes; /* 设备支持的工作模式 */ int currentmode; /* 当前使用的工作模式 */ struct device dev; /* Linux 设备对象 */ struct iio_buffer *buffer; /* 数据缓冲区 */ int scan_bytes; /* 单次采集的总字节数 */ const unsigned long *available_scan_masks; /* 允许的通道组合掩码列表 */ const unsigned long *active_scan_mask; /* 当前启用的通道掩码 */ bool scan_timestamp; /* 是否在数据包末尾附加时间戳 */ struct iio_trigger *trig; /* 当前绑定的触发器 */ struct iio_poll_func *pollfunc; /* 触发信号到来时的回调函数 */ struct iio_chan_spec const *channels; /* 通道配置数组 */ int num_channels; /* 通道总数 */ const char *name; /* 设备名称用户空间可见 */ const struct iio_info *info; /* 驱动功能回调函数集 */ const struct iio_buffer_setup_ops *setup_ops; /* 缓冲启用/禁用钩子 */ struct cdev chrdev; /* 字符设备 */ };2.iio_dev 申请与释放在使用之前要先申请 iio_dev申请函数为 iio_device_alloc函数原型如下struct iio_dev *iio_device_alloc(int sizeof_priv)sizeof_priv私有数据内存空间大小一般我们会将自己定义的设备结构体变量作为 iio_dev 的私有数据这样可以直接通过 iio_device_alloc 函数同时完成 iio_dev 和设备结构体变量的内存申请。申请成功以后使用 iio_priv 函数来得到自定义的设备结构体变量首地址。原生IIO使用的是iio_device_alloc这种方式方式分配的设备对象需要手动释放调用iio_device_free()通常在驱动remove或probe出错时进行释放。我们也可以使用devmdevice managed机制设备驱动无需手动释放资源会在设备销毁时自动清理可有效防止内存泄漏。struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv);此函数采用“一次分配两块空间”的设计在连续的内存中同时分配了struct iio_dev 和驱动私有数据private data的空间这种设计能提升 CPU 缓存的利用率。返回值如果申请成功就返回一个指向已分配 iio_dev结构体的指针如果失败就返回 NULL。3.iio_info在 iio_dev 结构体中有一个关键成员指针 info它指向 iio_info 结构体。iio_info 是 IIO 驱动开发中需要重点实现的部分因为它定义了设备的具体操作接口。用户空间发起的各种访问请求最终都会通过 VFS 层回调到 iio_info 所注册的函数中从而实现对硬件设备的控制与数据采集。iio_info 结构体的定义位于内核源码 include/linux/iio/iio.h中。struct iio_info { struct module *driver_module; const struct attribute_group *attrs; const struct attribute_group *event_attrs; int (*read_raw)(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask); int (*write_raw)(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask); int (*write_raw_get_fmt)(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, long mask); int (*read_event_config)(struct iio_dev *indio_dev, u64 event_code); int (*write_event_config)(struct iio_dev *indio_dev, u64 event_code, int state); int (*read_event_value)(struct iio_dev *indio_dev, u64 event_code, int *val); int (*write_event_value)(struct iio_dev *indio_dev, u64 event_code, int val); int (*validate_trigger)(struct iio_dev *indio_dev, struct iio_trigger *trig); int (*update_scan_mode)(struct iio_dev *indio_dev, const unsigned long *scan_mask); int (*debugfs_reg_access)(struct iio_dev *indio_dev, unsigned reg, unsigned writeval, unsigned *readval); int (*fwnode_xlate)(struct iio_dev *indio_dev, const struct fwnode_reference_args *args); int (*hwfifo_set_watermark)(struct iio_dev *indio_dev, unsigned int val); };4.iio_chan_specIIO 子系统的核心抽象是**通道**它代表传感器设备的一个独立数据采集维度。一个物理传感器可能包含多个功能单元产生多路相互独立但有内在关联的数据。例如- 三轴加速度计包含 X、Y、Z 三个通道- 8 通道 ADC 芯片提供 8 个模拟输入通道- 温湿度传感器通常包含温度temperature和湿度humidity两个通道。在 Linux 内核中每个通道由 struct iio_chan_spec 结构体描述。该结构体定义了通道的类型、编号、数据类型、是否可读写以及数值转换关系等关键属性。其定义位于内核源码 include/linux/iio/iio.h 文件中。驱动开发者在实现 IIO 驱动时需要为设备的所有通道构造一个 iio_chan_spec 数组并将其赋值给 iio_dev 结构体的 channels 成员同时通过 num_channels 指定通道数量。内核和用户空间将依据这些通道定义来解析、展示和访问多路传感器数据。三.IIO framework (platform)IIO 框架主要用于 ADC 类的传感器比如陀螺仪、加速度计、磁力计、光强度计等这些传感器基本都是 IIC 或者 SPI 接口的。因此IIO 驱动的基础框架就是 IIC 或者 SPI我们可以在 IIC 或 SPI 驱动里面在加上 regmap。当然了有些 SOC 内部的 ADC 也会使用 IIO 框架那么这个时候驱动的基础框架就是 platfrom为使用dev-bus-drv模型MTK的某些STB SoC就是如此。​1.iio_dev 结构体/* 自定义设备结构体 */ struct xxx_dev { struct device *dev; struct iio_dev *indio_dev; void __iomem *xxx int irq; ... };2.通道数组static const struct iio_chan_spec xxx_channels[] { };3.读函数当读取 sysfs 中的文件的时候最终此函数会执行此函数里面会从传感器里面读取各种数据然后上传给应用。static int xxx_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { return 0; }4.写函数static int xxx_write_raw_get_fmt(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, long mask) { return 0; }5.iio_info 结构体变量static const struct iio_info xxx_info { .read_raw xxx_read_raw, .write_raw xxx_write_raw, .write_raw_get_fmt xxx_write_raw_get_fmt, .write_event_value xxx_write_event_value, .read_event_value xxx_read_event_value, .write_event_config xxx_write_event_config, .read_event_config xxx_read_event_config, };6.driver probe func按需实现在dev与drv match成功后调用static int xxx_probe(struct platform_device *pdev) { }7.driver remove func按需实现在设备卸载时调用static int xxx_remove(struct platform_device *pdev) { }

相关新闻

ROS机器人自主导航实战:从定位、建图到路径规划全链路解析

ROS机器人自主导航实战:从定位、建图到路径规划全链路解析

在实际机器人开发中,自主导航是衡量一个机器人系统是否“智能”的核心能力。它要求机器人能够回答“我在哪?”(定位)、“周围环境什么样?”(建图)以及“我该怎么去那里?”&#xff0…

2026/8/22 12:43:19 阅读更多 →
《我的世界》多人跑酷地图【跑酷惊魂+】核心玩法与部署指南

《我的世界》多人跑酷地图【跑酷惊魂+】核心玩法与部署指南

这次我们来看一个《我的世界》(Minecraft)社区地图项目:【跑酷惊魂】。这不是一个模组或插件,而是一张精心设计的多人小游戏地图,核心玩法是“随机生成的跑酷大比拼”。对于喜欢在《我的世界》里和朋友联机、寻求快节奏…

2026/8/22 12:50:17 阅读更多 →
低压电工-直接接触电击防护

低压电工-直接接触电击防护

安全生产总方针:安全第一、预防为主,电工学习核心思路:优先预防触电事故,而非出事再急救,所有防护措施都是围绕 “提前杜绝触电” 设计。触电核心分类一、直接接触电击 三大核心防护手段口诀:绝缘、屏护、间…

2026/8/22 12:29:45 阅读更多 →

最新新闻

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印

免费批量下载B站视频的完整指南:downkyi搞定8K、HDR与去水印 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…

2026/8/22 20:01:56 阅读更多 →
2026招聘平台效果实测与选择策略

2026招聘平台效果实测与选择策略

1. 招聘平台现状与核心痛点解析2026年的招聘市场已经形成了明显的垂直细分格局,不同行业、不同职级、不同求职场景下的平台选择差异显著。作为从业12年的人力资源顾问,我经手过237家企业招聘案例,实测发现:平台效果与行业匹配度的…

2026/8/22 20:01:56 阅读更多 →
智能简历筛选系统:原理、技术与应用实践

智能简历筛选系统:原理、技术与应用实践

1. 简历机筛流程的核心价值解析 在招聘旺季,HR部门每天需要处理数百份甚至上千份简历的场景已经成为常态。以赛力斯这样的头部企业为例,单次校招季收到的简历数量往往突破五位数。传统人工筛选方式不仅效率低下,还存在主观性强、标准不统一等…

2026/8/22 20:01:56 阅读更多 →
数学建模竞赛实战:从全球变暖数据到量化分析模型

数学建模竞赛实战:从全球变暖数据到量化分析模型

1. 从“全球变暖?”这个问号说起:一次竞赛题的深度拆解看到“全球变暖?”这个标题,后面跟着一个问号,很多人的第一反应可能是:这不是一个早已有定论的科学问题吗?怎么还成了研究生数学建模竞赛的…

2026/8/22 20:01:56 阅读更多 →
AI求职助手Career-Ops:简历优化与面试模拟全解析

AI求职助手Career-Ops:简历优化与面试模拟全解析

1. 项目概述Career-Ops是一个专为求职场景设计的智能辅助系统。它通过AI技术模拟人力资源专家的思维模式和工作流程,为求职者提供从简历优化到面试准备的全流程支持。不同于通用型求职工具,这个系统最大的特点是能够深度理解不同行业、岗位的差异化需求&…

2026/8/22 20:01:56 阅读更多 →
Python+Neo4j零基础构建知识图谱:从文本到关系网络的实战指南

Python+Neo4j零基础构建知识图谱:从文本到关系网络的实战指南

1. 先搞清楚知识图谱到底能帮你解决什么问题如果你经常听到“知识图谱”、“RAG”、“AI Agent”这些词,但感觉它们离实际开发很远,那这篇文章就是为你准备的。知识图谱不是只能用在搜索引擎或者大厂推荐系统里,它最直接的价值是把一堆零散、…

2026/8/22 20:00:56 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →