驱动开发学习20250515

触发缓冲区支持

  1. 填写iio_buffer_setup_ops结构
const struct iio_buffer_setup_ops sensor_buffer_setup_ops = {
	.preenable = my_sensor_buffer_preenable,
	.postenable = my_sensor_buffer_postenable,
	.predisable = my_sensor_buffer_predisable,
};
  1. 编写与触发器关联的上半部,提供与捕获相关的时间戳
irqqreturn_t sensor_iio_pollfunc(int irq, void *p)
{
	pf->timestamp = iio_get_time_ns((struct indio_dev *)p);
	return IRQ_WAKE_THREAD;
}
  1. 编写触发器的下半部,将从每个启用的通道读取数据,并把他们送入缓冲区
irqreturn_t sensor_trigger_handler(int irq, void *p)
{
	u16 buf[8];
	int bit, i = 0;
	struct iio_poll_func *pf = p;
	struct iio_dev *indio_dev = pf->iodio_edv;
	mutex_lock(&my_mutex);//用锁保护缓冲区
	for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength);//读取每个活动通道的数据
	buf[i++] = sensor_get_data(bit);
	iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp);
	mutex_unlock(&my_mutex);//解锁
	iio_trigger_notify_done(indio_dev->trig);//通知触发
	return IRQ_HANDLED;	
}
  1. 在probe函数中,必须在使用iio_device_register()注册设备之前先设置缓冲区
iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc, sensor_trigger_handler, sensor_buffer_setup_ops);

在连续缓冲捕获激活时,应防止驱动程序在各个通道上执行sysfs数据捕获(由read_raw()钩子执行),因为read_raw()钩子和触发器处理程序将尝试同时访问设备
钩子函数如下:

static int my_read_raw(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, int *val, int *val2, long mask)
{
	[...]
	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		if (iio_buffer_enabled(indio_dev))	//测试IIO设备的缓冲区是否启用
			return -EBUSY;
	[...]
					}
}

钩子函数:消息处理机制,用来监视系统或进程的各种事件消息

IIO缓冲区

将被读取并推入缓冲区的通道的数据成为扫描元素
属性如下:

  • en:当其属性不为零时,触发的捕捉将包含此通道的数据取样
  • type:描述扫描元素数据在缓冲区内的存储,描述从用户空间读取它的形式
    be或le:字节顺序(大端、小端)
    s或u:符号(无符号、有符号)
    bits:有效数据位数
    storagebits:该通道在缓冲区中占用的位数
    shift:表示在屏蔽掉未使用的位之前应该移位数据值的次数
    如果有效位数等于存储位数,则shift等于0
    repeat:位/存储重复数量。当重复元素为0或1时,重复值被省略

IIO数据访问

单次捕获

单次捕获通过读取相关通道的sysfs条目,并且只捕获与此通道相关的数据

触发缓冲区

  1. 使用sysfs触发器捕获,步骤如下:
  • 创建触发器
  • 将触发器分配给设备。触发器由其名称唯一标识,使用名称可与设备绑定
  • 启用扫描元素,需要确定选择哪些通道的数据值推入缓冲区
  • 设置缓冲区的大小
  • 启用缓冲区,如果停止捕获,必须在同一个文件写0
  • 触发触发器,启动获取
  • 禁用缓冲区
  • 分离触发器
  • 转存IIO字符设备的内容
  1. 使用hrtimer触发器捕获

你可能感兴趣的:(驱动开发)