All of lore.kernel.org
 help / color / mirror / Atom feed
* Fwd: iio_trigger doesn't work
       [not found] <CAEE_umptNVPOYeTANC4mtAo8AxizmFkrFoa0eLGoLFtTRgWzng@mail.gmail.com>
@ 2012-09-19 15:57 ` Denis Ciocca
  2012-09-19 16:14   ` Jonathan Cameron
  2012-09-19 17:13   ` Lars-Peter Clausen
  0 siblings, 2 replies; 7+ messages in thread
From: Denis Ciocca @ 2012-09-19 15:57 UTC (permalink / raw)
  To: linux-iio

Hi everybody,

I write in this mailing list because I have some problems to
understand the trigger event catch and I ask for your help.

I write a little driver for accelerometer and the core driver works,
but now I want to write trigger code. What I understand is that:

1. register iio_trigger;
2. associate iio_trigger to iio_dev;
3. associate pollfunc with iio_alloc_pollfunc to iio_info;

when trigger occuring (in my example at hrtimers), I call
iio_trigger_poll() function and I expect which handler function
declared inside iio_alloc_pollfunc(...) is called.
This does not happen!

What I'm doing wrong?
There is some documentation about this?

Thanks,

Denis

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-19 15:57 ` Fwd: iio_trigger doesn't work Denis Ciocca
@ 2012-09-19 16:14   ` Jonathan Cameron
  2012-09-19 17:13   ` Lars-Peter Clausen
  1 sibling, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2012-09-19 16:14 UTC (permalink / raw)
  To: Denis Ciocca, linux-iio



Denis Ciocca <denis.ciocca@gmail.com> wrote:

>Hi everybody,
>
>I write in this mailing list because I have some problems to
>understand the trigger event catch and I ask for your help.
>
>I write a little driver for accelerometer and the core driver works,
>but now I want to write trigger code. What I understand is that:
>
>1. register iio_trigger;
>2. associate iio_trigger to iio_dev;
>3. associate pollfunc with iio_alloc_pollfunc to iio_info;

Buffer set up and enabled?
>
>when trigger occuring (in my example at hrtimers), I call
>iio_trigger_poll() function and I expect which handler function
>declared inside iio_alloc_pollfunc(...) is called.
>This does not happen!

Superficially looks correct.  Verify the trigger association worked by checking current_trigger under sysfs entry for the iio device.  Otherwise either post code or insert some printk statements to see where things are going.
>
>What I'm doing wrong?
>There is some documentation about this?

Kind of in code... generic_buffer.c for userspace side and dummy driver for kernel side.  Text docs rotted so until someone has time to update heavily commented examples were more useful.
>
>Thanks,
>
>Denis
>--
>To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-19 15:57 ` Fwd: iio_trigger doesn't work Denis Ciocca
  2012-09-19 16:14   ` Jonathan Cameron
@ 2012-09-19 17:13   ` Lars-Peter Clausen
  2012-09-20  7:43     ` Denis Ciocca
  1 sibling, 1 reply; 7+ messages in thread
From: Lars-Peter Clausen @ 2012-09-19 17:13 UTC (permalink / raw)
  To: Denis Ciocca; +Cc: linux-iio

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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-19 17:13   ` Lars-Peter Clausen
@ 2012-09-20  7:43     ` Denis Ciocca
  2012-09-20 11:44       ` Lars-Peter Clausen
  0 siblings, 1 reply; 7+ messages in thread
From: Denis Ciocca @ 2012-09-20  7:43 UTC (permalink / raw)
  To: linux-iio

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@metafoo.de>:
> 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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-20  7:43     ` Denis Ciocca
@ 2012-09-20 11:44       ` Lars-Peter Clausen
  2012-09-20 12:44         ` Denis Ciocca
  0 siblings, 1 reply; 7+ messages in thread
From: Lars-Peter Clausen @ 2012-09-20 11:44 UTC (permalink / raw)
  To: Denis Ciocca; +Cc: linux-iio

On 09/20/2012 09:43 AM, Denis Ciocca wrote:
> 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?

Yes, you need a buffer. The trigger won't be activated until the buffer is
active. To activate the buffer you need to select at least one scan element
in the scan_elements subfolder of you IIO device, then set the buffer size
by writing to buffer/length and finally write a 1 to buffer/enable. Now you
should see your acc_trigger_handler being called.

Btw. Marten Svanfeldt wrote a generic higres timer trigger for IIO.
Unfortunately this driver is not ready for mainline yet, but I've pushed it
to https://github.com/lclausen-adi/linux-2.6/commit/6f34757 in case you want
to take a look at it or use it.

- Lars




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-20 11:44       ` Lars-Peter Clausen
@ 2012-09-20 12:44         ` Denis Ciocca
  2012-09-20 13:12           ` Lars-Peter Clausen
  0 siblings, 1 reply; 7+ messages in thread
From: Denis Ciocca @ 2012-09-20 12:44 UTC (permalink / raw)
  To: Lars-Peter Clausen; +Cc: linux-iio

> Yes, you need a buffer. The trigger won't be activated until the buffer is
> active. To activate the buffer you need to select at least one scan element
> in the scan_elements subfolder of you IIO device, then set the buffer size
> by writing to buffer/length and finally write a 1 to buffer/enable. Now you
> should see your acc_trigger_handler being called.

I don't understand what you mean with:
"select at least one scan element in the scan_elements subfolder"
I have seen the adis16240 accelerometer driver for example but I don't saw
anything about scan element. Can you be more specific?

> Btw. Marten Svanfeldt wrote a generic higres timer trigger for IIO.
> Unfortunately this driver is not ready for mainline yet, but I've pushed it
> to https://github.com/lclausen-adi/linux-2.6/commit/6f34757 in case you want
> to take a look at it or use it.

Now I look!

Thanks

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fwd: iio_trigger doesn't work
  2012-09-20 12:44         ` Denis Ciocca
@ 2012-09-20 13:12           ` Lars-Peter Clausen
  0 siblings, 0 replies; 7+ messages in thread
From: Lars-Peter Clausen @ 2012-09-20 13:12 UTC (permalink / raw)
  To: Denis Ciocca; +Cc: linux-iio

On 09/20/2012 02:44 PM, Denis Ciocca wrote:
>> Yes, you need a buffer. The trigger won't be activated until the buffer is
>> active. To activate the buffer you need to select at least one scan element
>> in the scan_elements subfolder of you IIO device, then set the buffer size
>> by writing to buffer/length and finally write a 1 to buffer/enable. Now you
>> should see your acc_trigger_handler being called.
> 
> I don't understand what you mean with:
> "select at least one scan element in the scan_elements subfolder"
> I have seen the adis16240 accelerometer driver for example but I don't saw
> anything about scan element. Can you be more specific?

So each channel has a scan index. And for each channel you can enable
whether the channel should be sampled in buffered mode or not. There is a
sysfs file for each channel which allows you to do this in the scan_elements
subfolder. In order to start sampling you have to enable at least one
scan_element by writing a 1 to its enable attribute.

- Lars

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-09-20 13:30 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CAEE_umptNVPOYeTANC4mtAo8AxizmFkrFoa0eLGoLFtTRgWzng@mail.gmail.com>
2012-09-19 15:57 ` Fwd: iio_trigger doesn't work Denis Ciocca
2012-09-19 16:14   ` Jonathan Cameron
2012-09-19 17:13   ` Lars-Peter Clausen
2012-09-20  7:43     ` Denis Ciocca
2012-09-20 11:44       ` Lars-Peter Clausen
2012-09-20 12:44         ` Denis Ciocca
2012-09-20 13:12           ` Lars-Peter Clausen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.