• Linux设备驱动之IIO子系统——IIO框架数据读取


    IIO DATA ACCESS IIO数据获取

      只有两种方法可以使用IIO框架访问数据; 通过sysf通道进行一次性捕获,或通过IIO字符设备进行连续模式(触发缓冲)。

    One-shot capture:单次获取

      一次性数据捕获通过sysfs接口完成。 通过读取与通道对应的sysfs条目,您将仅捕获特定于该通道的数据。 给定一个带有两个通道的温度传感器:一个用于环境温度,另一个用于热电偶温度:

    # cd /sys/bus/iio/devices/iio:device0
    # cat in_voltage3_raw
    6646
    # cat in_voltage_scale
    0.305175781

      通过将比例乘以原始值来获得处理值。

      Voltage value: 6646 * 0.305175781 = 2028.19824053

      器件数据表说过程值以mV给出。 在我们的例子中,它对应于2.02819V。

    Buffer data access:缓冲区数据获取

      要使触发的采集工作,必须在驱动程序中实现触发器支持。 然后,要从用户空间内获取数据,必须:创建触发器,分配它,启用ADC通道,设置缓冲区的维度,并启用它。这里主要介绍两种:sysfs触发器和hrtimer触发器。

    使用sysfs触发器获取:

      使用sysfs触发器捕获数据包括发送一组命令少量sysfs文件。 让我们列举一下我们应该做些什么来实现这一目标:

    1. 创建触发器:在将触发器分配给任何设备之前,应该创建它:

    # echo 0 > /sys/devices/iio_sysfs_trigger/add_trigger

    这里,0对应于我们需要分配给触发器的索引。 在此命令之后,触发器目录将在/ sys / bus / iio / devices /下作为trigger0。

    2. 将触发器分配给设备:触发器由其名称唯一标识,我们可以使用该触发器将设备绑定到触发器。 由于我们使用0作为索引,因此触发器将命名为sysfstrig0:

    # echo sysfstrig0 > /sys/bus/iio/devices/iio:device0/trigger/current_t

      我们也可以使用下面这个命令:cat /sys/bus/iio/devices/trigger0/name> /sys/bus/iio/devices/iio:device0/trigger/current_trigger. 也就是说,如果我们编写的值与现有的触发器名称不对应,则不会发生任何事情。 为了确保我们真正定义了一个触发器,我们可以使用cat/sys/bus/iio/devices/iio:device0/trigger/current_trigger.

    3. 启用扫描元素:此步骤包括选择将其数据值推入缓冲区的通道。 应该注意驱动程序中的available_scan_masks:

    # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage5_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage6_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage7_en

    4. 设置缓冲区大小:这里应该设置缓冲区可以保存的样本集数量:

    # echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length

    5. 启用缓冲区:此步骤包括将缓冲区标记为准备接收推送数据:

    # echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable

    要停止捕获,我们必须在同一个文件中写入0。

    6.使能触发器:启动采集:

    # echo 1 > /sys/bus/iio/devices/trigger0/trigger_now

    现在数据获取已经完成,下一步我们可以

    7. 禁用缓冲区:

    # echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable

    8.分离触发器Detach the trigger:

      # echo "" > /sys/bus/iio/devices/iio:device0/trigger/current_trigger

    9.转储IIO字符设备的内容

      # cat /dev/iio:device0 | xxd –

    使用hrtimer触发器获取(4.5及以上内核版本)

      以下是允许使用hrtimer触发器捕获数据的命令集:

    # echo /sys/kernel/config/iio/triggers/hrtimer/trigger0
     # echo 50 > /sys/bus/iio/devices/trigger0/sampling_frequency
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage5_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage6_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage7_en
     # echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
     # cat /dev/iio:device0 | xxd -
    
     0000000: 0188 1a30 0000 0000 8312 68a8 c24f 5a14 ...0......h..OZ.
      0000010: 0188 1a30 0000 0000 192d 98a9 c24f 5a14 ...0.....-...OZ.
      [...]

    然后,我们查看类型以确定如何处理数据:

    $ cat /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage_type
    
    be:s14/16>>2

    Voltage processing: 0x188 >> 2 = 98 * 250 = 24500 = 24.5 v

    IIO tools

      您可以使用一些有用的工具来简化和加快使用IIO设备开发应用程序的速度。 它们在内核树中的tools / iio中可用:

    • lsiio.c:枚举IIO触发器,设备和通道
    • iio_event_monitor.c: 监视IIO设备的IIO事件的ioctl接口
    • generic_buffer.c: 检索,处理和打印从IIO设备缓冲区接收的数据
    • libiio: 一个功能强大的库,由模拟设备开发,用于接口IIO设备,可从https://github.com/analogdevicesinc/libiio获得。
  • 相关阅读:
    解决:Android 8.0检测不到当前的activity
    flask学习(十三):过滤器
    打开相册上传图片
    完整的项目
    解决ScrollView滑动RecyclerView的卡顿
    RxJava
    CoordinatorLayout
    NestedScrollView,RecyclerView
    ViewPageIndicator
    RxJava的实现原理
  • 原文地址:https://www.cnblogs.com/yongleili717/p/10776156.html
Copyright © 2020-2023  润新知