|
@@ -97,6 +97,14 @@ struct hx711_data {
|
|
* 2x32-bit channel + 64-bit timestamp
|
|
* 2x32-bit channel + 64-bit timestamp
|
|
*/
|
|
*/
|
|
u32 buffer[4];
|
|
u32 buffer[4];
|
|
|
|
+ /*
|
|
|
|
+ * delay after a rising edge on SCK until the data is ready DOUT
|
|
|
|
+ * this is dependent on the hx711 where the datasheet tells a
|
|
|
|
+ * maximum value of 100 ns
|
|
|
|
+ * but also on potential parasitic capacities on the wiring
|
|
|
|
+ */
|
|
|
|
+ u32 data_ready_delay_ns;
|
|
|
|
+ u32 clock_frequency;
|
|
};
|
|
};
|
|
|
|
|
|
static int hx711_cycle(struct hx711_data *hx711_data)
|
|
static int hx711_cycle(struct hx711_data *hx711_data)
|
|
@@ -110,6 +118,14 @@ static int hx711_cycle(struct hx711_data *hx711_data)
|
|
*/
|
|
*/
|
|
preempt_disable();
|
|
preempt_disable();
|
|
gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
|
|
gpiod_set_value(hx711_data->gpiod_pd_sck, 1);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * wait until DOUT is ready
|
|
|
|
+ * it turned out that parasitic capacities are extending the time
|
|
|
|
+ * until DOUT has reached it's value
|
|
|
|
+ */
|
|
|
|
+ ndelay(hx711_data->data_ready_delay_ns);
|
|
|
|
+
|
|
val = gpiod_get_value(hx711_data->gpiod_dout);
|
|
val = gpiod_get_value(hx711_data->gpiod_dout);
|
|
/*
|
|
/*
|
|
* here we are not waiting for 0.2 us as suggested by the datasheet,
|
|
* here we are not waiting for 0.2 us as suggested by the datasheet,
|
|
@@ -120,6 +136,12 @@ static int hx711_cycle(struct hx711_data *hx711_data)
|
|
gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
|
|
gpiod_set_value(hx711_data->gpiod_pd_sck, 0);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * make it a square wave for addressing cases with capacitance on
|
|
|
|
+ * PC_SCK
|
|
|
|
+ */
|
|
|
|
+ ndelay(hx711_data->data_ready_delay_ns);
|
|
|
|
+
|
|
return val;
|
|
return val;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -458,6 +480,7 @@ static const struct iio_chan_spec hx711_chan_spec[] = {
|
|
static int hx711_probe(struct platform_device *pdev)
|
|
static int hx711_probe(struct platform_device *pdev)
|
|
{
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
struct device *dev = &pdev->dev;
|
|
|
|
+ struct device_node *np = dev->of_node;
|
|
struct hx711_data *hx711_data;
|
|
struct hx711_data *hx711_data;
|
|
struct iio_dev *indio_dev;
|
|
struct iio_dev *indio_dev;
|
|
int ret;
|
|
int ret;
|
|
@@ -530,6 +553,22 @@ static int hx711_probe(struct platform_device *pdev)
|
|
hx711_data->gain_set = 128;
|
|
hx711_data->gain_set = 128;
|
|
hx711_data->gain_chan_a = 128;
|
|
hx711_data->gain_chan_a = 128;
|
|
|
|
|
|
|
|
+ hx711_data->clock_frequency = 400000;
|
|
|
|
+ ret = of_property_read_u32(np, "clock-frequency",
|
|
|
|
+ &hx711_data->clock_frequency);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * datasheet says the high level of PD_SCK has a maximum duration
|
|
|
|
+ * of 50 microseconds
|
|
|
|
+ */
|
|
|
|
+ if (hx711_data->clock_frequency < 20000) {
|
|
|
|
+ dev_warn(dev, "clock-frequency too low - assuming 400 kHz\n");
|
|
|
|
+ hx711_data->clock_frequency = 400000;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ hx711_data->data_ready_delay_ns =
|
|
|
|
+ 1000000000 / hx711_data->clock_frequency;
|
|
|
|
+
|
|
platform_set_drvdata(pdev, indio_dev);
|
|
platform_set_drvdata(pdev, indio_dev);
|
|
|
|
|
|
indio_dev->name = "hx711";
|
|
indio_dev->name = "hx711";
|