linux/drivers/w1/w1.h
<<
>>
Prefs
   1/*
   2 *      w1.h
   3 *
   4 * Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru>
   5 *
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20 */
  21
  22#ifndef __W1_H
  23#define __W1_H
  24
  25struct w1_reg_num
  26{
  27#if defined(__LITTLE_ENDIAN_BITFIELD)
  28        __u64   family:8,
  29                id:48,
  30                crc:8;
  31#elif defined(__BIG_ENDIAN_BITFIELD)
  32        __u64   crc:8,
  33                id:48,
  34                family:8;
  35#else
  36#error "Please fix <asm/byteorder.h>"
  37#endif
  38};
  39
  40#ifdef __KERNEL__
  41
  42#include <linux/completion.h>
  43#include <linux/device.h>
  44#include <linux/mutex.h>
  45
  46#include "w1_family.h"
  47
  48#define W1_MAXNAMELEN           32
  49
  50#define W1_SEARCH               0xF0
  51#define W1_ALARM_SEARCH         0xEC
  52#define W1_CONVERT_TEMP         0x44
  53#define W1_SKIP_ROM             0xCC
  54#define W1_READ_SCRATCHPAD      0xBE
  55#define W1_READ_ROM             0x33
  56#define W1_READ_PSUPPLY         0xB4
  57#define W1_MATCH_ROM            0x55
  58
  59#define W1_SLAVE_ACTIVE         0
  60
  61struct w1_slave
  62{
  63        struct module           *owner;
  64        unsigned char           name[W1_MAXNAMELEN];
  65        struct list_head        w1_slave_entry;
  66        struct w1_reg_num       reg_num;
  67        atomic_t                refcnt;
  68        u8                      rom[9];
  69        u32                     flags;
  70        int                     ttl;
  71
  72        struct w1_master        *master;
  73        struct w1_family        *family;
  74        void                    *family_data;
  75        struct device           dev;
  76        struct completion       released;
  77};
  78
  79typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
  80
  81
  82/**
  83 * Note: read_bit and write_bit are very low level functions and should only
  84 * be used with hardware that doesn't really support 1-wire operations,
  85 * like a parallel/serial port.
  86 * Either define read_bit and write_bit OR define, at minimum, touch_bit and
  87 * reset_bus.
  88 */
  89struct w1_bus_master
  90{
  91        /** the first parameter in all the functions below */
  92        void            *data;
  93
  94        /**
  95         * Sample the line level
  96         * @return the level read (0 or 1)
  97         */
  98        u8              (*read_bit)(void *);
  99
 100        /** Sets the line level */
 101        void            (*write_bit)(void *, u8);
 102
 103        /**
 104         * touch_bit is the lowest-level function for devices that really
 105         * support the 1-wire protocol.
 106         * touch_bit(0) = write-0 cycle
 107         * touch_bit(1) = write-1 / read cycle
 108         * @return the bit read (0 or 1)
 109         */
 110        u8              (*touch_bit)(void *, u8);
 111
 112        /**
 113         * Reads a bytes. Same as 8 touch_bit(1) calls.
 114         * @return the byte read
 115         */
 116        u8              (*read_byte)(void *);
 117
 118        /**
 119         * Writes a byte. Same as 8 touch_bit(x) calls.
 120         */
 121        void            (*write_byte)(void *, u8);
 122
 123        /**
 124         * Same as a series of read_byte() calls
 125         * @return the number of bytes read
 126         */
 127        u8              (*read_block)(void *, u8 *, int);
 128
 129        /** Same as a series of write_byte() calls */
 130        void            (*write_block)(void *, const u8 *, int);
 131
 132        /**
 133         * Combines two reads and a smart write for ROM searches
 134         * @return bit0=Id bit1=comp_id bit2=dir_taken
 135         */
 136        u8              (*triplet)(void *, u8);
 137
 138        /**
 139         * long write-0 with a read for the presence pulse detection
 140         * @return -1=Error, 0=Device present, 1=No device present
 141         */
 142        u8              (*reset_bus)(void *);
 143
 144        /**
 145         * Put out a strong pull-up pulse of the specified duration.
 146         * @return -1=Error, 0=completed
 147         */
 148        u8              (*set_pullup)(void *, int);
 149
 150        /** Really nice hardware can handles the different types of ROM search
 151         *  w1_master* is passed to the slave found callback.
 152         */
 153        void            (*search)(void *, struct w1_master *,
 154                u8, w1_slave_found_callback);
 155};
 156
 157struct w1_master
 158{
 159        struct list_head        w1_master_entry;
 160        struct module           *owner;
 161        unsigned char           name[W1_MAXNAMELEN];
 162        struct list_head        slist;
 163        int                     max_slave_count, slave_count;
 164        unsigned long           attempts;
 165        int                     slave_ttl;
 166        int                     initialized;
 167        u32                     id;
 168        int                     search_count;
 169
 170        atomic_t                refcnt;
 171
 172        void                    *priv;
 173        int                     priv_size;
 174
 175        /** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
 176        int                     enable_pullup;
 177        /** 5V strong pullup duration in milliseconds, zero disabled. */
 178        int                     pullup_duration;
 179
 180        struct task_struct      *thread;
 181        struct mutex            mutex;
 182
 183        struct device_driver    *driver;
 184        struct device           dev;
 185
 186        struct w1_bus_master    *bus_master;
 187
 188        u32                     seq;
 189};
 190
 191int w1_create_master_attributes(struct w1_master *);
 192void w1_destroy_master_attributes(struct w1_master *master);
 193void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
 194void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
 195struct w1_slave *w1_search_slave(struct w1_reg_num *id);
 196void w1_search_process(struct w1_master *dev, u8 search_type);
 197struct w1_master *w1_search_master_id(u32 id);
 198
 199/* Disconnect and reconnect devices in the given family.  Used for finding
 200 * unclaimed devices after a family has been registered or releasing devices
 201 * after a family has been unregistered.  Set attach to 1 when a new family
 202 * has just been registered, to 0 when it has been unregistered.
 203 */
 204void w1_reconnect_slaves(struct w1_family *f, int attach);
 205void w1_slave_detach(struct w1_slave *sl);
 206
 207u8 w1_triplet(struct w1_master *dev, int bdir);
 208void w1_write_8(struct w1_master *, u8);
 209u8 w1_read_8(struct w1_master *);
 210int w1_reset_bus(struct w1_master *);
 211u8 w1_calc_crc8(u8 *, int);
 212void w1_write_block(struct w1_master *, const u8 *, int);
 213void w1_touch_block(struct w1_master *, u8 *, int);
 214u8 w1_read_block(struct w1_master *, u8 *, int);
 215int w1_reset_select_slave(struct w1_slave *sl);
 216void w1_next_pullup(struct w1_master *, int);
 217
 218static inline struct w1_slave* dev_to_w1_slave(struct device *dev)
 219{
 220        return container_of(dev, struct w1_slave, dev);
 221}
 222
 223static inline struct w1_slave* kobj_to_w1_slave(struct kobject *kobj)
 224{
 225        return dev_to_w1_slave(container_of(kobj, struct device, kobj));
 226}
 227
 228static inline struct w1_master* dev_to_w1_master(struct device *dev)
 229{
 230        return container_of(dev, struct w1_master, dev);
 231}
 232
 233extern struct device_driver w1_master_driver;
 234extern struct device w1_master_device;
 235extern int w1_max_slave_count;
 236extern int w1_max_slave_ttl;
 237extern struct list_head w1_masters;
 238extern struct mutex w1_mlock;
 239
 240extern int w1_process(void *);
 241
 242#endif /* __KERNEL__ */
 243
 244#endif /* __W1_H */
 245