summaryrefslogtreecommitdiffstats
path: root/drivers/w1/w1.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/w1/w1.h')
-rw-r--r--drivers/w1/w1.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h
new file mode 100644
index 0000000000..1373f69f62
--- /dev/null
+++ b/drivers/w1/w1.h
@@ -0,0 +1,152 @@
+/*
+ * w1.h
+ *
+ * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
+ * Copyright (c) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __W1_H
+#define __W1_H
+
+#include <common.h>
+#include <driver.h>
+
+struct w1_device {
+ u64 reg_num;
+ u8 fid;
+ u64 id;
+ u8 crc;
+
+ struct w1_bus *bus;
+ struct device_d dev;
+};
+
+struct w1_driver {
+ u8 fid;
+ u64 id;
+
+ int (*probe) (struct w1_device *dev);
+ void (*remove) (struct w1_device *dev);
+ struct driver_d drv;
+};
+
+int w1_driver_register(struct w1_driver *drv);
+
+extern struct bus_type w1_bustype;
+
+#define W1_MAXNAMELEN 32
+
+#define W1_SEARCH 0xF0
+#define W1_ALARM_SEARCH 0xEC
+#define W1_CONVERT_TEMP 0x44
+#define W1_SKIP_ROM 0xCC
+#define W1_READ_SCRATCHPAD 0xBE
+#define W1_READ_ROM 0x33
+#define W1_READ_PSUPPLY 0xB4
+#define W1_MATCH_ROM 0x55
+#define W1_RESUME_CMD 0xA5
+
+#define W1_SLAVE_ACTIVE 0
+
+/**
+ * Note: read_bit and write_bit are very low level functions and should only
+ * be used with hardware that doesn't really support 1-wire operations,
+ * like a parallel/serial port.
+ * Either define read_bit and write_bit OR define, at minimum, touch_bit and
+ * reset_bus.
+ */
+struct w1_bus
+{
+ struct device_d dev;
+ struct device_d *parent;
+
+ /**
+ * Sample the line level
+ * @return the level read (0 or 1)
+ */
+ u8 (*read_bit)(struct w1_bus *);
+
+ /** Sets the line level */
+ void (*write_bit)(struct w1_bus *, u8);
+
+ /**
+ * touch_bit is the lowest-level function for devices that really
+ * support the 1-wire protocol.
+ * touch_bit(0) = write-0 cycle
+ * touch_bit(1) = write-1 / read cycle
+ * @return the bit read (0 or 1)
+ */
+ u8 (*touch_bit)(struct w1_bus *, u8);
+
+ /**
+ * Reads a bytes. Same as 8 touch_bit(1) calls.
+ * @return the byte read
+ */
+ u8 (*read_byte)(struct w1_bus *);
+
+ /**
+ * Writes a byte. Same as 8 touch_bit(x) calls.
+ */
+ void (*write_byte)(struct w1_bus *, u8);
+
+ /**
+ * Same as a series of read_byte() calls
+ * @return the number of bytes read
+ */
+ u8 (*read_block)(struct w1_bus *, u8 *, int);
+
+ /** Same as a series of write_byte() calls */
+ void (*write_block)(struct w1_bus *, const u8 *, int);
+
+ /**
+ * Combines two reads and a smart write for ROM searches
+ * @return bit0=Id bit1=comp_id bit2=dir_taken
+ */
+ u8 (*triplet)(struct w1_bus *, u8);
+
+ /**
+ * long write-0 with a read for the presence pulse detection
+ * @return -1=Error, 0=Device present, 1=No device present
+ */
+ u8 (*reset_bus)(struct w1_bus *);
+
+ /**
+ * Put out a strong pull-up pulse of the specified duration.
+ * @return -1=Error, 0=completed
+ */
+ u8 (*set_pullup)(struct w1_bus *, int);
+
+ /** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
+ int enable_pullup;
+ /** 5V strong pullup duration in milliseconds, zero disabled. */
+ int pullup_duration;
+
+ int max_slave_count, slave_count;
+
+ void *data;
+ struct list_head list;
+};
+
+u8 w1_read_block(struct w1_bus *bus, u8 *buf, int len);
+void w1_write_block(struct w1_bus *bus, const u8 *buf, int len);
+void w1_touch_block(struct w1_bus *bus, u8 *buf, int len);
+u8 w1_triplet(struct w1_bus *bus, int bdir);
+u8 w1_read_8(struct w1_bus *bus);
+void w1_write_8(struct w1_bus *bus, u8 byte);
+int w1_reset_select_slave(struct w1_device *dev);
+int w1_reset_bus(struct w1_bus *bus);
+u8 w1_calc_crc8(u8 * data, int len);
+
+int w1_bus_register(struct w1_bus *bus);
+
+#endif /* __W1_H */