hx711_data
static int hx711_cycle(struct hx711_data *hx711_data)
gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
ndelay(hx711_data->data_ready_delay_ns);
gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
ndelay(hx711_data->data_ready_delay_ns);
return gpiod_get_value(hx711_data->gpiod_dout);
static int hx711_read(struct hx711_data *hx711_data)
int val = gpiod_get_value(hx711_data->gpiod_dout);
ret = hx711_cycle(hx711_data);
for (i = 0; i < hx711_get_gain_to_pulse(hx711_data->gain_set); i++)
hx711_cycle(hx711_data);
static int hx711_wait_for_ready(struct hx711_data *hx711_data)
val = gpiod_get_value(hx711_data->gpiod_dout);
static int hx711_reset(struct hx711_data *hx711_data)
int val = hx711_wait_for_ready(hx711_data);
gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
val = hx711_wait_for_ready(hx711_data);
hx711_data->gain_set = HX711_RESET_GAIN;
static int hx711_set_gain_for_channel(struct hx711_data *hx711_data, int chan)
if (hx711_data->gain_set == 32) {
hx711_data->gain_set = hx711_data->gain_chan_a;
ret = hx711_read(hx711_data);
ret = hx711_wait_for_ready(hx711_data);
if (hx711_data->gain_set != 32) {
hx711_data->gain_set = 32;
ret = hx711_read(hx711_data);
ret = hx711_wait_for_ready(hx711_data);
static int hx711_reset_read(struct hx711_data *hx711_data, int chan)
if (hx711_reset(hx711_data)) {
dev_err(hx711_data->dev, "reset failed!");
ret = hx711_set_gain_for_channel(hx711_data, chan);
val = hx711_read(hx711_data);
struct hx711_data *hx711_data = iio_priv(indio_dev);
mutex_lock(&hx711_data->lock);
*val = hx711_reset_read(hx711_data, chan->channel);
mutex_unlock(&hx711_data->lock);
mutex_lock(&hx711_data->lock);
*val2 = hx711_get_gain_to_scale(hx711_data->gain_set);
mutex_unlock(&hx711_data->lock);
struct hx711_data *hx711_data = iio_priv(indio_dev);
mutex_lock(&hx711_data->lock);
mutex_unlock(&hx711_data->lock);
if (gain != hx711_data->gain_set) {
hx711_data->gain_set = gain;
hx711_data->gain_chan_a = gain;
ret = hx711_read(hx711_data);
mutex_unlock(&hx711_data->lock);
mutex_unlock(&hx711_data->lock);
struct hx711_data *hx711_data = iio_priv(indio_dev);
mutex_lock(&hx711_data->lock);
memset(&hx711_data->buffer, 0, sizeof(hx711_data->buffer));
hx711_data->buffer.channel[j] = hx711_reset_read(hx711_data,
iio_push_to_buffers_with_timestamp(indio_dev, &hx711_data->buffer,
mutex_unlock(&hx711_data->lock);
struct hx711_data *hx711_data;
indio_dev = devm_iio_device_alloc(dev, sizeof(struct hx711_data));
hx711_data = iio_priv(indio_dev);
hx711_data->dev = dev;
mutex_init(&hx711_data->lock);
hx711_data->gpiod_pd_sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW);
if (IS_ERR(hx711_data->gpiod_pd_sck))
return dev_err_probe(dev, PTR_ERR(hx711_data->gpiod_pd_sck),
hx711_data->gpiod_dout = devm_gpiod_get(dev, "dout", GPIOD_IN);
if (IS_ERR(hx711_data->gpiod_dout))
return dev_err_probe(dev, PTR_ERR(hx711_data->gpiod_dout),
hx711_data->gain_set = 128;
hx711_data->gain_chan_a = 128;
hx711_data->clock_frequency = 400000;
&hx711_data->clock_frequency);
if (hx711_data->clock_frequency < 20000) {
hx711_data->clock_frequency = 400000;
hx711_data->data_ready_delay_ns =
1000000000 / hx711_data->clock_frequency;