Lines Matching +full:robot +full:- +full:electronics
2 * srf08.c - Support for Devantech SRFxx ultrasonic ranger
6 * Copyright (c) 2016, 2017 Andreas Klinger <ak@it-klinger.de>
13 * http://www.robot-electronics.co.uk/htm/srf08tech.html
14 * http://www.robot-electronics.co.uk/htm/srf10tech.htm
15 * http://www.robot-electronics.co.uk/htm/srf02tech.htm
38 #define SRF08_CMD_RANGING_CM 0x51 /* Ranging Mode - Result in cm */
71 * 1x16-bit channel + 3x16 padding + 4x16 timestamp
75 /* Sensor-Type */
78 /* Chip-specific information */
128 struct i2c_client *client = data->client; in srf08_read_ranging()
132 mutex_lock(&data->lock); in srf08_read_ranging()
134 ret = i2c_smbus_write_byte_data(data->client, in srf08_read_ranging()
137 dev_err(&client->dev, "write command - err: %d\n", ret); in srf08_read_ranging()
138 mutex_unlock(&data->lock); in srf08_read_ranging()
152 waittime = 1 + data->range_mm / 172; in srf08_read_ranging()
155 ret = i2c_smbus_read_byte_data(data->client, in srf08_read_ranging()
165 dev_err(&client->dev, "device not ready\n"); in srf08_read_ranging()
166 mutex_unlock(&data->lock); in srf08_read_ranging()
167 return -EIO; in srf08_read_ranging()
170 ret = i2c_smbus_read_word_swapped(data->client, in srf08_read_ranging()
173 dev_err(&client->dev, "cannot read distance: ret=%d\n", ret); in srf08_read_ranging()
174 mutex_unlock(&data->lock); in srf08_read_ranging()
178 mutex_unlock(&data->lock); in srf08_read_ranging()
186 struct iio_dev *indio_dev = pf->indio_dev; in srf08_trigger_handler()
194 mutex_lock(&data->lock); in srf08_trigger_handler()
196 data->buffer[0] = sensor_data; in srf08_trigger_handler()
198 data->buffer, pf->timestamp); in srf08_trigger_handler()
200 mutex_unlock(&data->lock); in srf08_trigger_handler()
202 iio_trigger_notify_done(indio_dev->trig); in srf08_trigger_handler()
213 if (channel->type != IIO_DISTANCE) in srf08_read_raw()
214 return -EINVAL; in srf08_read_raw()
229 return -EINVAL; in srf08_read_raw()
248 return sprintf(buf, "%d.%03d\n", data->range_mm / 1000, in srf08_show_range_mm()
249 data->range_mm % 1000); in srf08_show_range_mm()
266 struct i2c_client *client = data->client; in srf08_write_range_mm()
270 ret = val / 43 - 1; in srf08_write_range_mm()
274 return -EINVAL; in srf08_write_range_mm()
278 mutex_lock(&data->lock); in srf08_write_range_mm()
282 dev_err(&client->dev, "write_range - err: %d\n", ret); in srf08_write_range_mm()
283 mutex_unlock(&data->lock); in srf08_write_range_mm()
287 data->range_mm = val; in srf08_write_range_mm()
289 mutex_unlock(&data->lock); in srf08_write_range_mm()
324 for (i = 0; i < data->chip_info->num_sensitivity_avail; i++) in srf08_show_sensitivity_available()
325 if (data->chip_info->sensitivity_avail[i]) in srf08_show_sensitivity_available()
327 data->chip_info->sensitivity_avail[i]); in srf08_show_sensitivity_available()
344 len = sprintf(buf, "%d\n", data->sensitivity); in srf08_show_sensitivity()
352 struct i2c_client *client = data->client; in srf08_write_sensitivity()
357 return -EINVAL; in srf08_write_sensitivity()
359 for (i = 0; i < data->chip_info->num_sensitivity_avail; i++) in srf08_write_sensitivity()
360 if (val && (val == data->chip_info->sensitivity_avail[i])) { in srf08_write_sensitivity()
365 if (i >= data->chip_info->num_sensitivity_avail) in srf08_write_sensitivity()
366 return -EINVAL; in srf08_write_sensitivity()
368 mutex_lock(&data->lock); in srf08_write_sensitivity()
372 dev_err(&client->dev, "write_sensitivity - err: %d\n", ret); in srf08_write_sensitivity()
373 mutex_unlock(&data->lock); in srf08_write_sensitivity()
377 data->sensitivity = val; in srf08_write_sensitivity()
379 mutex_unlock(&data->lock); in srf08_write_sensitivity()
456 if (!i2c_check_functionality(client->adapter, in srf08_probe()
460 return -ENODEV; in srf08_probe()
462 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in srf08_probe()
464 return -ENOMEM; in srf08_probe()
468 data->client = client; in srf08_probe()
469 data->sensor_type = (enum srf08_sensor_type)id->driver_data; in srf08_probe()
471 switch (data->sensor_type) { in srf08_probe()
473 data->chip_info = &srf02_chip_info; in srf08_probe()
474 indio_dev->info = &srf02_info; in srf08_probe()
477 data->chip_info = &srf08_chip_info; in srf08_probe()
478 indio_dev->info = &srf08_info; in srf08_probe()
481 data->chip_info = &srf10_chip_info; in srf08_probe()
482 indio_dev->info = &srf08_info; in srf08_probe()
485 return -EINVAL; in srf08_probe()
488 indio_dev->name = id->name; in srf08_probe()
489 indio_dev->dev.parent = &client->dev; in srf08_probe()
490 indio_dev->modes = INDIO_DIRECT_MODE; in srf08_probe()
491 indio_dev->channels = srf08_channels; in srf08_probe()
492 indio_dev->num_channels = ARRAY_SIZE(srf08_channels); in srf08_probe()
494 mutex_init(&data->lock); in srf08_probe()
496 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, in srf08_probe()
499 dev_err(&client->dev, "setup of iio triggered buffer failed\n"); in srf08_probe()
503 if (data->chip_info->range_default) { in srf08_probe()
512 data->chip_info->range_default); in srf08_probe()
517 if (data->chip_info->sensitivity_default) { in srf08_probe()
526 data->chip_info->sensitivity_default); in srf08_probe()
531 return devm_iio_device_register(&client->dev, indio_dev); in srf08_probe()
561 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");