Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.23-rc2 224 lines 5.5 kB view raw
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#define W1_SLAVE_DATA_SIZE 128 50 51#define W1_SEARCH 0xF0 52#define W1_ALARM_SEARCH 0xEC 53#define W1_CONVERT_TEMP 0x44 54#define W1_SKIP_ROM 0xCC 55#define W1_READ_SCRATCHPAD 0xBE 56#define W1_READ_ROM 0x33 57#define W1_READ_PSUPPLY 0xB4 58#define W1_MATCH_ROM 0x55 59 60#define W1_SLAVE_ACTIVE 0 61 62struct w1_slave 63{ 64 struct module *owner; 65 unsigned char name[W1_MAXNAMELEN]; 66 struct list_head w1_slave_entry; 67 struct w1_reg_num reg_num; 68 atomic_t refcnt; 69 u8 rom[9]; 70 u32 flags; 71 int ttl; 72 73 struct w1_master *master; 74 struct w1_family *family; 75 void *family_data; 76 struct device dev; 77 struct completion released; 78}; 79 80typedef void (* w1_slave_found_callback)(void *, u64); 81 82 83/** 84 * Note: read_bit and write_bit are very low level functions and should only 85 * be used with hardware that doesn't really support 1-wire operations, 86 * like a parallel/serial port. 87 * Either define read_bit and write_bit OR define, at minimum, touch_bit and 88 * reset_bus. 89 */ 90struct w1_bus_master 91{ 92 /** the first parameter in all the functions below */ 93 void *data; 94 95 /** 96 * Sample the line level 97 * @return the level read (0 or 1) 98 */ 99 u8 (*read_bit)(void *); 100 101 /** Sets the line level */ 102 void (*write_bit)(void *, u8); 103 104 /** 105 * touch_bit is the lowest-level function for devices that really 106 * support the 1-wire protocol. 107 * touch_bit(0) = write-0 cycle 108 * touch_bit(1) = write-1 / read cycle 109 * @return the bit read (0 or 1) 110 */ 111 u8 (*touch_bit)(void *, u8); 112 113 /** 114 * Reads a bytes. Same as 8 touch_bit(1) calls. 115 * @return the byte read 116 */ 117 u8 (*read_byte)(void *); 118 119 /** 120 * Writes a byte. Same as 8 touch_bit(x) calls. 121 */ 122 void (*write_byte)(void *, u8); 123 124 /** 125 * Same as a series of read_byte() calls 126 * @return the number of bytes read 127 */ 128 u8 (*read_block)(void *, u8 *, int); 129 130 /** Same as a series of write_byte() calls */ 131 void (*write_block)(void *, const u8 *, int); 132 133 /** 134 * Combines two reads and a smart write for ROM searches 135 * @return bit0=Id bit1=comp_id bit2=dir_taken 136 */ 137 u8 (*triplet)(void *, u8); 138 139 /** 140 * long write-0 with a read for the presence pulse detection 141 * @return -1=Error, 0=Device present, 1=No device present 142 */ 143 u8 (*reset_bus)(void *); 144 145 /** Really nice hardware can handles the different types of ROM search */ 146 void (*search)(void *, u8, w1_slave_found_callback); 147}; 148 149#define W1_MASTER_NEED_EXIT 0 150#define W1_MASTER_NEED_RECONNECT 1 151 152struct w1_master 153{ 154 struct list_head w1_master_entry; 155 struct module *owner; 156 unsigned char name[W1_MAXNAMELEN]; 157 struct list_head slist; 158 int max_slave_count, slave_count; 159 unsigned long attempts; 160 int slave_ttl; 161 int initialized; 162 u32 id; 163 int search_count; 164 165 atomic_t refcnt; 166 167 void *priv; 168 int priv_size; 169 170 long flags; 171 172 struct task_struct *thread; 173 struct mutex mutex; 174 175 struct device_driver *driver; 176 struct device dev; 177 178 struct w1_bus_master *bus_master; 179 180 u32 seq; 181}; 182 183int w1_create_master_attributes(struct w1_master *); 184void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); 185void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); 186struct w1_slave *w1_search_slave(struct w1_reg_num *id); 187void w1_search_process(struct w1_master *dev, u8 search_type); 188struct w1_master *w1_search_master_id(u32 id); 189 190u8 w1_triplet(struct w1_master *dev, int bdir); 191void w1_write_8(struct w1_master *, u8); 192int w1_reset_bus(struct w1_master *); 193u8 w1_calc_crc8(u8 *, int); 194void w1_write_block(struct w1_master *, const u8 *, int); 195u8 w1_read_block(struct w1_master *, u8 *, int); 196int w1_reset_select_slave(struct w1_slave *sl); 197 198static inline struct w1_slave* dev_to_w1_slave(struct device *dev) 199{ 200 return container_of(dev, struct w1_slave, dev); 201} 202 203static inline struct w1_slave* kobj_to_w1_slave(struct kobject *kobj) 204{ 205 return dev_to_w1_slave(container_of(kobj, struct device, kobj)); 206} 207 208static inline struct w1_master* dev_to_w1_master(struct device *dev) 209{ 210 return container_of(dev, struct w1_master, dev); 211} 212 213extern struct device_driver w1_master_driver; 214extern struct device w1_master_device; 215extern int w1_max_slave_count; 216extern int w1_max_slave_ttl; 217extern struct list_head w1_masters; 218extern struct mutex w1_mlock; 219 220extern int w1_process(void *); 221 222#endif /* __KERNEL__ */ 223 224#endif /* __W1_H */