Re: [PATCH v4 3/3] w1: add UART w1 bus driver

From: Christoph Winklhofer
Date: Mon Jan 08 2024 - 13:11:56 EST


On Mon, Jan 08, 2024 at 07:18:31AM +0100, Jiri Slaby wrote:
> On 06. 01. 24, 17:02, Christoph Winklhofer via B4 Relay wrote:
> > From: Christoph Winklhofer <cj.winklhofer@xxxxxxxxx>
> >
> > Add a UART 1-Wire bus driver. The driver utilizes the UART interface via
> > the Serial Device Bus to create the 1-Wire timing patterns. The driver
> > was tested on a "Raspberry Pi 3B" with a DS18B20 and on a "Variscite
> > DART-6UL" with a DS18S20 temperature sensor.
> >
> > The 1-Wire timing pattern and the corresponding UART baud-rate with the
> > interpretation of the transferred bytes are described in the document:
> >
> > Link: https://www.analog.com/en/technical-articles/using-a-uart-to-implement-a-1wire-bus-master.html
> >
> > In short, the UART peripheral must support full-duplex and operate in
> > open-drain mode. The timing patterns are generated by a specific
> > combination of baud-rate and transmitted byte, which corresponds to a
> > 1-Wire read bit, write bit or reset.
> ...
> > --- /dev/null
> > +++ b/drivers/w1/masters/w1-uart.c
> > @@ -0,0 +1,398 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * w1-uart - UART 1-Wire bus driver
> > + *
> > + * Uses the UART interface (via Serial Device Bus) to create the 1-Wire
> > + * timing patterns. Implements the following 1-Wire master interface:
> > + *
> > + * - reset_bus: requests baud-rate 9600
> > + *
> > + * - touch_bit: requests baud-rate 115200
> > + *
> > + * Author: Christoph Winklhofer <cj.winklhofer@xxxxxxxxx>
> > + */
> > +
> > +#include <linux/completion.h>
> > +#include <linux/delay.h>
> > +#include <linux/jiffies.h>
> > +#include <linux/module.h>
> > +#include <linux/mutex.h>
> > +#include <linux/of.h>
> > +#include <linux/serdev.h>
> > +#include <linux/w1.h>
> > +
> > +#define W1_UART_TIMEOUT msecs_to_jiffies(500)
> > +
> > +/*
> > + * struct w1_uart_config - configuration for 1-Wire operation
> > + *
> > + * @baudrate: baud-rate returned from serdev
> > + * @delay_us: delay to complete a 1-Wire cycle (in us)
> > + * @tx_byte: byte to generate 1-Wire timing pattern
> > + */
> > +struct w1_uart_config {
> > + unsigned int baudrate;
> > + unsigned int delay_us;
> > + unsigned char tx_byte;
>
> If it is a "byte", it should be u8.
>
will change this and all others to u8.

...
> > +
> > +static inline unsigned int baud_to_bit_ns(unsigned int baud)
> > +{
> > + return 1000000000 / baud;
>
> NSEC_PER_SEC
>
> > +}
> > +
> > +static inline unsigned int to_ns(unsigned int us)
> > +{
> > + return us * 1000;
>
> NSEC_PER_USEC
>
and use the correct constants.

...
> > +}
> > +
> > +/*
> > + * Set baud-rate, delay and tx-byte to create a 1-Wire pulse and adapt
> > + * the tx-byte according to the actual baud-rate.
> > + *
> > + * Reject when:
> > + * - time for a bit outside min/max range
> > + * - a 1-Wire response is not detectable for sent byte
> > + */
> > +static int w1_uart_set_config(struct serdev_device *serdev,
> > + const struct w1_uart_limits *limits,
> > + struct w1_uart_config *w1cfg)
> > +{
...
> > + /* 1-Wire response detectable for sent byte */
> > + if (limits->sample_us > 0 &&
> > + bit_ns * 8 < low_ns + to_ns(limits->sample_us))
>
> BITS_PER_BYTE
>
ok, change it (it is the time for the UART data-frame).
> > + return -EINVAL;
> > +
> > + /* delay to complete 1-Wire cycle, include start and stop-bit */
> > + w1cfg->delay_us = 0;
> > + if (bit_ns * 10 < to_ns(limits->cycle_us))
>
> What is this 10? Dub it.
>
> > + w1cfg->delay_us =
> > + (to_ns(limits->cycle_us) - bit_ns * 10) / 1000;
>
> And this 10?
>
> The end: / NSEC_PER_USEC
>
will be more explicit (it is the time for the UART packet:
BITS_PER_BYTE + 2 (start and stop-bit).

...
> > +static int w1_uart_serdev_receive_buf(struct serdev_device *serdev,
> > + const unsigned char *buf, size_t count)
>
> serdev already uses u8 * here. You are basing on the top of some old tree.
Yes, this patch is based on the w1-next branch of
git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1.git
was not sure from where to start. I guess that this change is probably in
the w1-tree after the next stable release.
>
> regards,
> --
> js
> suse labs
>
Thanks Jiri for the review!

Kind regards,
Christoph