[lkml]   [2008]   [Jul]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 6/30] W1: feature, w1_therm.c use strong pullup and documentation
    Added strong pullup to thermal sensor driver and general documentation
    on the sensor.

    Signed-off-by: David Fries <>
    Signed-off-by: Evgeniy Polyakov <>
    Documentation/w1/00-INDEX | 2 +
    Documentation/w1/slaves/00-INDEX | 4 +++
    Documentation/w1/slaves/w1_therm | 41 ++++++++++++++++++++++++++++++++++++++
    drivers/w1/slaves/w1_therm.c | 15 ++++++++++++-
    4 files changed, 60 insertions(+), 2 deletions(-)

    diff --git a/Documentation/w1/00-INDEX b/Documentation/w1/00-INDEX
    index 5270cf4..cb49802 100644
    --- a/Documentation/w1/00-INDEX
    +++ b/Documentation/w1/00-INDEX
    @@ -1,5 +1,7 @@
    - This file
    + - Drivers that provide support for specific family codes.
    - Individual chips providing 1-wire busses.
    diff --git a/Documentation/w1/slaves/00-INDEX b/Documentation/w1/slaves/00-INDEX
    new file mode 100644
    index 0000000..f8101d6
    --- /dev/null
    +++ b/Documentation/w1/slaves/00-INDEX
    @@ -0,0 +1,4 @@
    + - This file
    + - The Maxim/Dallas Semiconductor ds18*20 temperature sensor.
    diff --git a/Documentation/w1/slaves/w1_therm b/Documentation/w1/slaves/w1_therm
    new file mode 100644
    index 0000000..0403aaa
    --- /dev/null
    +++ b/Documentation/w1/slaves/w1_therm
    @@ -0,0 +1,41 @@
    +Kernel driver w1_therm
    +Supported chips:
    + * Maxim ds18*20 based temperature sensors.
    +Author: Evgeniy Polyakov <>
    +w1_therm provides basic temperature conversion for ds18*20 devices.
    +supported family codes:
    +W1_THERM_DS18S20 0x10
    +W1_THERM_DS1822 0x22
    +W1_THERM_DS18B20 0x28
    +Support is provided through the sysfs w1_slave file. Each open and
    +read sequence will initiate a temperature conversion then provide two
    +lines of ASCII output. The first line contains the nine hex bytes
    +read along with a calculated crc value and YES or NO if it matched.
    +If the crc matched the returned values are retained. The second line
    +displays the retained values along with a temperature in millidegrees
    +Centigrade after t=.
    +Parasite powered devices are limited to one slave performing a
    +temperature conversion at a time. If none of the devices are parasite
    +powered it would be possible to convert all the devices at the same
    +time and then go back to read individual sensors. That isn't
    +currently supported. The driver also doesn't support reduced
    +precision (which would also reduce the conversion time).
    +The module parameter strong_pullup can be set to 0 to disable the
    +strong pullup or 1 to enable. If enabled the 5V strong pullup will be
    +enabled when the conversion is taking place provided the master driver
    +must support the strong pullup (or it falls back to a pullup
    +resistor). The DS18b20 temperature sensor specification lists a
    +maximum current draw of 1.5mA and that a 5k pullup resistor is not
    +sufficient. The strong pullup is designed to provide the additional
    +current required.
    diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c
    index fb28aca..e87f464 100644
    --- a/drivers/w1/slaves/w1_therm.c
    +++ b/drivers/w1/slaves/w1_therm.c
    @@ -37,6 +37,14 @@ MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Evgeniy Polyakov <>");
    MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol, temperature family.");

    +/* Allow the strong pullup to be disabled, but default to enabled.
    + * If it was disabled a parasite powered device might not get the require
    + * current to do a temperature conversion. If it is enabled parasite powered
    + * devices have a better chance of getting the current required.
    + */
    +static int w1_strong_pullup = 1;
    +module_param_named(strong_pullup, w1_strong_pullup, int, 0);
    static u8 bad_roms[][9] = {
    {0xaa, 0x00, 0x4b, 0x46, 0xff, 0xff, 0x0c, 0x10, 0x87},
    @@ -192,9 +200,12 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj,
    int count = 0;
    unsigned int tm = 750;

    + /* 750ms strong pullup (or delay) after the convert */
    + if (w1_strong_pullup)
    + w1_next_pullup(dev, tm);
    w1_write_8(dev, W1_CONVERT_TEMP);
    - msleep(tm);
    + if (!w1_strong_pullup)
    + msleep(tm);

    if (!w1_reset_select_slave(sl)) {

    --[unhandled content-type:application/pgp-signature]
     \ /
      Last update: 2008-07-29 04:19    [W:0.039 / U:1.052 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site