9
0
Fork 0
barebox/drivers/w1/w1.h

155 lines
3.8 KiB
C

/*
* 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;
bool is_searched;
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 */