IIO子系统:iio_chan_spec结构体

📅 2026/7/1 4:23:54
IIO子系统:iio_chan_spec结构体
IIO 驱动里最重要的结构之一是struct iio_chan_spec它用来描述一个传感器通道。BMI088 陀螺仪有 3 个角速度通道x 轴角速度 y 轴角速度 z 轴角速度所以可以定义如下 channel 数组static const struct iio_chan_spec bmi088_gyro_channels[] { { .type IIO_ANGL_VEL, .modified 1, .channel2 IIO_MOD_X, .info_mask_separate BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type BIT(IIO_CHAN_INFO_SCALE), }, { .type IIO_ANGL_VEL, .modified 1, .channel2 IIO_MOD_Y, .info_mask_separate BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type BIT(IIO_CHAN_INFO_SCALE), }, { .type IIO_ANGL_VEL, .modified 1, .channel2 IIO_MOD_Z, .info_mask_separate BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type BIT(IIO_CHAN_INFO_SCALE), }, };下面逐项解释。1..type IIO_ANGL_VEL.type IIO_ANGL_VEL,表示这个通道类型是角速度。IIO 中角速度对应 sysfs 名称里的anglvel所以最终会生成类似in_anglvel_x_raw如果是加速度计则通常使用.type IIO_ACCEL,对应生成in_accel_x_raw2..modified 1.modified 1,表示这个通道带有方向修饰。因为角速度不是一个单独的值而是x 轴角速度 y 轴角速度 z 轴角速度所以需要使用 modifier 区分方向。3..channel2 IIO_MOD_X.channel2 IIO_MOD_X,表示当前通道是 x 轴。因此.type IIO_ANGL_VEL .modified 1 .channel2 IIO_MOD_X组合起来就会生成in_anglvel_x_raw同理.channel2 IIO_MOD_Y生成in_anglvel_y_raw.channel2 IIO_MOD_Z生成in_anglvel_z_rawLinux IIO 文档中也说明channel 可以使用.modified和.channel2来表示方向、光谱响应等物理特征channel 属性可以通过info_mask_separate、info_mask_shared_by_type等方式描述。4..info_mask_separate.info_mask_separate BIT(IIO_CHAN_INFO_RAW),表示每个通道都有自己独立的 raw 属性。因为 x、y、z 三个轴的原始值不同所以 raw 必须分别暴露。最终会生成in_anglvel_x_raw in_anglvel_y_raw in_anglvel_z_raw5..info_mask_shared_by_type.info_mask_shared_by_type BIT(IIO_CHAN_INFO_SCALE),表示同一类通道共享一个 scale。x、y、z 都是角速度通道而且当前量程相同所以它们的转换比例相同。因此没有必要生成in_anglvel_x_scale in_anglvel_y_scale in_anglvel_z_scale而是生成一个共享的in_anglvel_scale这就是shared_by_type的意义。