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