• Home
  • Raw
  • Download

Lines Matching +full:robot +full:- +full:electronics

4  * Copyright (c) 2017 Andreas Klinger <ak@it-klinger.de>
17 * http://www.robot-electronics.co.uk/htm/srf04tech.htm
21 * +---+
23 * trig: --+ +------------------------------------------------------
25 * |<->|
28 * ultra +-+ +-+ +-+
30 * burst: ---------+ +-+ +-+ +-----------------------------------------
32 * ultra . +-+ +-+ +-+
34 * echo: ----------------------------------+ +-+ +-+ +----------------
36 * +------------------------+
38 * echo: -------------------+ +---------------
42 * |<---------------------->|
44 * --> one round trip of ultra sonic waves
77 if (gpiod_get_value(data->gpiod_echo)) { in srf04_handle_irq()
78 data->ts_rising = now; in srf04_handle_irq()
79 complete(&data->rising); in srf04_handle_irq()
81 data->ts_falling = now; in srf04_handle_irq()
82 complete(&data->falling); in srf04_handle_irq()
96 * just one read-echo-cycle can take place at a time in srf04_read()
99 mutex_lock(&data->lock); in srf04_read()
101 reinit_completion(&data->rising); in srf04_read()
102 reinit_completion(&data->falling); in srf04_read()
104 gpiod_set_value(data->gpiod_trig, 1); in srf04_read()
106 gpiod_set_value(data->gpiod_trig, 0); in srf04_read()
109 ret = wait_for_completion_killable_timeout(&data->rising, HZ/50); in srf04_read()
111 mutex_unlock(&data->lock); in srf04_read()
114 mutex_unlock(&data->lock); in srf04_read()
115 return -ETIMEDOUT; in srf04_read()
119 ret = wait_for_completion_killable_timeout(&data->falling, HZ/20); in srf04_read()
121 mutex_unlock(&data->lock); in srf04_read()
124 mutex_unlock(&data->lock); in srf04_read()
125 return -ETIMEDOUT; in srf04_read()
128 ktime_dt = ktime_sub(data->ts_falling, data->ts_rising); in srf04_read()
130 mutex_unlock(&data->lock); in srf04_read()
141 * time = ---------- = ------------ = 40438871 ns in srf04_read()
144 * using a minimum speed at -20 °C of 319 m/s in srf04_read()
147 return -EIO; in srf04_read()
163 * distance = ------ * ------- = ------------ in srf04_read()
183 if (channel->type != IIO_DISTANCE) in srf04_read_raw()
184 return -EINVAL; in srf04_read_raw()
202 return -EINVAL; in srf04_read_raw()
221 struct device *dev = &pdev->dev; in srf04_probe()
229 return -ENOMEM; in srf04_probe()
233 data->dev = dev; in srf04_probe()
235 mutex_init(&data->lock); in srf04_probe()
236 init_completion(&data->rising); in srf04_probe()
237 init_completion(&data->falling); in srf04_probe()
239 data->gpiod_trig = devm_gpiod_get(dev, "trig", GPIOD_OUT_LOW); in srf04_probe()
240 if (IS_ERR(data->gpiod_trig)) { in srf04_probe()
241 dev_err(dev, "failed to get trig-gpios: err=%ld\n", in srf04_probe()
242 PTR_ERR(data->gpiod_trig)); in srf04_probe()
243 return PTR_ERR(data->gpiod_trig); in srf04_probe()
246 data->gpiod_echo = devm_gpiod_get(dev, "echo", GPIOD_IN); in srf04_probe()
247 if (IS_ERR(data->gpiod_echo)) { in srf04_probe()
248 dev_err(dev, "failed to get echo-gpios: err=%ld\n", in srf04_probe()
249 PTR_ERR(data->gpiod_echo)); in srf04_probe()
250 return PTR_ERR(data->gpiod_echo); in srf04_probe()
253 if (gpiod_cansleep(data->gpiod_echo)) { in srf04_probe()
254 dev_err(data->dev, "cansleep-GPIOs not supported\n"); in srf04_probe()
255 return -ENODEV; in srf04_probe()
258 data->irqnr = gpiod_to_irq(data->gpiod_echo); in srf04_probe()
259 if (data->irqnr < 0) { in srf04_probe()
260 dev_err(data->dev, "gpiod_to_irq: %d\n", data->irqnr); in srf04_probe()
261 return data->irqnr; in srf04_probe()
264 ret = devm_request_irq(dev, data->irqnr, srf04_handle_irq, in srf04_probe()
266 pdev->name, indio_dev); in srf04_probe()
268 dev_err(data->dev, "request_irq: %d\n", ret); in srf04_probe()
274 indio_dev->name = "srf04"; in srf04_probe()
275 indio_dev->dev.parent = &pdev->dev; in srf04_probe()
276 indio_dev->info = &srf04_iio_info; in srf04_probe()
277 indio_dev->modes = INDIO_DIRECT_MODE; in srf04_probe()
278 indio_dev->channels = srf04_chan_spec; in srf04_probe()
279 indio_dev->num_channels = ARRAY_SIZE(srf04_chan_spec); in srf04_probe()
294 .name = "srf04-gpio",
301 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");