uboot/include/i2c.h
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2001
   3 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
   4 *
   5 * See file CREDITS for list of people who contributed to this
   6 * project.
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License as
  10 * published by the Free Software Foundation; either version 2 of
  11 * the License, or (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21 * MA 02111-1307 USA
  22 *
  23 * The original I2C interface was
  24 *   (C) 2000 by Paolo Scaffardi (arsenio@tin.it)
  25 *   AIRVENT SAM s.p.a - RIMINI(ITALY)
  26 * but has been changed substantially.
  27 */
  28
  29#ifndef _I2C_H_
  30#define _I2C_H_
  31
  32/*
  33 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
  34 *
  35 * The implementation MUST NOT use static or global variables if the
  36 * I2C routines are used to read SDRAM configuration information
  37 * because this is done before the memories are initialized. Limited
  38 * use of stack-based variables are OK (the initial stack size is
  39 * limited).
  40 *
  41 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
  42 */
  43
  44/*
  45 * Configuration items.
  46 */
  47#define I2C_RXTX_LEN    128     /* maximum tx/rx buffer length */
  48
  49#if defined(CONFIG_I2C_MULTI_BUS)
  50#define CONFIG_SYS_MAX_I2C_BUS          2
  51#define I2C_GET_BUS()           i2c_get_bus_num()
  52#define I2C_SET_BUS(a)          i2c_set_bus_num(a)
  53#else
  54#define CONFIG_SYS_MAX_I2C_BUS          1
  55#define I2C_GET_BUS()           0
  56#define I2C_SET_BUS(a)
  57#endif
  58
  59/* define the I2C bus number for RTC and DTT if not already done */
  60#if !defined(CONFIG_SYS_RTC_BUS_NUM)
  61#define CONFIG_SYS_RTC_BUS_NUM          0
  62#endif
  63#if !defined(CONFIG_SYS_DTT_BUS_NUM)
  64#define CONFIG_SYS_DTT_BUS_NUM          0
  65#endif
  66#if !defined(CONFIG_SYS_SPD_BUS_NUM)
  67#define CONFIG_SYS_SPD_BUS_NUM          0
  68#endif
  69
  70#ifndef I2C_SOFT_DECLARATIONS
  71# if defined(CONFIG_MPC8260)
  72#  define I2C_SOFT_DECLARATIONS volatile ioport_t *iop = ioport_addr((immap_t *)CONFIG_SYS_IMMR, I2C_PORT);
  73# elif defined(CONFIG_8xx)
  74#  define I2C_SOFT_DECLARATIONS volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  75# else
  76#  define I2C_SOFT_DECLARATIONS
  77# endif
  78#endif
  79
  80#ifdef CONFIG_8xx
  81/* Set default values for the I2C bus speed and slave address on 8xx. In the
  82 * future, we'll define these in all 8xx board config files.
  83 */
  84#ifndef CONFIG_SYS_I2C_SPEED
  85#define CONFIG_SYS_I2C_SPEED    50000
  86#endif
  87
  88#ifndef CONFIG_SYS_I2C_SLAVE
  89#define CONFIG_SYS_I2C_SLAVE    0xFE
  90#endif
  91#endif
  92
  93/*
  94 * Initialization, must be called once on start up, may be called
  95 * repeatedly to change the speed and slave addresses.
  96 */
  97void i2c_init(int speed, int slaveaddr);
  98#ifdef CONFIG_SYS_I2C_INIT_BOARD
  99void i2c_init_board(void);
 100#endif
 101
 102#if defined(CONFIG_I2C_MUX)
 103
 104typedef struct _mux {
 105        uchar   chip;
 106        uchar   channel;
 107        char    *name;
 108        struct _mux     *next;
 109} I2C_MUX;
 110
 111typedef struct _mux_device {
 112        int     busid;
 113        I2C_MUX *mux;   /* List of muxes, to reach the device */
 114        struct _mux_device      *next;
 115} I2C_MUX_DEVICE;
 116
 117int     i2c_mux_add_device(I2C_MUX_DEVICE *dev);
 118
 119I2C_MUX_DEVICE  *i2c_mux_search_device(int id);
 120I2C_MUX_DEVICE *i2c_mux_ident_muxstring (uchar *buf);
 121int i2x_mux_select_mux(int bus);
 122int i2c_mux_ident_muxstring_f (uchar *buf);
 123#endif
 124
 125/*
 126 * Probe the given I2C chip address.  Returns 0 if a chip responded,
 127 * not 0 on failure.
 128 */
 129int i2c_probe(uchar chip);
 130
 131/*
 132 * Read/Write interface:
 133 *   chip:    I2C chip address, range 0..127
 134 *   addr:    Memory (register) address within the chip
 135 *   alen:    Number of bytes to use for addr (typically 1, 2 for larger
 136 *              memories, 0 for register type devices with only one
 137 *              register)
 138 *   buffer:  Where to read/write the data
 139 *   len:     How many bytes to read/write
 140 *
 141 *   Returns: 0 on success, not 0 on failure
 142 */
 143int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len);
 144int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len);
 145
 146/*
 147 * Utility routines to read/write registers.
 148 */
 149static inline u8 i2c_reg_read(u8 addr, u8 reg)
 150{
 151        u8 buf;
 152
 153#ifdef CONFIG_8xx
 154        /* MPC8xx needs this.  Maybe one day we can get rid of it. */
 155        i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 156#endif
 157
 158#ifdef DEBUG
 159        printf("%s: addr=0x%02x, reg=0x%02x\n", __func__, addr, reg);
 160#endif
 161
 162        i2c_read(addr, reg, 1, &buf, 1);
 163
 164        return buf;
 165}
 166
 167static inline void i2c_reg_write(u8 addr, u8 reg, u8 val)
 168{
 169#ifdef CONFIG_8xx
 170        /* MPC8xx needs this.  Maybe one day we can get rid of it. */
 171        i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 172#endif
 173
 174#ifdef DEBUG
 175        printf("%s: addr=0x%02x, reg=0x%02x, val=0x%02x\n",
 176               __func__, addr, reg, val);
 177#endif
 178
 179        i2c_write(addr, reg, 1, &val, 1);
 180}
 181
 182/*
 183 * Functions for setting the current I2C bus and its speed
 184 */
 185
 186/*
 187 * i2c_set_bus_num:
 188 *
 189 *  Change the active I2C bus.  Subsequent read/write calls will
 190 *  go to this one.
 191 *
 192 *      bus - bus index, zero based
 193 *
 194 *      Returns: 0 on success, not 0 on failure
 195 *
 196 */
 197int i2c_set_bus_num(unsigned int bus);
 198
 199/*
 200 * i2c_get_bus_num:
 201 *
 202 *  Returns index of currently active I2C bus.  Zero-based.
 203 */
 204
 205unsigned int i2c_get_bus_num(void);
 206
 207/*
 208 * i2c_set_bus_speed:
 209 *
 210 *  Change the speed of the active I2C bus
 211 *
 212 *      speed - bus speed in Hz
 213 *
 214 *      Returns: 0 on success, not 0 on failure
 215 *
 216 */
 217int i2c_set_bus_speed(unsigned int);
 218
 219/*
 220 * i2c_get_bus_speed:
 221 *
 222 *  Returns speed of currently active I2C bus in Hz
 223 */
 224
 225unsigned int i2c_get_bus_speed(void);
 226
 227#endif  /* _I2C_H_ */
 228