Revision 5b7f5327 hw/i2c.c
b/hw/i2c.c | ||
---|---|---|
14 | 14 |
BusState qbus; |
15 | 15 |
i2c_slave *current_dev; |
16 | 16 |
i2c_slave *dev; |
17 |
int saved_address;
|
|
17 |
uint8_t saved_address;
|
|
18 | 18 |
}; |
19 | 19 |
|
20 | 20 |
static struct BusInfo i2c_bus_info = { |
21 | 21 |
.name = "I2C", |
22 | 22 |
.size = sizeof(i2c_bus), |
23 | 23 |
.props = (Property[]) { |
24 |
DEFINE_PROP_UINT32("address", struct i2c_slave, address, 0),
|
|
24 |
DEFINE_PROP_UINT8("address", struct i2c_slave, address, 0),
|
|
25 | 25 |
DEFINE_PROP_END_OF_LIST(), |
26 | 26 |
} |
27 | 27 |
}; |
... | ... | |
29 | 29 |
static void i2c_bus_save(QEMUFile *f, void *opaque) |
30 | 30 |
{ |
31 | 31 |
i2c_bus *bus = (i2c_bus *)opaque; |
32 |
bus->saved_address = bus->current_dev ? bus->current_dev->address : -1; |
|
32 | 33 |
|
33 |
qemu_put_byte(f, bus->current_dev ? bus->current_dev->address : -1);
|
|
34 |
qemu_put_8s(f, &bus->saved_address);
|
|
34 | 35 |
} |
35 | 36 |
|
36 | 37 |
static int i2c_bus_load(QEMUFile *f, void *opaque, int version_id) |
... | ... | |
42 | 43 |
|
43 | 44 |
/* The bus is loaded before attached devices, so load and save the |
44 | 45 |
current device id. Devices will check themselves as loaded. */ |
45 |
bus->saved_address = (int8_t) qemu_get_byte(f);
|
|
46 |
qemu_get_8s(f, &bus->saved_address);
|
|
46 | 47 |
bus->current_dev = NULL; |
47 | 48 |
|
48 | 49 |
return 0; |
... | ... | |
58 | 59 |
return bus; |
59 | 60 |
} |
60 | 61 |
|
61 |
void i2c_set_slave_address(i2c_slave *dev, int address)
|
|
62 |
void i2c_set_slave_address(i2c_slave *dev, uint8_t address)
|
|
62 | 63 |
{ |
63 | 64 |
dev->address = address; |
64 | 65 |
} |
... | ... | |
71 | 72 |
|
72 | 73 |
/* Returns non-zero if the address is not valid. */ |
73 | 74 |
/* TODO: Make this handle multiple masters. */ |
74 |
int i2c_start_transfer(i2c_bus *bus, int address, int recv)
|
|
75 |
int i2c_start_transfer(i2c_bus *bus, uint8_t address, int recv)
|
|
75 | 76 |
{ |
76 | 77 |
DeviceState *qdev; |
77 | 78 |
i2c_slave *slave = NULL; |
... | ... | |
136 | 137 |
|
137 | 138 |
void i2c_slave_save(QEMUFile *f, i2c_slave *dev) |
138 | 139 |
{ |
139 |
qemu_put_byte(f, dev->address);
|
|
140 |
qemu_put_8s(f, &dev->address);
|
|
140 | 141 |
} |
141 | 142 |
|
142 | 143 |
void i2c_slave_load(QEMUFile *f, i2c_slave *dev) |
143 | 144 |
{ |
144 | 145 |
i2c_bus *bus; |
145 | 146 |
bus = FROM_QBUS(i2c_bus, qdev_get_parent_bus(&dev->qdev)); |
146 |
dev->address = qemu_get_byte(f);
|
|
147 |
qemu_get_8s(f, &dev->address);
|
|
147 | 148 |
if (bus->saved_address == dev->address) { |
148 | 149 |
bus->current_dev = dev; |
149 | 150 |
} |
... | ... | |
167 | 168 |
qdev_register(&info->qdev); |
168 | 169 |
} |
169 | 170 |
|
170 |
DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, int addr)
|
|
171 |
DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, uint8_t addr)
|
|
171 | 172 |
{ |
172 | 173 |
DeviceState *dev; |
173 | 174 |
|
174 | 175 |
dev = qdev_create(&bus->qbus, name); |
175 |
qdev_prop_set_uint32(dev, "address", addr);
|
|
176 |
qdev_prop_set_uint8(dev, "address", addr);
|
|
176 | 177 |
qdev_init(dev); |
177 | 178 |
return dev; |
178 | 179 |
} |
Also available in: Unified diff