i2c.h 2.7 KB
Newer Older
P
pbrook 已提交
1 2 3
#ifndef QEMU_I2C_H
#define QEMU_I2C_H

P
Paul Brook 已提交
4 5
#include "qdev.h"

P
pbrook 已提交
6 7 8 9 10 11 12 13 14
/* The QEMU I2C implementation only supports simple transfers that complete
   immediately.  It does not support slave devices that need to be able to
   defer their response (eg. CPU slave interfaces where the data is supplied
   by the device driver in response to an interrupt).  */

enum i2c_event {
    I2C_START_RECV,
    I2C_START_SEND,
    I2C_FINISH,
T
ths 已提交
15
    I2C_NACK /* Masker NACKed a receive byte.  */
P
pbrook 已提交
16 17 18 19 20 21 22 23 24
};

/* Master to slave.  */
typedef int (*i2c_send_cb)(i2c_slave *s, uint8_t data);
/* Slave to master.  */
typedef int (*i2c_recv_cb)(i2c_slave *s);
/* Notify the slave of a bus state change.  */
typedef void (*i2c_event_cb)(i2c_slave *s, enum i2c_event event);

P
Paul Brook 已提交
25 26 27 28 29 30 31 32 33 34
typedef void (*i2c_slave_initfn)(i2c_slave *dev);

typedef struct {
    /* Callbacks provided by the device.  */
    i2c_slave_initfn init;
    i2c_event_cb event;
    i2c_recv_cb recv;
    i2c_send_cb send;
} I2CSlaveInfo;

P
pbrook 已提交
35 36
struct i2c_slave
{
P
Paul Brook 已提交
37 38
    DeviceState qdev;
    I2CSlaveInfo *info;
P
pbrook 已提交
39 40 41 42

    /* Remaining fields for internal use by the I2C code.  */
    int address;
    void *next;
P
pbrook 已提交
43
    i2c_bus *bus;
P
pbrook 已提交
44 45 46 47 48 49 50 51 52 53
};

i2c_bus *i2c_init_bus(void);
void i2c_set_slave_address(i2c_slave *dev, int address);
int i2c_bus_busy(i2c_bus *bus);
int i2c_start_transfer(i2c_bus *bus, int address, int recv);
void i2c_end_transfer(i2c_bus *bus);
void i2c_nack(i2c_bus *bus);
int i2c_send(i2c_bus *bus, uint8_t data);
int i2c_recv(i2c_bus *bus);
54 55
void i2c_slave_save(QEMUFile *f, i2c_slave *dev);
void i2c_slave_load(QEMUFile *f, i2c_slave *dev);
P
pbrook 已提交
56

P
Paul Brook 已提交
57 58 59 60 61 62 63
#define I2C_SLAVE_FROM_QDEV(dev) DO_UPCAST(i2c_slave, qdev, dev)
#define FROM_I2C_SLAVE(type, dev) DO_UPCAST(type, i2c, dev)

void i2c_register_slave(const char *name, int size, I2CSlaveInfo *type);

DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, int addr);

P
pbrook 已提交
64
/* max111x.c */
P
Paul Brook 已提交
65
typedef struct MAX111xState MAX111xState;
P
pbrook 已提交
66 67
uint32_t max111x_read(void *opaque);
void max111x_write(void *opaque, uint32_t value);
P
Paul Brook 已提交
68 69 70
MAX111xState *max1110_init(qemu_irq cb);
MAX111xState *max1111_init(qemu_irq cb);
void max111x_set_input(MAX111xState *s, int line, uint8_t value);
P
pbrook 已提交
71

72 73 74 75 76 77
/* max7310.c */
void max7310_reset(i2c_slave *i2c);
qemu_irq *max7310_gpio_in_get(i2c_slave *i2c);
void max7310_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler);

/* wm8750.c */
P
Paul Brook 已提交
78
void wm8750_data_req_set(DeviceState *dev,
79 80 81
                void (*data_req)(void *, int, int), void *opaque);
void wm8750_dac_dat(void *opaque, uint32_t sample);
uint32_t wm8750_adc_dat(void *opaque);
82 83
void *wm8750_dac_buffer(void *opaque, int samples);
void wm8750_dac_commit(void *opaque);
84
void wm8750_set_bclk_in(void *opaque, int new_hz);
85

B
balrog 已提交
86 87 88
/* tmp105.c */
void tmp105_set(i2c_slave *i2c, int temp);

B
balrog 已提交
89
/* lm832x.c */
P
Paul Brook 已提交
90
void lm832x_key_event(i2c_slave *i2c, int key, int state);
B
balrog 已提交
91

P
pbrook 已提交
92
#endif