Author: imp
Date: Thu Aug 27 23:33:38 2015
New Revision: 287225
URL: https://svnweb.freebsd.org/changeset/base/287225

Log:
  New 1-Wire bus implementation. 1-Wire controller is abstracted, though
  only gpiobus configured via FDT is supported. Bus enumeration is
  supported. Devices are created for each device found. 1-Wire
  temperature controllers are supported, but other drivers could be
  written. Temperatures are polled and reported via a sysctl.  Errors
  are reported via sysctl counters. Mis-wired bus detection is included
  for more trouble shooting. See ow(4), owc(4) and ow_temp(4) for
  details of what's supported and known issues.
  
  This has been tested on Raspberry Pi-B, Pi2 and Beagle Bone Black
  with up to 7 devices.
  
  Differential Revision: https://reviews.freebsd.org/D2956
  Relnotes: yes
  MFC after: 2 weeks
  Reviewed by: loos@ (with many insightful comments)

Added:
  head/share/man/man4/ow.4   (contents, props changed)
  head/share/man/man4/ow_temp.4   (contents, props changed)
  head/share/man/man4/owc.4   (contents, props changed)
  head/share/man/man9/owll.9   (contents, props changed)
  head/share/man/man9/own.9   (contents, props changed)
  head/sys/dev/ow/
  head/sys/dev/ow/README.txt   (contents, props changed)
  head/sys/dev/ow/ow.c   (contents, props changed)
  head/sys/dev/ow/ow.h   (contents, props changed)
  head/sys/dev/ow/ow_temp.c   (contents, props changed)
  head/sys/dev/ow/owc_gpiobus.c   (contents, props changed)
  head/sys/dev/ow/owll.h   (contents, props changed)
  head/sys/dev/ow/owll_if.m   (contents, props changed)
  head/sys/dev/ow/own.h   (contents, props changed)
  head/sys/dev/ow/own_if.m   (contents, props changed)
  head/sys/modules/ow/
  head/sys/modules/ow/Makefile   (contents, props changed)
  head/sys/modules/ow/ow/
  head/sys/modules/ow/ow/Makefile   (contents, props changed)
  head/sys/modules/ow/ow_temp/
  head/sys/modules/ow/ow_temp/Makefile   (contents, props changed)
  head/sys/modules/ow/owc/
  head/sys/modules/ow/owc/Makefile   (contents, props changed)
Modified:
  head/share/man/man4/Makefile
  head/share/man/man9/Makefile
  head/sys/conf/files
  head/sys/modules/Makefile

Modified: head/share/man/man4/Makefile
==============================================================================
--- head/share/man/man4/Makefile        Thu Aug 27 22:42:02 2015        
(r287224)
+++ head/share/man/man4/Makefile        Thu Aug 27 23:33:38 2015        
(r287225)
@@ -379,6 +379,9 @@ MAN=        aac.4 \
        oce.4 \
        ohci.4 \
        orm.4 \
+       ow.4 \
+       ow_temp.4 \
+       owc.4 \
        ${_padlock.4} \
        pass.4 \
        patm.4 \
@@ -667,6 +670,7 @@ MLINKS+=nge.4 if_nge.4
 MLINKS+=${_ntb.4} ${_if_ntb.4} \
        ${_ntb.4} ${_ntb_hw.4}
 MLINKS+=${_nxge.4} ${_if_nxge.4}
+MLINKS+=ow.4 onewire.4
 MLINKS+=patm.4 if_patm.4
 MLINKS+=pccbb.4 cbb.4
 MLINKS+=pcm.4 snd.4 \

Added: head/share/man/man4/ow.4
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man4/ow.4    Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,60 @@
+.\"
+.\" Copyright (c) 2015 M. Warner Losh
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 20, 2015
+.Dt OW 4
+.Os
+.Sh NAME
+.Nm ow
+.Nd Dallas Semiconductor 1-Wire bus
+.Sh SYNOPSIS
+.Cd device ow
+.Sh DESCRIPTION
+The
+.Nm
+module implements the Dallas Semiconductor 1-Wire bus.
+It attaches to the
+.Xr owc 4
+driver, which implements the low-level signaling of the
+1-Wire bus.
+.Sh SEE ALSO
+.Xr ow_temp 4 ,
+.Xr owc 4 ,
+.Xr owll 9 ,
+.Xr own 9
+.Sh LEGAL
+.Tn 1-Wire
+is a registered trademark of Maxim Integrated Products, Inc.
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+The
+.Nm
+device driver and this manual page were written by
+.An Warner Losh .

Added: head/share/man/man4/ow_temp.4
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man4/ow_temp.4       Thu Aug 27 23:33:38 2015        
(r287225)
@@ -0,0 +1,155 @@
+.\"
+.\" Copyright (c) 2015 M. Warner Losh
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 20, 2015
+.Dt OW_TEMP 4
+.Os
+.Sh NAME
+.Nm ow_temp
+.Nd Dallas Semiconductor 1-Wire Temperature sensor
+.Sh SYNOPSIS
+.Cd device ow_temp
+.Sh DESCRIPTION
+The
+.Nm
+module supports many of the 1-Wire temperature sensors.
+.Pp
+The sensor is read periodically and the results returned via a
+.Xr sysctl 3
+as described below.
+.Sh HARDWARE
+These temperature sensors are supported by the
+.Nm
+driver:
+.Bl -tag -width MAX31820 -compact
+.It DS1820
+1-Wire Digital Thermometer
+.It DS18S20
+High-Precision 1-Wire Digital Thermometer
+.It DS18B20
+Programmable Resolution 1-Wire Digital Thermometer
+.It DS1822
+Econo 1-Wire Digital Thermometer
+.It DS1825
+Programmable Resolution 1-Wire Digital Thermometer with 4-bit ID
+.It MAX31820
+1-Wire, Parasite-Power, Ambient Temperature Sensor
+.El
+.Pp
+The driver supports Family codes 0x10, 0x22, 0x28, and 0x3b.
+.Sh SYSCTL
+The
+.Nm
+driver reports data via
+.Xr sysctl 8
+entries in the device's node in the
+.Xr sysctl 8
+tree:
+.Bl -tag -width xxxxxxxxxx
+.It temperature
+The last temperature read, in milli-Kelvin.
+.It badcrc
+The number of CRC errors in reading the temperature form the
+device.
+Some CRC errors are to be expected.
+High rates of CRC errors, however, generally indicate a noisy
+environment, cabling issues, or too many devices on the bus.
+.It badread
+The number of times a non-CRC error was encountered reading the temperature
+from the card.
+This type of error is very rare.
+.It reading_interval
+The time, in ticks, between successive reads of the sensor.
+.It parasite
+This item is non-zero when the device is connected using its parasitic
+power mode.
+It can also indicate a wiring error.
+.El
+.Pp
+Temperatures are reported in milli-Kelvin, even though the absolute
+accuracy is around 0.2 degrees for the good devices and around 1
+degree for cheaper devices.
+The devices report in steps of 0.0625 degrees.
+The driver preserves the precision of the device's measurements
+in its
+.Xr sysctl 8
+reports.
+These devices often have a much higher relative accuracy and
+repeatability than their absolute accuracy.
+This makes them well suited for control loops that strive for
+stability and become possible if the full precision is preserved.
+.Sh SEE ALSO
+.Xr ow 4 ,
+.Xr owc 4 ,
+.Xr sysctl 8 ,
+.Xr owll 9 ,
+.Xr own 9
+.Sh LEGAL
+.Tn 1-Wire
+is a registered trademark of Maxim Integrated Products, Inc.
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+The
+.Nm
+device driver and this manual page were written by
+.An Warner Losh .
+.Sh BUGS
+The parasitic mode of the devices does not work.
+It requires support from the
+.Xr owc 4
+driver that is unimplemented.
+.Pp
+The ID bits from the
+.Em DS1825
+are not recognized or reported.
+.Pp
+The type of the device is not reported via
+.Xr sysctl 8 .
+.Pp
+Alarm mode is not supported.
+It is not possible to set the low and high alarm temperatures.
+.Pp
+There is no way to write to the EEPROM.
+.Pp
+.Dq Convert Temperature
+requests are sent directly to the device.
+There is no way to use the broadcast ability of the 1-Wire bus to do
+all the conversions in parallel.
+.Pp
+It is not possible to set the precision on those devices that support
+it.
+.Pp
+The time to convert is fixed at 1 second, even though some devices are
+faster.
+.Pp
+There is no character device to supply a stream of readings to a
+program.
+Programs interested in the temperature must poll the sysctl to get the
+temperature.

Added: head/share/man/man4/owc.4
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man4/owc.4   Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,95 @@
+.\"
+.\" Copyright (c) 2015 M. Warner Losh
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 20, 2015
+.Dt OWC 4
+.Os
+.Sh NAME
+.Nm owc
+.Nd Dallas Semiconductor 1-Wire Controller
+.Sh SYNOPSIS
+.Cd device owc
+.Sh DESCRIPTION
+The
+.Nm
+module implements Dallas Semiconductor 1-Wire signaling.
+It attaches the
+.Xr ow 4
+driver 1-Wire bus protocol.
+The
+.Nm
+device implements the Link Layer of the 1-Wire bus protocol stack.
+.Pp
+Bit banging a pin on a
+.Xr gpiobus 4
+is the only supported controller.
+Both standard and overdrive transfer timings are implemented.
+Strong pull-up functionality needed to support parasitic mode is not
+implemented.
+.Pp
+To enable 1-Wire for FDT systems requires modifying the DTS for your
+board to add something like:
+.Bd -literal
+/ {
+       ...
+       onewire {
+               compatible = "w1-gpio";
+               gpios = <&gpio 4 1>;
+       };
+       ...
+};
+.Ed
+.Pp
+The gpios property describes the GPIO pin the 1-Wire bus is connected
+to.
+For more details about the
+.Va gpios
+property, please consult
+.Pa /usr/src/sys/boot/fdt/dts/bindings-gpio.txt .
+.Sh SEE ALSO
+.Xr gpiobus 4 ,
+.Xr ow 4 ,
+.Xr ow_temp 4 ,
+.Xr owll 9 ,
+.Xr own 9
+.Sh LEGAL
+.Tn 1-Wire
+is a registered trademark of Maxim Integrated Products, Inc.
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+The
+.Nm
+device driver and this manual page were written by
+.An Warner Losh .
+.Sh CAVEATS
+The gpio driver implements timing by busy waiting, which can cause a
+high load on slower systems.
+.Sh BUGS
+Overdrive mode has not actually been tested.

Modified: head/share/man/man9/Makefile
==============================================================================
--- head/share/man/man9/Makefile        Thu Aug 27 22:42:02 2015        
(r287224)
+++ head/share/man/man9/Makefile        Thu Aug 27 23:33:38 2015        
(r287225)
@@ -190,6 +190,8 @@ MAN=        accept_filter.9 \
        netisr.9 \
        nv.9 \
        osd.9 \
+       owll.9 \
+       own.9 \
        panic.9 \
        pbuf.9 \
        PCBGROUP.9 \

Added: head/share/man/man9/owll.9
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man9/owll.9  Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,93 @@
+.\"
+.\" Copyright (c) 2015 M. Warner Losh
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 20, 2015
+.Dt OWLL 9
+.Os
+.Sh NAME
+.Nm owll
+.Nm OWLL_WRITE_ONE,
+.Nm OWLL_WRITE_ZERO,
+.Nm OWLL_READ_DATA,
+.Nm OWLL_REASET_AND_PRESENCE
+.Nd Dallas Semiconductor 1-Wire Link Layer Interface
+.Sh SYNOPSIS
+.Ft int
+.Fn OWLL_WRITE_ONE "device_t lldev" "struct ow_timing *timing"
+.Ft int
+.Fn OWLL_WRITE_ZERO "device_t lldev" "struct ow_timing *timing"
+.Ft int
+.Fn OWLL_READ_DATA "device_t lldev" "struct ow_timing *timing" "int *bit"
+.Ft int
+.Fn OWLL_RESET_AND_PRESENCE "device_t lldev" "struct ow_timing *timing" "int 
*bit"
+.Sh DESCRIPTION
+The
+.Nm
+interface provides access to the link layer of the Dallas
+Semiconductor 1-Wire from upper layers of the protocol.
+.Pp
+.Fn OWLL_WRITE_ONE
+and
+.Fn OWLL_WRITE_ZERO
+writes a one bitor a zero bit respectively on the 1-Wire bus.
+.Pp
+.Fn OWLL_READ_DATA
+reads one bit from the 1-Wire bus.
+This is often referred to as a
+.Dq Read Time Slot
+in the 1-Wire device data sheets.
+.Pp
+The
+.Fn OWLL_RESET_AND_PRESENCE
+function starts a reset sequence and detects if any device(s) are
+present on the bus.
+This is the beginning of all 1-Wire transactions.
+.Sh NOTES
+This interface is intended to be used only by the
+.Xr ow 4
+device to talk to the low-level bus.
+By convention, the device that implements this interface is called
+.Xr owc 4 .
+Only devices that implement
+.Xr own 9
+should call these interfaces.
+.Sh SEE ALSO
+.Xr ow 4 ,
+.Xr owc 4 ,
+.Xr own 9
+.Sh LEGAL
+.Tn 1-Wire
+is a registered trademark of Maxim Integrated Products, Inc.
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+The
+.Nm
+device driver and this manual page were written by
+.An Warner Losh .

Added: head/share/man/man9/own.9
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/man/man9/own.9   Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,230 @@
+.\"
+.\" Copyright (c) 2015 M. Warner Losh
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 20, 2015
+.Dt OWN 9
+.Os
+.Sh NAME
+.Nm own ,
+.Nm own_send_command ,
+.Nm own_commmand_wait ,
+.Nm own_self_command ,
+.Nm own_acquire_bus ,
+.Nm own crc ,
+.Nm own_release_bus ,
+.Nm OWN_ACQUIRE_BUS ,
+.Nm OWN_CRC ,
+.Nm OWN_RELEASE_BUS ,
+.Nm OWN_SEND_COMMAND
+.Nd Dallas Semiconductor 1-Wire Network and Transport Interface
+.Sh SYNOPSIS
+.In sys/bus.h
+.In dev/ow/own.h
+.Ft int
+.Fn own_send_command "device_t pdev" "struct ow_cmd *cmd"
+.Ft int
+.Fn own_command_wait "device_t pdev" "struct ow_cmd *cmd"
+.Ft int
+.Fn own_self_command "device_t pdev" "struct ow_cmd *cmd" "uint8_t xpt_cmd"
+.Ft int
+.Fn own_acquire_bus "device_t pdev" "int how"
+.Ft int
+.Fn own_release_bus "device_t pdev"
+.Ft int
+.Fn own_crc "device_t pdev" "uint8_t *buffer" "size_t len"
+.Ft int
+.Fn OWN_SEND_COMMAND "device_t ndev" "device_t pdev" "struct ow_cmd *cmd"
+.Ft int
+.Fn OWN_ACQUIRE_BUS "device_t ndev" "device_t pdev" "int how"
+.Ft void
+.Fn OWN_RELEASE_BUS "device_t ndev" "device_t pdev"
+.Ft uint8_t
+.Fn OWN_CRC "device_t ndev" "device_t pdev" "uint8_t *buffer" "size_t len"
+.Sh DESCRIPTION
+The
+.Nm
+interface defines three sets of functions for interacting with 1-Wire
+devices:
+sending commands,
+reserving the bus,
+and
+ensuring data integrity.
+Wrappers are provided for the raw
+.Nm OWN
+.Xr kobj 9
+interfaces and should be used for improved safety over the
+.Xr kobj 9
+ones.
+.Ss Bus Commands
+The 1-Wire bus defines different layers of access to the devices on
+the bus.
+The
+.Nm
+functions provide access to the network and transport layers.
+The network layer designates the next command as being either for all
+devices on the bus, or for a specific device.
+The network layer also specifies the speed used by the link layer.
+.Pp
+.Vt "struct ow_cmd"
+encapsulates network access, speed, and timing information.
+It specifies the commands to send and whether or not to read data.
+Its members are:
+.Bl -tag -width ".Va xxxx"
+.It Va flags
+Flags controlling the interpretation of the structure.
+These flags are defined in
+.In dev/ow/ow.h :
+.Bl -tag -width indent
+.It OW_FLAG_OVERDRIVE
+Send
+.Va xpt_cmd
+bytes and read
+.Va xpt_read
+bytes at overdrive speed.
+.It OW_FLAG_READ_BIT
+Interpret
+.Va xpt_read_len
+to be in bits to be read after
+.Va xpt_cmd
+rather than bytes.
+.El
+.It Va rom_cmd
+ROM command bytes to send.
+.It Va rom_len
+Number of ROM command bytes to send.
+.It Va rom_read_len
+Number of bytes to read after sending the ROM command.
+.It Va rom_read
+Buffer for bytes read after the ROM command.
+.It Va xpt_cmd
+Transport command to send.
+.It Va xpt_len
+Length of the transport command bytes to send.
+Specify 0 for no transport command.
+.It Va xpt_read_len
+Number of bytes to read after
+.Va xpt_cmd
+bytes are sent.
+If the
+.Dv OW_FLAG_READ_BIT
+bit is set in
+.Va flags ,
+then it is the number of bits to read.
+Bits read are packed into bytes.
+.It Va xpt_read
+Buffer for data read.
+.El
+.Pp
+.Fn own_command_wait
+acquires the 1-Wire bus, waiting if necessary,
+sends the command,
+and
+then releases the bus.
+.Fn own_send_command
+sends the command without bus reservation.
+.Fa pdev
+is the client device (the presentation layer device) sending the command.
+The
+.Fa cmd
+argument describes the transaction to send to the 1-Wire bus.
+.Pp
+.Fn own_self_command
+fills in
+.Fa cmd
+with a MATCH_ROM ROM command, the ROM address of
+.Fa pdev
+and the
+.Fa xpt_cmd
+as a convenient way to create directed commands.
+.Ss Bus Reservation
+The 1-Wire system includes an advisory lock for the bus that
+presentation layer devices can use to coordinate access.
+Locking is purely advisory at this time.
+.Pp
+.Fn own_acquire_bus
+reserves the bus.
+It waits indefinitely if the
+.Fa how
+argument is
+.Dv OWN_WAIT
+and returns the error
+.Dv EWOULDBLOCK
+if passed
+.Dv OWN_DONTWAIT
+when the bus is owned by another client.
+.Pp
+.Fn own_release_bus
+releases the bus.
+.Ss Data Integrity
+.Fn own_crc
+computes the 1-Wire standard CRC function over the data
+passed in
+.Fa buffer
+and
+.Fa len
+and returns the result.
+.Ss Notes
+The 1-Wire standard (Maxim AN937) defines layers that are akin to ISO
+networking layers.
+The lowest relevant layer, the link layer, defines the polling windows
+and the timing of the signaling of different modes.
+The network layer is built on top of the link layer
+and is used to address devices in a unicast or multicast manner.
+The transport layer defines commands and responses from the devices.
+The presentation layer is composed of the device specific commands and
+actions used to control the specific 1-Wire devices on bus.
+.Pp
+These interfaces are implemented by the
+.Xr ow 4
+device.
+Presentation layer devices (children of the newbus
+.Xr ow 4
+device) should only call the functions described here.
+The functionality provided by the
+.Xr owc 4
+device (specifically the
+.Xr owll 9
+interface) should only be called by the
+.Xr ow 4
+driver.
+.Sh SEE ALSO
+.Xr ow 4 ,
+.Xr owc 4 ,
+.Xr owll 9
+.Pa  http://pdfserv.maximintegrated.com/en/an/AN937.pdf
+.Sh LEGAL
+.Tn 1-Wire
+is a registered trademark of Maxim Integrated Products, Inc.
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+The
+.Nm
+device driver and this manual page were written by
+.An Warner Losh .

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Thu Aug 27 22:42:02 2015        (r287224)
+++ head/sys/conf/files Thu Aug 27 23:33:38 2015        (r287225)
@@ -2088,6 +2088,13 @@ dev/ofw/ofw_iicbus.c             optional fdt iicbu
 dev/ofw/ofwbus.c               optional fdt
 dev/ofw/openfirm.c             optional fdt
 dev/ofw/openfirmio.c           optional fdt
+dev/ow/ow.c                    optional ow                             \
+       dependency      "owll_if.h"                                     \
+       dependency      "own_if.h"
+dev/ow/owll_if.m               optional ow
+dev/ow/own_if.m                        optional ow
+dev/ow/ow_temp.c               optional ow_temp
+dev/ow/owc_gpiobus.c           optional owc gpio
 dev/patm/if_patm.c             optional patm pci
 dev/patm/if_patm_attach.c      optional patm pci
 dev/patm/if_patm_intr.c                optional patm pci

Added: head/sys/dev/ow/README.txt
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/ow/README.txt  Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,19 @@
+Quick Design Document for 1-wire bus
+
+In new bus terms, 1-wire devices are attached to 1-wire buses (ow)
+which are attached to a one wire bridge (owc).
+
+The implementation follows the terminology used in the Maxim AN927
+Application note which defines the 1-wire bus as implemented for the
+iButton product. This is considered to be the canonical definition of
+the 1-wire bus. This means that the 1-wire bridge will implement the
+owll(9) interface. ow is one wire. ll is for Link Level to mirror the ISO
+stack terminology used by AN927. The 1-wire bus is implemented in the ow(4)
+device, which implements the own(9) interface (n for network, the layer
+described in the AN927). The presentation layer and above is the
+responsibility of the client device drivers to implement.
+
+Client drivers may only call the own(9) interface. The ow(4) driver
+calls the owll(9) interface and implements the own(9).
+
+$FreeBSD$

Added: head/sys/dev/ow/ow.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/ow/ow.c        Thu Aug 27 23:33:38 2015        (r287225)
@@ -0,0 +1,639 @@
+/*-
+ * Copyright (c) 2015 M. Warner Losh <i...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+
+#include <sys/bus.h>
+#include <sys/errno.h>
+#include <sys/libkern.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+
+#include <dev/ow/ow.h>
+#include <dev/ow/owll.h>
+#include <dev/ow/own.h>
+
+/*
+ * lldev - link level device
+ * ndev - network / transport device (this module)
+ * pdev - presentation device (children of this module)
+ */
+
+typedef int ow_enum_fn(device_t, device_t);
+typedef int ow_found_fn(device_t, romid_t);
+
+struct ow_softc 
+{
+       device_t        dev;            /* Newbus driver back pointer */
+       struct mtx      mtx;            /* bus mutex */
+       device_t        owner;          /* bus owner, if != NULL */
+};
+
+struct ow_devinfo
+{
+       romid_t romid;
+};
+
+static int ow_acquire_bus(device_t ndev, device_t pdev, int how);
+static void ow_release_bus(device_t ndev, device_t pdev);
+
+#define        OW_LOCK(_sc) mtx_lock(&(_sc)->mtx)
+#define        OW_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx)
+#define        OW_LOCK_DESTROY(_sc) mtx_destroy(&_sc->mtx)
+#define        OW_ASSERT_LOCKED(_sc) mtx_assert(&_sc->mtx, MA_OWNED)
+#define        OW_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->mtx, MA_NOTOWNED)
+
+static MALLOC_DEFINE(M_OW, "ow", "House keeping data for 1wire bus");
+
+static struct ow_timing timing_regular = {
+       .t_slot = 60,           /* 60 to 120 */
+       .t_low0 = 60,           /* really 60 to 120 */
+       .t_low1 = 1,            /* really 1 to 15 */
+       .t_release = 45,        /* <= 45us */
+       .t_rec = 1,             /* at least 1us */
+       .t_rdv = 15,            /* 15us */
+       .t_rstl = 480,          /* 480us or more */
+       .t_rsth = 480,          /* 480us or more */
+       .t_pdl = 60,            /* 60us to 240us */
+       .t_pdh = 60,            /* 15us to 60us */
+       .t_lowr = 1,            /* 1us */
+};
+
+/* NB: Untested */
+static struct ow_timing timing_overdrive = {
+       .t_slot = 11,           /* 6us to 16us */
+       .t_low0 = 6,            /* really 6 to 16 */
+       .t_low1 = 1,            /* really 1 to 2 */
+       .t_release = 4,         /* <= 4us */
+       .t_rec = 1,             /* at least 1us */
+       .t_rdv = 2,             /* 2us */
+       .t_rstl = 48,           /* 48us to 80us */
+       .t_rsth = 48,           /* 48us or more  */
+       .t_pdl = 8,             /* 8us to 24us */
+       .t_pdh = 2,             /* 2us to 6us */
+       .t_lowr = 1,            /* 1us */
+};
+
+static void
+ow_send_byte(device_t lldev, struct ow_timing *t, uint8_t byte)
+{
+       int i;
+       
+       for (i = 0; i < 8; i++)
+               if (byte & (1 << i))
+                       OWLL_WRITE_ONE(lldev, t);
+               else
+                       OWLL_WRITE_ZERO(lldev, t);
+}
+
+static void
+ow_read_byte(device_t lldev, struct ow_timing *t, uint8_t *bytep)
+{
+       int i;
+       uint8_t byte = 0;
+       int bit;
+       
+       for (i = 0; i < 8; i++) {
+               OWLL_READ_DATA(lldev, t, &bit);
+               byte |= bit << i;
+       }
+       *bytep = byte;
+}
+
+static int
+ow_send_command(device_t ndev, device_t pdev, struct ow_cmd *cmd)
+{
+       int present, i, bit, tries;
+       device_t lldev;
+       struct ow_timing *t;
+
+       lldev = device_get_parent(ndev);
+
+       /*
+        * Retry the reset a couple of times before giving up.
+        */
+       tries = 4;
+       do {
+               OWLL_RESET_AND_PRESENCE(lldev, &timing_regular, &present);
+               if (present == 1)
+                       device_printf(ndev, "Reset said no device on bus?.\n");
+       } while (present == 1 && tries-- > 0);
+       if (present == 1) {
+               device_printf(ndev, "Reset said the device wasn't there.\n");
+               return ENOENT;          /* No devices acked the RESET */
+       }
+       if (present == -1) {
+               device_printf(ndev, "Reset discovered bus wired wrong.\n");
+               return ENOENT;
+       }
+
+       for (i = 0; i < cmd->rom_len; i++)
+               ow_send_byte(lldev, &timing_regular, cmd->rom_cmd[i]);
+       for (i = 0; i < cmd->rom_read_len; i++)
+               ow_read_byte(lldev, &timing_regular, cmd->rom_read + i);
+       if (cmd->xpt_len) {
+               /*
+                * Per AN937, the reset pulse and ROM level are always
+                * done with the regular timings. Certain ROM commands
+                * put the device into overdrive mode for the remainder
+                * of the data transfer, which is why we have to pass the
+                * timings here. Commands that need to be handled like this
+                * are expected to be flagged by the client.
+                */
+               t = (cmd->flags & OW_FLAG_OVERDRIVE) ?
+                   &timing_overdrive : &timing_regular;
+               for (i = 0; i < cmd->xpt_len; i++)
+                       ow_send_byte(lldev, t, cmd->xpt_cmd[i]);
+               if (cmd->flags & OW_FLAG_READ_BIT) {
+                       memset(cmd->xpt_read, 0, (cmd->xpt_read_len + 7) / 8);
+                       for (i = 0; i < cmd->xpt_read_len; i++) {
+                               OWLL_READ_DATA(lldev, t, &bit);
+                               cmd->xpt_read[i / 8] |= bit << (i % 8);
+                       }
+               } else {
+                       for (i = 0; i < cmd->xpt_read_len; i++)
+                               ow_read_byte(lldev, t, cmd->xpt_read + i);
+               }
+       }
+       return 0;
+}
+
+static int
+ow_search_rom(device_t lldev, device_t dev)
+{
+       struct ow_cmd cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.rom_cmd[0] = SEARCH_ROM;
+       cmd.rom_len = 1;
+       return ow_send_command(lldev, dev, &cmd);
+}
+
+#if 0
+static int
+ow_alarm_search(device_t lldev, device_t dev)
+{
+       struct ow_cmd cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.rom_cmd[0] = ALARM_SEARCH;
+       cmd.rom_len = 1;
+       return ow_send_command(lldev, dev, &cmd);
+}
+#endif
+
+static int
+ow_add_child(device_t dev, romid_t romid)
+{
+       struct ow_devinfo *di;
+       device_t child;
+
+       di = malloc(sizeof(*di), M_OW, M_WAITOK);
+       di->romid = romid;
+       child = device_add_child(dev, NULL, -1);
+       if (child == NULL) {
+               free(di, M_OW);
+               return ENOMEM;
+       }
+       device_set_ivars(child, di);
+       return (0);
+}
+
+static device_t
+ow_child_by_romid(device_t dev, romid_t romid)
+{
+       device_t *children, retval, child;
+       int nkid, i;
+       struct ow_devinfo *di;
+
+       if (device_get_children(dev, &children, &nkid) != 0)
+               return (NULL);
+       retval = NULL;
+       for (i = 0; i < nkid; i++) {
+               child = children[i];
+               di = device_get_ivars(child);
+               if (di->romid == romid) {
+                       retval = child;
+                       break;
+               }
+       }
+       free(children, M_TEMP);
+
+       return (retval);
+}
+
+/*
+ * CRC generator table -- taken from AN937 DOW CRC LOOKUP FUNCTION Table 2
+ */
+const uint8_t ow_crc_table[] = {
+       0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
+       157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
+       35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
+       190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
+       70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
+       219, 133,103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
+       101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
+       248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
+       140,210, 48, 110, 237, 179, 81, 15, 78, 16, 242,  172, 47, 113,147, 205,
+       17, 79, 173, 243, 112, 46, 204, 146, 211,141, 111, 49, 178, 236, 14, 80,
+       175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82,176, 238,
+       50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 
115,
+       202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
+       87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
+       233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 
168,
+       116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
+};
+
+/*
+ * Converted from DO_CRC page 131 ANN937
+ */
+static uint8_t
+ow_crc(device_t ndev, device_t pdev, uint8_t *buffer, size_t len)
+{

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to