新的内核将ADC/DAC/G_sensor这样的设备统一成IIO子系统,用户层通过访问IIO的接口来实现如ADC的触发、采样等操作。
下面给出IIO接口用户层的接口使用实例(以ADC的采样为例)
1. 方法一:直接读取/sys下的接口
以下方式使用软件写入start的方式,每次触发一次采样
$cat /sys/bus/iio/devices/iio:device0/in_voltagex_raw
这里的x代码不同的通道
获取scale:
$cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale
实际的电压值 = in_voltagex_raw * scale
2. 方法二:通过ADC外部硬件trigger自动读取
这种方式下,每次ADC的触发都需要ADC的trg引脚的电平变化进行
//使能采样通道
$echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
$cat trigger0/name
//这里读取trigger的名字,作为下一步的输入,名字不匹配将导致cerrent_trigger激活失败
$ echo fc030000.adc-dev0-external_rising > /sys/bus/iio/devices/iio:device0/trigger/current_trigger
$ echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length
$ echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
$cat /dev/iio:device0 > /var/adc.bin
每次手动触发adc的外部trigger引脚,上升沿触发,即可得到十六进制的ad采样数据
另外ADC时钟可以通过以下方式设定:
$echo freq > /sys/bus/iio/devices/iio:device0/samping_freq
3. 方法三:sys trigle
这种方式下直接通过软件即可进行一次adc采样触发,不用等待方法二中的外部触发引脚的改变
a. 内核配置里面选中
<*> SYSFS trigger
内核会创建iio_sysfs_trigger 目录
b.
$echo 123 > /sys/bus/iio/devices/iio_sysfs_trigger/add_trigger
这时会在device目录下创建 trigger1 目录,这里trigger0 是默认的硬件触发用的trigger
$echo sysfstrig123 > /sys/bus/iio/devices/iio:device0/trigger/current_trigger
$echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
$ echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length
$ echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
这样每次执行
$echo 1 > /sys/bus/iio/devices/trigger1/trigger_now 就会进行一次采样
注意,trigger0目录下是没有trigger_now
关于iio子系统的驱动分析这里不做说明,后续有时间的话会专门写个系列来介绍。