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_raw
2. .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_raw
Linux 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_raw
5. .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 的意义。
1136

被折叠的 条评论
为什么被折叠?



