Linux iio驱动学习
最近在做新项目的充电bringup,kernel 内核版本为5.4版本,使用到的充电电荷泵(charger pump)IC具备采样vbus vbat ibat ibus等功能,以往项目都是通过power_supply架构来实现采集adc数据,但是最新的kernel版本由于GKI的限制vendor无法在自行添加自定义的power_supply,所以需要修改原来项目采集adc数据的方法,所以采用linux正统的iio驱动来实现adc读取的功能,顺便学习梳理了一下iio驱动的使用方法。
iio子系统:Industrial I/O
一般用于具备ADC/DAC的器件提供驱动支持,使用范围比较广泛,比如温湿度传感器、陀螺仪、adc采样等等。软件驱动上提供sysfs(/sys/bus/iio/devices/)和dev(dev/iio:deviceX)节点供上层交互,内核空间提供接口给其他驱动使用。
iio子系统主要代码路径:
include/linux/iio/consumer.h
kernel/msm-4.19/drivers/iio/industrialio-core.c industrialio-buffer.c industrialio-trigger.c …
使用示例:
iio注册三部曲,申请、填充、注册
#include <linux/iio/iio.h>
#include <dt-bindings/iio/qti_power_supply_iio.h>struct charger_pump_iio_channels {const char *datasheet_name;int channel_num;enum iio_chan_type type;long info_mask;
};#define CP_IIO_CHAN(_name, _num, _type, _mask) \{ .datasheet_name = _name, \.channel_num = _num, \.type = _type, \.info_mask = _mask, },#define CP_CHAN_VOLT(_name, _num) \CP_IIO_CHAN(_name, _num, IIO_VOLTAGE, BIT(IIO_CHAN_INFO_PROCESSED))
#define CP_CHAN_CUR(_name, _num) \CP_IIO_CHAN(_name, _num, IIO_CURRENT, BIT(IIO_CHAN_INFO_PROCESSED))
#define SC8551_CHAN_TEMP(_name, _num) \CP_IIO_CHAN(_name, _num, IIO_TEMP, BIT(IIO_CHAN_INFO_PROCESSED))static const struct charger_pump_iio_channels cp_iio_psy_channels[] = {SC8551_CHAN_VOLT("sc_battery_voltage", PSY_IIO_SC_BATTERY_VOLTAGE)SC8551_CHAN_CUR("sc_battery_current", PSY_IIO_SC_BATTERY_CURRENT)SC8551_CHAN_TEMP("sc_battery_temperature", PSY_IIO_SC_BATTERY_TEMPERATURE)......
};
提供读写的实际底层函数接口
static const struct iio_info sc_iio_info = {.read_raw = sc_iio_read_raw,.write_raw = sc_iio_write_raw,.of_xlate = sc_iio_of_xlate,
};struct iio_dev *indio_dev = chip->indio_dev;
struct iio_chan_spec *chan;
int num_iio_channels = ARRAY_SIZE(cp_iio_psy_channels);1.分配内存
chip->iio_chan = devm_kcalloc(chip->dev, num_iio_channels, sizeof(*chip->iio_chan), GFP_KERNEL);
chip->int_iio_chans = devm_kcalloc(chip->dev, num_iio_channels, sizeof(*chip->int_iio_chans),GFP_KERNEL);2.填充
indio_dev->name = "cp-standalone";
indio_dev->info = &sc_iio_info;
indio_dev->channels = chip->iio_chan;
indio_dev->num_channels = num_iio_channels;
for (i = 0; i < num_iio_channels; i++) {chip->int_iio_chans[i].indio_dev = indio_dev;chan = &chip->iio_chan[i];chip->int_iio_chans[i].channel = chan;chan->address = i;chan->channel = sc8551_iio_psy_channels[i].channel_num;chan->type = sc8551_iio_psy_channels[i].type;chan->datasheet_name =sc8551_iio_psy_channels[i].datasheet_name;chan->extend_name =sc8551_iio_psy_channels[i].datasheet_name;chan->info_mask_separate =sc8551_iio_psy_channels[i].info_mask;
}3.注册indio_dev
rc = devm_iio_device_register(chip->dev, indio_dev);
iio使用API:
ret = usbpd_get_iio_channel(pdpm, CP_MASTER, CHARGE_PUMP_SC_BATTERY_VOLTAGE, &val1);
Linux iio驱动学习相关推荐
- STM32MP157驱动开发——Linux IIO驱动(上)
STM32MP157驱动开发--Linux IIO驱动(上 ) 0.前言 一.IIO 子系统简介 1.iio_dev 结构体 2.iio_dev 申请与释放 3.iio_dev 注册与注销 4.iio ...
- linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析
这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...
- Linux SPI驱动学习——调用SPI读写函数
Linux SPI驱动学习--调用SPI读写函数 博客说明 开发环境 1. 基于W25Q16型FLASH来看SPI的读写函数 附录 博客说明 撰写日期 2019.10.25 完稿日期 未完稿 最近维护 ...
- STM32MP157驱动开发——Linux IIO驱动(下)
STM32MP157驱动开发--Linux IIO驱动(下) 0.前言 一.IIO 触发缓冲区 1.IIO 触发器 2.申请触发器 3.释放触发器 4.注册触发器 5.注销触发器 6. IIO 缓冲区 ...
- Linux IIO驱动
工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC.而且随着手机.物联网.工业物联网和可穿戴设备的爆发,传感器的需求只持续增强.比如手机或者手环里面的加速度计.光传感 ...
- linux设备驱动学习,linux设备驱动学习4
Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek] 今天进入<Linux设备驱动程序(第3版)>第六章高级字符驱动程序操作的学习. 一.io ...
- 嵌入式linux IIO驱动
IIO子系统简介 我们一般搜索IIO子系统,就会发现大多数讲的都是ADC,这是因为IIO就是为ADC类传感器准备的,当然了DAC也是可以的,我们常用的陀螺仪,加速度计,电压/电流测量芯片等内部都是有个 ...
- Linux IIO 驱动
工业场合里面也有大量的模拟量和数字量之间的转换,也就是 ADC 和 DAC. 手机或者手环里面的加速度计.光传感器.陀螺仪.气压计.磁力计等,这些传感器本质上都是ADC,大家注意查看这些传感器的手册, ...
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...
最新文章
- linux locale文件,Linux 怎样修改locale语言设置
- 解析json获取天气信息(中央气象台)
- decimal是( )数据类型_SQL 通用数据类型
- linux日常管理3
- 指数型生成函数[bzoj3456]城市规划
- Python刷csdn访问量
- 718. 最长重复子数组(JavaScript)
- rabbitmq消费者获取消息慢_RabbitMQ:快速生产者和慢速消费者
- 【Spring第二篇】IOC:控制反转
- 电气技术应用和计算机应用,电气技术应用专业介绍 ppt课件.ppt
- ubuntu镜像源的配置
- am解调matlab程序,AM调制解调的matlab仿真
- matlab进行预测误差过大,神经网络预测误差太大怎么办,如何看预测结果
- 十大api接口平台(接口商)
- 今日头条视频如何收益
- mysql数据库清空表格中数据恢复
- 14岁萝莉自学编程独立开发游戏
- 批量探测主机是否存活
- 第48章 MDK的编译过程及文件类型全解
- nc文件利器,NASA的panoply软件,适于看nc文件内容以及简单的绘图
热门文章
- MAC电脑DNS劫持解决方法
- 机器学习之深度学习 二分类、多分类、多标签分类、多任务分类
- u盘中毒文件为html文档,u盘中毒文件被隐藏怎么办【解决方法】
- 操作系统--多线程进阶(上)
- 瘦,是一种信仰。轻,是一种理想
- PMP/CAPM/PgMP/ACP考试报名资格
- Hanoi Tower Troubles Again! ZOJ - 1239
- c语言调用win10麦克风,Win10系统麦克风如何开启?Win10系统开启麦克风的方法
- Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)
- day08---(05)课程大纲-章节和小节列表功能(接口)