IIO框架
iio_dev数据结构
该结构代表IIO设备,描述设备和驱动程序。
struct iio_dev {
[...]
int modes;
int currentmode;
struct device dev;
struct iio_buffer *buffer;
int scan_bytes;
const unsigned long *available_scan_masks;
const unsigned long *active_scan_masks;
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;
};
- modes:设备支持的模式
INDIO_DIRECT_MODE:设备提供sysfs类型的接口
INDIO_BUFFER_TRIGGERED:设备支持硬件触发
INDIO_BUFFER_HARDWARE:设备具有硬件缓冲区
INDIO_ALL_BUFFER_MODES:上述两种模式的组合 - currentmode:设备实际使用的模式
- buffer:数据缓冲区,使用触发缓冲区模式时被推送到用户空间
- scan_bytes:捕获并提供给缓冲区的字节数
- available_scan_masks:可选数组的位掩码
- active_scan_mask:已启用通道的位掩码,只有来自这些通道的数据才应该被推入buffer
- scan_timestamp:是否将捕获时间推入缓冲区,如果为true,则时间戳将作为缓冲区的最后一个元素进行推送,时间戳为8字节(64位)
- trig:设备的触发器
- pollfunc:在接收的触发器上运行的函数
- channels:描述设备的每个通道
- num_channels:channels中指定的通道数量
- name:设备名称
- info:来自驱动程序的回调和常量信息
- setup-ops:启动或禁用缓冲区之前和之后调用的一组回调函数
- chrdev:IIO内核创建的相关字符设备
iio_info结构
struct iio_info {
struct module *driver_module;
const struct attribute_group *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);
[...]
};
- attrs:设备属性
- read_raw:用于读取设备sysfs文件属性时运行的回调函数,可用于采样频率,用于将原始值转换为可用值或原始值自身的比例
IIO通道
struct iio_chan_spec {
enum iio_chan_type type;
int channel;
int channel2;
unsigned long address;
int scan_index;
struct {
charsign;
u8 realbits;
u8 storagebits;
u8 shift;
u8 repeat;
enum iio_endian endianness;
}scan_type;
long info_mask_separate;
long info_mask_shared_by_type;
long info_mask_shared_by_dir;
long info_mask_shared_by_all;
const struct iio_event_spec *event_spec;
unsigned int num_event_specs;
const struct iio_event_spec_ext_info *ext_info;
const char *extend_name;
const char *datasheet_name;
unsigned modified:1;
unsigned indexed:1;
unsigned output:1;
unsigned differential:1;
};
- type:通道测量类型
- channel:当.indexed设置为1时,指定通道索引
- channel2:当.modified设置为1时,指定通道修饰符
- modified:修饰符是否应用于此通道属性名称,修饰符只影响sysfs中的通道属性名称
- indexed:通道属性名称是否具有索引
- scan_index和scan_type:当使用缓冲区触发器时,这些字段用于标识来自缓冲区的元素。scan_index设置捕获通道在缓冲区内的位置
- info_mask_separate:专属于此通道
- long info_mask_shared_by_type:相同类型的所有通道共享
- long info_mask_shared_by_dir:相同方向的所有通道共享
- long info_mask_shared_by_all:所有通道共享