最近在做新项目的充电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驱动学习相关推荐

  1. STM32MP157驱动开发——Linux IIO驱动(上)

    STM32MP157驱动开发--Linux IIO驱动(上 ) 0.前言 一.IIO 子系统简介 1.iio_dev 结构体 2.iio_dev 申请与释放 3.iio_dev 注册与注销 4.iio ...

  2. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  3. Linux SPI驱动学习——调用SPI读写函数

    Linux SPI驱动学习--调用SPI读写函数 博客说明 开发环境 1. 基于W25Q16型FLASH来看SPI的读写函数 附录 博客说明 撰写日期 2019.10.25 完稿日期 未完稿 最近维护 ...

  4. STM32MP157驱动开发——Linux IIO驱动(下)

    STM32MP157驱动开发--Linux IIO驱动(下) 0.前言 一.IIO 触发缓冲区 1.IIO 触发器 2.申请触发器 3.释放触发器 4.注册触发器 5.注销触发器 6. IIO 缓冲区 ...

  5. Linux IIO驱动

    工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC.而且随着手机.物联网.工业物联网和可穿戴设备的爆发,传感器的需求只持续增强.比如手机或者手环里面的加速度计.光传感 ...

  6. linux设备驱动学习,linux设备驱动学习4

    Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek] 今天进入<Linux设备驱动程序(第3版)>第六章高级字符驱动程序操作的学习. 一.io ...

  7. 嵌入式linux IIO驱动

    IIO子系统简介 我们一般搜索IIO子系统,就会发现大多数讲的都是ADC,这是因为IIO就是为ADC类传感器准备的,当然了DAC也是可以的,我们常用的陀螺仪,加速度计,电压/电流测量芯片等内部都是有个 ...

  8. Linux IIO 驱动

    工业场合里面也有大量的模拟量和数字量之间的转换,也就是 ADC 和 DAC. 手机或者手环里面的加速度计.光传感器.陀螺仪.气压计.磁力计等,这些传感器本质上都是ADC,大家注意查看这些传感器的手册, ...

  9. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

    在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

最新文章

  1. linux locale文件,Linux 怎样修改locale语言设置
  2. 解析json获取天气信息(中央气象台)
  3. decimal是( )数据类型_SQL 通用数据类型
  4. linux日常管理3
  5. 指数型生成函数[bzoj3456]城市规划
  6. Python刷csdn访问量
  7. 718. 最长重复子数组(JavaScript)
  8. rabbitmq消费者获取消息慢_RabbitMQ:快速生产者和慢速消费者
  9. 【Spring第二篇】IOC:控制反转
  10. 电气技术应用和计算机应用,电气技术应用专业介绍 ppt课件.ppt
  11. ubuntu镜像源的配置
  12. am解调matlab程序,AM调制解调的matlab仿真
  13. matlab进行预测误差过大,神经网络预测误差太大怎么办,如何看预测结果
  14. 十大api接口平台(接口商)
  15. 今日头条视频如何收益
  16. mysql数据库清空表格中数据恢复
  17. 14岁萝莉自学编程独立开发游戏
  18. 批量探测主机是否存活
  19. 第48章 MDK的编译过程及文件类型全解
  20. nc文件利器,NASA的panoply软件,适于看nc文件内容以及简单的绘图

热门文章

  1. MAC电脑DNS劫持解决方法
  2. 机器学习之深度学习 二分类、多分类、多标签分类、多任务分类
  3. u盘中毒文件为html文档,u盘中毒文件被隐藏怎么办【解决方法】
  4. 操作系统--多线程进阶(上)
  5. 瘦,是一种信仰。轻,是一种理想
  6. PMP/CAPM/PgMP/ACP考试报名资格
  7. Hanoi Tower Troubles Again! ZOJ - 1239
  8. c语言调用win10麦克风,Win10系统麦克风如何开启?Win10系统开启麦克风的方法
  9. Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)
  10. day08---(05)课程大纲-章节和小节列表功能(接口)