xref: /openbmc/linux/drivers/iio/adc/hx711.c (revision 4a3fad70)
1 /*
2  * HX711: analog to digital converter for weight sensor module
3  *
4  * Copyright (c) 2016 Andreas Klinger <ak@it-klinger.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  */
16 #include <linux/err.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/of.h>
20 #include <linux/platform_device.h>
21 #include <linux/property.h>
22 #include <linux/slab.h>
23 #include <linux/sched.h>
24 #include <linux/delay.h>
25 #include <linux/iio/iio.h>
26 #include <linux/iio/sysfs.h>
27 #include <linux/gpio/consumer.h>
28 #include <linux/regulator/consumer.h>
29 
30 /* gain to pulse and scale conversion */
31 #define HX711_GAIN_MAX		3
32 
33 struct hx711_gain_to_scale {
34 	int			gain;
35 	int			gain_pulse;
36 	int			scale;
37 	int			channel;
38 };
39 
40 /*
41  * .scale depends on AVDD which in turn is known as soon as the regulator
42  * is available
43  * therefore we set .scale in hx711_probe()
44  *
45  * channel A in documentation is channel 0 in source code
46  * channel B in documentation is channel 1 in source code
47  */
48 static struct hx711_gain_to_scale hx711_gain_to_scale[HX711_GAIN_MAX] = {
49 	{ 128, 1, 0, 0 },
50 	{  32, 2, 0, 1 },
51 	{  64, 3, 0, 0 }
52 };
53 
54 static int hx711_get_gain_to_pulse(int gain)
55 {
56 	int i;
57 
58 	for (i = 0; i < HX711_GAIN_MAX; i++)
59 		if (hx711_gain_to_scale[i].gain == gain)
60 			return hx711_gain_to_scale[i].gain_pulse;
61 	return 1;
62 }
63 
64 static int hx711_get_gain_to_scale(int gain)
65 {
66 	int i;
67 
68 	for (i = 0; i < HX711_GAIN_MAX; i++)
69 		if (hx711_gain_to_scale[i].gain == gain)
70 			return hx711_gain_to_scale[i].scale;
71 	return 0;
72 }
73 
74 static int hx711_get_scale_to_gain(int scale)
75 {
76 	int i;
77 
78 	for (i = 0; i < HX711_GAIN_MAX; i++)
79 		if (hx711_gain_to_scale[i].scale == scale)
80 			return hx711_gain_to_scale[i].gain;
81 	return -EINVAL;
82 }
83 
84 struct hx711_data {
85 	struct device		*dev;
86 	struct gpio_desc	*gpiod_pd_sck;
87 	struct gpio_desc	*gpiod_dout;
88 	struct regulator	*reg_avdd;
89 	int			gain_set;	/* gain set on device */
90 	int			gain_chan_a;	/* gain for channel A */
91 	struct mutex		lock;
92 };
93 
94 static int hx711_cycle(struct hx711_data *hx711_data)
95 {
96 	int val;
97 
98 	/*
99 	 * if preempted for more then 60us while PD_SCK is high:
100 	 * hx711 is going in reset
101 	 * ==> measuring is false
102 	 */
103 	preempt_disable();
104 	gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
105 	val = gpiod_get_value(hx711_data->gpiod_dout);
106 	/*
107 	 * here we are not waiting for 0.2 us as suggested by the datasheet,
108 	 * because the oscilloscope showed in a test scenario
109 	 * at least 1.15 us for PD_SCK high (T3 in datasheet)
110 	 * and 0.56 us for PD_SCK low on TI Sitara with 800 MHz
111 	 */
112 	gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
113 	preempt_enable();
114 
115 	return val;
116 }
117 
118 static int hx711_read(struct hx711_data *hx711_data)
119 {
120 	int i, ret;
121 	int value = 0;
122 	int val = gpiod_get_value(hx711_data->gpiod_dout);
123 
124 	/* we double check if it's really down */
125 	if (val)
126 		return -EIO;
127 
128 	for (i = 0; i < 24; i++) {
129 		value <<= 1;
130 		ret = hx711_cycle(hx711_data);
131 		if (ret)
132 			value++;
133 	}
134 
135 	value ^= 0x800000;
136 
137 	for (i = 0; i < hx711_get_gain_to_pulse(hx711_data->gain_set); i++)
138 		hx711_cycle(hx711_data);
139 
140 	return value;
141 }
142 
143 static int hx711_wait_for_ready(struct hx711_data *hx711_data)
144 {
145 	int i, val;
146 
147 	/*
148 	 * a maximum reset cycle time of 56 ms was measured.
149 	 * we round it up to 100 ms
150 	 */
151 	for (i = 0; i < 100; i++) {
152 		val = gpiod_get_value(hx711_data->gpiod_dout);
153 		if (!val)
154 			break;
155 		/* sleep at least 1 ms */
156 		msleep(1);
157 	}
158 	if (val)
159 		return -EIO;
160 
161 	return 0;
162 }
163 
164 static int hx711_reset(struct hx711_data *hx711_data)
165 {
166 	int ret;
167 	int val = gpiod_get_value(hx711_data->gpiod_dout);
168 
169 	if (val) {
170 		/*
171 		 * an examination with the oszilloscope indicated
172 		 * that the first value read after the reset is not stable
173 		 * if we reset too short;
174 		 * the shorter the reset cycle
175 		 * the less reliable the first value after reset is;
176 		 * there were no problems encountered with a value
177 		 * of 10 ms or higher
178 		 */
179 		gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
180 		msleep(10);
181 		gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
182 
183 		ret = hx711_wait_for_ready(hx711_data);
184 		if (ret)
185 			return ret;
186 		/*
187 		 * after a reset the gain is 128 so we do a dummy read
188 		 * to set the gain for the next read
189 		 */
190 		ret = hx711_read(hx711_data);
191 		if (ret < 0)
192 			return ret;
193 
194 		/*
195 		 * after a dummy read we need to wait vor readiness
196 		 * for not mixing gain pulses with the clock
197 		 */
198 		ret = hx711_wait_for_ready(hx711_data);
199 		if (ret)
200 			return ret;
201 	}
202 
203 	return val;
204 }
205 
206 static int hx711_set_gain_for_channel(struct hx711_data *hx711_data, int chan)
207 {
208 	int ret;
209 
210 	if (chan == 0) {
211 		if (hx711_data->gain_set == 32) {
212 			hx711_data->gain_set = hx711_data->gain_chan_a;
213 
214 			ret = hx711_read(hx711_data);
215 			if (ret < 0)
216 				return ret;
217 
218 			ret = hx711_wait_for_ready(hx711_data);
219 			if (ret)
220 				return ret;
221 		}
222 	} else {
223 		if (hx711_data->gain_set != 32) {
224 			hx711_data->gain_set = 32;
225 
226 			ret = hx711_read(hx711_data);
227 			if (ret < 0)
228 				return ret;
229 
230 			ret = hx711_wait_for_ready(hx711_data);
231 			if (ret)
232 				return ret;
233 		}
234 	}
235 
236 	return 0;
237 }
238 
239 static int hx711_read_raw(struct iio_dev *indio_dev,
240 				const struct iio_chan_spec *chan,
241 				int *val, int *val2, long mask)
242 {
243 	struct hx711_data *hx711_data = iio_priv(indio_dev);
244 	int ret;
245 
246 	switch (mask) {
247 	case IIO_CHAN_INFO_RAW:
248 		mutex_lock(&hx711_data->lock);
249 
250 		/*
251 		 * hx711_reset() must be called from here
252 		 * because it could be calling hx711_read() by itself
253 		 */
254 		if (hx711_reset(hx711_data)) {
255 			mutex_unlock(&hx711_data->lock);
256 			dev_err(hx711_data->dev, "reset failed!");
257 			return -EIO;
258 		}
259 
260 		ret = hx711_set_gain_for_channel(hx711_data, chan->channel);
261 		if (ret < 0) {
262 			mutex_unlock(&hx711_data->lock);
263 			return ret;
264 		}
265 
266 		*val = hx711_read(hx711_data);
267 
268 		mutex_unlock(&hx711_data->lock);
269 
270 		if (*val < 0)
271 			return *val;
272 		return IIO_VAL_INT;
273 	case IIO_CHAN_INFO_SCALE:
274 		*val = 0;
275 		mutex_lock(&hx711_data->lock);
276 
277 		*val2 = hx711_get_gain_to_scale(hx711_data->gain_set);
278 
279 		mutex_unlock(&hx711_data->lock);
280 
281 		return IIO_VAL_INT_PLUS_NANO;
282 	default:
283 		return -EINVAL;
284 	}
285 }
286 
287 static int hx711_write_raw(struct iio_dev *indio_dev,
288 				struct iio_chan_spec const *chan,
289 				int val,
290 				int val2,
291 				long mask)
292 {
293 	struct hx711_data *hx711_data = iio_priv(indio_dev);
294 	int ret;
295 	int gain;
296 
297 	switch (mask) {
298 	case IIO_CHAN_INFO_SCALE:
299 		/*
300 		 * a scale greater than 1 mV per LSB is not possible
301 		 * with the HX711, therefore val must be 0
302 		 */
303 		if (val != 0)
304 			return -EINVAL;
305 
306 		mutex_lock(&hx711_data->lock);
307 
308 		gain = hx711_get_scale_to_gain(val2);
309 		if (gain < 0) {
310 			mutex_unlock(&hx711_data->lock);
311 			return gain;
312 		}
313 
314 		if (gain != hx711_data->gain_set) {
315 			hx711_data->gain_set = gain;
316 			if (gain != 32)
317 				hx711_data->gain_chan_a = gain;
318 
319 			ret = hx711_read(hx711_data);
320 			if (ret < 0) {
321 				mutex_unlock(&hx711_data->lock);
322 				return ret;
323 			}
324 		}
325 
326 		mutex_unlock(&hx711_data->lock);
327 		return 0;
328 	default:
329 		return -EINVAL;
330 	}
331 
332 	return 0;
333 }
334 
335 static int hx711_write_raw_get_fmt(struct iio_dev *indio_dev,
336 		struct iio_chan_spec const *chan,
337 		long mask)
338 {
339 	return IIO_VAL_INT_PLUS_NANO;
340 }
341 
342 static ssize_t hx711_scale_available_show(struct device *dev,
343 				struct device_attribute *attr,
344 				char *buf)
345 {
346 	struct iio_dev_attr *iio_attr = to_iio_dev_attr(attr);
347 	int channel = iio_attr->address;
348 	int i, len = 0;
349 
350 	for (i = 0; i < HX711_GAIN_MAX; i++)
351 		if (hx711_gain_to_scale[i].channel == channel)
352 			len += sprintf(buf + len, "0.%09d ",
353 					hx711_gain_to_scale[i].scale);
354 
355 	len += sprintf(buf + len, "\n");
356 
357 	return len;
358 }
359 
360 static IIO_DEVICE_ATTR(in_voltage0_scale_available, S_IRUGO,
361 	hx711_scale_available_show, NULL, 0);
362 
363 static IIO_DEVICE_ATTR(in_voltage1_scale_available, S_IRUGO,
364 	hx711_scale_available_show, NULL, 1);
365 
366 static struct attribute *hx711_attributes[] = {
367 	&iio_dev_attr_in_voltage0_scale_available.dev_attr.attr,
368 	&iio_dev_attr_in_voltage1_scale_available.dev_attr.attr,
369 	NULL,
370 };
371 
372 static const struct attribute_group hx711_attribute_group = {
373 	.attrs = hx711_attributes,
374 };
375 
376 static const struct iio_info hx711_iio_info = {
377 	.read_raw		= hx711_read_raw,
378 	.write_raw		= hx711_write_raw,
379 	.write_raw_get_fmt	= hx711_write_raw_get_fmt,
380 	.attrs			= &hx711_attribute_group,
381 };
382 
383 static const struct iio_chan_spec hx711_chan_spec[] = {
384 	{
385 		.type = IIO_VOLTAGE,
386 		.channel = 0,
387 		.indexed = 1,
388 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
389 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
390 	},
391 	{
392 		.type = IIO_VOLTAGE,
393 		.channel = 1,
394 		.indexed = 1,
395 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
396 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
397 	},
398 };
399 
400 static int hx711_probe(struct platform_device *pdev)
401 {
402 	struct device *dev = &pdev->dev;
403 	struct hx711_data *hx711_data;
404 	struct iio_dev *indio_dev;
405 	int ret;
406 	int i;
407 
408 	indio_dev = devm_iio_device_alloc(dev, sizeof(struct hx711_data));
409 	if (!indio_dev) {
410 		dev_err(dev, "failed to allocate IIO device\n");
411 		return -ENOMEM;
412 	}
413 
414 	hx711_data = iio_priv(indio_dev);
415 	hx711_data->dev = dev;
416 
417 	mutex_init(&hx711_data->lock);
418 
419 	/*
420 	 * PD_SCK stands for power down and serial clock input of HX711
421 	 * in the driver it is an output
422 	 */
423 	hx711_data->gpiod_pd_sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW);
424 	if (IS_ERR(hx711_data->gpiod_pd_sck)) {
425 		dev_err(dev, "failed to get sck-gpiod: err=%ld\n",
426 					PTR_ERR(hx711_data->gpiod_pd_sck));
427 		return PTR_ERR(hx711_data->gpiod_pd_sck);
428 	}
429 
430 	/*
431 	 * DOUT stands for serial data output of HX711
432 	 * for the driver it is an input
433 	 */
434 	hx711_data->gpiod_dout = devm_gpiod_get(dev, "dout", GPIOD_IN);
435 	if (IS_ERR(hx711_data->gpiod_dout)) {
436 		dev_err(dev, "failed to get dout-gpiod: err=%ld\n",
437 					PTR_ERR(hx711_data->gpiod_dout));
438 		return PTR_ERR(hx711_data->gpiod_dout);
439 	}
440 
441 	hx711_data->reg_avdd = devm_regulator_get(dev, "avdd");
442 	if (IS_ERR(hx711_data->reg_avdd))
443 		return PTR_ERR(hx711_data->reg_avdd);
444 
445 	ret = regulator_enable(hx711_data->reg_avdd);
446 	if (ret < 0)
447 		return ret;
448 
449 	/*
450 	 * with
451 	 * full scale differential input range: AVDD / GAIN
452 	 * full scale output data: 2^24
453 	 * we can say:
454 	 *     AVDD / GAIN = 2^24
455 	 * therefore:
456 	 *     1 LSB = AVDD / GAIN / 2^24
457 	 * AVDD is in uV, but we need 10^-9 mV
458 	 * approximately to fit into a 32 bit number:
459 	 * 1 LSB = (AVDD * 100) / GAIN / 1678 [10^-9 mV]
460 	 */
461 	ret = regulator_get_voltage(hx711_data->reg_avdd);
462 	if (ret < 0) {
463 		regulator_disable(hx711_data->reg_avdd);
464 		return ret;
465 	}
466 	/* we need 10^-9 mV */
467 	ret *= 100;
468 
469 	for (i = 0; i < HX711_GAIN_MAX; i++)
470 		hx711_gain_to_scale[i].scale =
471 			ret / hx711_gain_to_scale[i].gain / 1678;
472 
473 	hx711_data->gain_set = 128;
474 	hx711_data->gain_chan_a = 128;
475 
476 	platform_set_drvdata(pdev, indio_dev);
477 
478 	indio_dev->name = "hx711";
479 	indio_dev->dev.parent = &pdev->dev;
480 	indio_dev->info = &hx711_iio_info;
481 	indio_dev->modes = INDIO_DIRECT_MODE;
482 	indio_dev->channels = hx711_chan_spec;
483 	indio_dev->num_channels = ARRAY_SIZE(hx711_chan_spec);
484 
485 	ret = iio_device_register(indio_dev);
486 	if (ret < 0) {
487 		dev_err(dev, "Couldn't register the device\n");
488 		regulator_disable(hx711_data->reg_avdd);
489 	}
490 
491 	return ret;
492 }
493 
494 static int hx711_remove(struct platform_device *pdev)
495 {
496 	struct hx711_data *hx711_data;
497 	struct iio_dev *indio_dev;
498 
499 	indio_dev = platform_get_drvdata(pdev);
500 	hx711_data = iio_priv(indio_dev);
501 
502 	iio_device_unregister(indio_dev);
503 
504 	regulator_disable(hx711_data->reg_avdd);
505 
506 	return 0;
507 }
508 
509 static const struct of_device_id of_hx711_match[] = {
510 	{ .compatible = "avia,hx711", },
511 	{},
512 };
513 
514 MODULE_DEVICE_TABLE(of, of_hx711_match);
515 
516 static struct platform_driver hx711_driver = {
517 	.probe		= hx711_probe,
518 	.remove		= hx711_remove,
519 	.driver		= {
520 		.name		= "hx711-gpio",
521 		.of_match_table	= of_hx711_match,
522 	},
523 };
524 
525 module_platform_driver(hx711_driver);
526 
527 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");
528 MODULE_DESCRIPTION("HX711 bitbanging driver - ADC for weight cells");
529 MODULE_LICENSE("GPL");
530 MODULE_ALIAS("platform:hx711-gpio");
531 
532