Re: Fwd: iio_trigger doesn't work

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



a little bit of code:

accelerometer_core.c

**
static irqreturn_t acc_trigger_handler(int irq, void *p)
{
	struct iio_poll_func *pf = p;
	struct iio_dev *indio_dev = pf->indio_dev;
	struct acc_data *adata = iio_priv(indio_dev);
	struct iio_buffer *buffer = indio_dev->buffer;

	pr_info("test.\n");

	iio_trigger_notify_done(indio_dev->trig);
	return IRQ_HANDLED;
}

static int __devinit acc_probe(struct i2c_client *client,
				const struct i2c_device_id *id)
{
...
	err = acc_probe_trigger(indio_dev);
	if(err < 0)
	{
		pr_err("%s(0x%x): acc_probe_trigger failed.\n",
					client->name, (u8)client->addr);
		goto acc_probe_trigger_error;
	}
indio_dev->pollfunc = iio_alloc_pollfunc(
						&iio_pollfunc_store_time,
						&acc_trigger_handler,
						IRQF_ONESHOT,
						indio_dev,
						"consumer%d",
						indio_dev->id);
	if(indio_dev->pollfunc == NULL)
	{
		ret = -ENOMEM;
		goto iio_alloc_pollfunc_error;
	}
	indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
...
}
**


accelerometer_trigger.c

static enum hrtimer_restart iio_trig_hrtimer_trig(struct hrtimer *time)
{
	struct acc_data *adata = container_of(time, struct acc_data, timer);
	ktime_t period;

	period = ktime_set(0, NSEC_PER_SEC / adata->odr);
	hrtimer_forward_now(&adata->timer, period);
	pr_info("prova\n");
	iio_trigger_poll_chained(adata->trig, iio_get_time_ns());
	return HRTIMER_RESTART;
}

static const struct iio_trigger_ops iio_acc_trigger_ops = {
	.owner = THIS_MODULE,
};

int acc_probe_trigger(struct iio_dev *indio_dev)
{
	struct acc_data *adata;
	int err;

	adata = iio_priv(indio_dev);
	pr_info("%s(0x%x): trigger probe start.\n", adata->client->name,
						(u8)adata->client->addr);

	adata->trig = iio_trigger_alloc("%s-periodic_task-%d",
					indio_dev->name, indio_dev->id);
	if(adata->trig == NULL)
	{
		err = -ENOMEM;
		pr_err("%s(0x%x): failed to allocate iio trigger."
			"\n", adata->client->name, (u8)adata->client->addr);
		goto iio_trigger_alloc_error;
	}

	adata->trig->private_data = indio_dev;
	adata->trig->ops = &iio_acc_trigger_ops;
	adata->trig->dev.parent = &adata->client->dev;

	hrtimer_init(&adata->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	adata->timer.function = iio_trig_hrtimer_trig;

	err = iio_trigger_register(adata->trig);
	if (err < 0)
	{
		pr_err("%s(0x%x): failed to register iio trigger."
			"\n", adata->client->name, (u8)adata->client->addr);
		goto iio_trigger_register_error;
	}
	indio_dev->trig = adata->trig;
hrtimer_start(&adata->timer, ktime_set(0, NSEC_PER_SEC/adata->odr),
			HRTIMER_MODE_REL);
	return 0;

iio_trigger_register_error:
	iio_trigger_free(adata->trig);
iio_trigger_alloc_error:
	return err;
}


I expect the message by pr_info is printed every delta time, but it
doesn't work. Can you help me? It is mandatory use buffer?
This is only an example, I am not expected that is useful.
Sorry for the code style but I am newby.
Thanks

Denis





2012/9/19 Lars-Peter Clausen <lars@xxxxxxxxxx>:
> On 09/19/2012 05:57 PM, Denis Ciocca wrote:
>> Hi everybody,
>>
>> [...]
>>
>> What I'm doing wrong?
>
> Hi,
>
> answering this certainly becomes easier if you'd post the code in
> question. :)
>
> - Lars
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux