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

1 // SPDX-License-Identifier: GPL-2.0-only
3 * srf08.c - Support for Devantech SRFxx ultrasonic ranger
7 * Copyright (c) 2016, 2017 Andreas Klinger <ak@it-klinger.de>
10 * https://www.robot-electronics.co.uk/htm/srf08tech.html
11 * https://www.robot-electronics.co.uk/htm/srf10tech.htm
12 * https://www.robot-electronics.co.uk/htm/srf02tech.htm
35 #define SRF08_CMD_RANGING_CM 0x51 /* Ranging Mode - Result in cm */
72 /* Sensor-Type */
75 /* Chip-specific information */
125 struct i2c_client *client = data->client;
129 mutex_lock(&data->lock);
131 ret = i2c_smbus_write_byte_data(data->client,
134 dev_err(&client->dev, "write command - err: %d\n", ret);
135 mutex_unlock(&data->lock);
149 waittime = 1 + data->range_mm / 172;
152 ret = i2c_smbus_read_byte_data(data->client,
162 dev_err(&client->dev, "device not ready\n");
163 mutex_unlock(&data->lock);
164 return -EIO;
167 ret = i2c_smbus_read_word_swapped(data->client,
170 dev_err(&client->dev, "cannot read distance: ret=%d\n", ret);
171 mutex_unlock(&data->lock);
175 mutex_unlock(&data->lock);
183 struct iio_dev *indio_dev = pf->indio_dev;
191 mutex_lock(&data->lock);
193 data->scan.chan = sensor_data;
195 &data->scan, pf->timestamp);
197 mutex_unlock(&data->lock);
199 iio_trigger_notify_done(indio_dev->trig);
210 if (channel->type != IIO_DISTANCE)
211 return -EINVAL;
226 return -EINVAL;
245 return sprintf(buf, "%d.%03d\n", data->range_mm / 1000,
246 data->range_mm % 1000);
263 struct i2c_client *client = data->client;
267 ret = val / 43 - 1;
271 return -EINVAL;
275 mutex_lock(&data->lock);
279 dev_err(&client->dev, "write_range - err: %d\n", ret);
280 mutex_unlock(&data->lock);
284 data->range_mm = val;
286 mutex_unlock(&data->lock);
321 for (i = 0; i < data->chip_info->num_sensitivity_avail; i++)
322 if (data->chip_info->sensitivity_avail[i])
324 data->chip_info->sensitivity_avail[i]);
341 len = sprintf(buf, "%d\n", data->sensitivity);
349 struct i2c_client *client = data->client;
354 return -EINVAL;
356 for (i = 0; i < data->chip_info->num_sensitivity_avail; i++)
357 if (val == data->chip_info->sensitivity_avail[i]) {
362 if (i >= data->chip_info->num_sensitivity_avail)
363 return -EINVAL;
365 mutex_lock(&data->lock);
369 dev_err(&client->dev, "write_sensitivity - err: %d\n", ret);
370 mutex_unlock(&data->lock);
374 data->sensitivity = val;
376 mutex_unlock(&data->lock);
453 if (!i2c_check_functionality(client->adapter,
457 return -ENODEV;
459 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
461 return -ENOMEM;
465 data->client = client;
466 data->sensor_type = (enum srf08_sensor_type)id->driver_data;
468 switch (data->sensor_type) {
470 data->chip_info = &srf02_chip_info;
471 indio_dev->info = &srf02_info;
474 data->chip_info = &srf08_chip_info;
475 indio_dev->info = &srf08_info;
478 data->chip_info = &srf10_chip_info;
479 indio_dev->info = &srf08_info;
482 return -EINVAL;
485 indio_dev->name = id->name;
486 indio_dev->modes = INDIO_DIRECT_MODE;
487 indio_dev->channels = srf08_channels;
488 indio_dev->num_channels = ARRAY_SIZE(srf08_channels);
490 mutex_init(&data->lock);
492 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
495 dev_err(&client->dev, "setup of iio triggered buffer failed\n");
499 if (data->chip_info->range_default) {
508 data->chip_info->range_default);
513 if (data->chip_info->sensitivity_default) {
522 data->chip_info->sensitivity_default);
527 return devm_iio_device_register(&client->dev, indio_dev);
557 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");