bitbang_i2c.c (0094908375d280c1a4e8b932d8b133a41fb3bdf8) bitbang_i2c.c (41742927ee37527462a13160380860653d4f1c84)
1/*
2 * Bit-Bang i2c emulation extracted from
3 * Marvell MV88W8618 / Freecom MusicPal emulation.
4 *
5 * Copyright (c) 2008 Jan Kiszka
6 *
7 * This code is licensed under the GNU GPL v2.
8 *

--- 11 unchanged lines hidden (view full) ---

20
21#ifdef DEBUG_BITBANG_I2C
22#define DPRINTF(fmt, ...) \
23do { printf("bitbang_i2c: " fmt , ## __VA_ARGS__); } while (0)
24#else
25#define DPRINTF(fmt, ...) do {} while(0)
26#endif
27
1/*
2 * Bit-Bang i2c emulation extracted from
3 * Marvell MV88W8618 / Freecom MusicPal emulation.
4 *
5 * Copyright (c) 2008 Jan Kiszka
6 *
7 * This code is licensed under the GNU GPL v2.
8 *

--- 11 unchanged lines hidden (view full) ---

20
21#ifdef DEBUG_BITBANG_I2C
22#define DPRINTF(fmt, ...) \
23do { printf("bitbang_i2c: " fmt , ## __VA_ARGS__); } while (0)
24#else
25#define DPRINTF(fmt, ...) do {} while(0)
26#endif
27
28typedef enum bitbang_i2c_state {
29 STOPPED = 0,
30 SENDING_BIT7,
31 SENDING_BIT6,
32 SENDING_BIT5,
33 SENDING_BIT4,
34 SENDING_BIT3,
35 SENDING_BIT2,
36 SENDING_BIT1,
37 SENDING_BIT0,
38 WAITING_FOR_ACK,
39 RECEIVING_BIT7,
40 RECEIVING_BIT6,
41 RECEIVING_BIT5,
42 RECEIVING_BIT4,
43 RECEIVING_BIT3,
44 RECEIVING_BIT2,
45 RECEIVING_BIT1,
46 RECEIVING_BIT0,
47 SENDING_ACK,
48 SENT_NACK
49} bitbang_i2c_state;
50
51struct bitbang_i2c_interface {
52 I2CBus *bus;
53 bitbang_i2c_state state;
54 int last_data;
55 int last_clock;
56 int device_out;
57 uint8_t buffer;
58 int current_addr;
59};
60
61static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c)
62{
63 DPRINTF("STOP\n");
64 if (i2c->current_addr >= 0)
65 i2c_end_transfer(i2c->bus);
66 i2c->current_addr = -1;
67 i2c->state = STOPPED;
68}

--- 110 unchanged lines hidden (view full) ---

179 } else {
180 DPRINTF("ACKED\n");
181 }
182 return bitbang_i2c_ret(i2c, 1);
183 }
184 abort();
185}
186
28static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c)
29{
30 DPRINTF("STOP\n");
31 if (i2c->current_addr >= 0)
32 i2c_end_transfer(i2c->bus);
33 i2c->current_addr = -1;
34 i2c->state = STOPPED;
35}

--- 110 unchanged lines hidden (view full) ---

146 } else {
147 DPRINTF("ACKED\n");
148 }
149 return bitbang_i2c_ret(i2c, 1);
150 }
151 abort();
152}
153
187bitbang_i2c_interface *bitbang_i2c_init(I2CBus *bus)
154void bitbang_i2c_init(bitbang_i2c_interface *s, I2CBus *bus)
188{
155{
189 bitbang_i2c_interface *s;
190
191 s = g_malloc0(sizeof(bitbang_i2c_interface));
192
193 s->bus = bus;
194 s->last_data = 1;
195 s->last_clock = 1;
196 s->device_out = 1;
156 s->bus = bus;
157 s->last_data = 1;
158 s->last_clock = 1;
159 s->device_out = 1;
197
198 return s;
199}
200
201/* GPIO interface. */
202
203#define TYPE_GPIO_I2C "gpio_i2c"
204#define GPIO_I2C(obj) OBJECT_CHECK(GPIOI2CState, (obj), TYPE_GPIO_I2C)
205
206typedef struct GPIOI2CState {
207 SysBusDevice parent_obj;
208
209 MemoryRegion dummy_iomem;
160}
161
162/* GPIO interface. */
163
164#define TYPE_GPIO_I2C "gpio_i2c"
165#define GPIO_I2C(obj) OBJECT_CHECK(GPIOI2CState, (obj), TYPE_GPIO_I2C)
166
167typedef struct GPIOI2CState {
168 SysBusDevice parent_obj;
169
170 MemoryRegion dummy_iomem;
210 bitbang_i2c_interface *bitbang;
171 bitbang_i2c_interface bitbang;
211 int last_level;
212 qemu_irq out;
213} GPIOI2CState;
214
215static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
216{
217 GPIOI2CState *s = opaque;
218
172 int last_level;
173 qemu_irq out;
174} GPIOI2CState;
175
176static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
177{
178 GPIOI2CState *s = opaque;
179
219 level = bitbang_i2c_set(s->bitbang, irq, level);
180 level = bitbang_i2c_set(&s->bitbang, irq, level);
220 if (level != s->last_level) {
221 s->last_level = level;
222 qemu_set_irq(s->out, level);
223 }
224}
225
226static void gpio_i2c_init(Object *obj)
227{
228 DeviceState *dev = DEVICE(obj);
229 GPIOI2CState *s = GPIO_I2C(obj);
230 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
231 I2CBus *bus;
232
233 memory_region_init(&s->dummy_iomem, obj, "gpio_i2c", 0);
234 sysbus_init_mmio(sbd, &s->dummy_iomem);
235
236 bus = i2c_init_bus(dev, "i2c");
181 if (level != s->last_level) {
182 s->last_level = level;
183 qemu_set_irq(s->out, level);
184 }
185}
186
187static void gpio_i2c_init(Object *obj)
188{
189 DeviceState *dev = DEVICE(obj);
190 GPIOI2CState *s = GPIO_I2C(obj);
191 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
192 I2CBus *bus;
193
194 memory_region_init(&s->dummy_iomem, obj, "gpio_i2c", 0);
195 sysbus_init_mmio(sbd, &s->dummy_iomem);
196
197 bus = i2c_init_bus(dev, "i2c");
237 s->bitbang = bitbang_i2c_init(bus);
198 bitbang_i2c_init(&s->bitbang, bus);
238
239 qdev_init_gpio_in(dev, bitbang_i2c_gpio_set, 2);
240 qdev_init_gpio_out(dev, &s->out, 1);
241}
242
243static void gpio_i2c_class_init(ObjectClass *klass, void *data)
244{
245 DeviceClass *dc = DEVICE_CLASS(klass);

--- 19 unchanged lines hidden ---
199
200 qdev_init_gpio_in(dev, bitbang_i2c_gpio_set, 2);
201 qdev_init_gpio_out(dev, &s->out, 1);
202}
203
204static void gpio_i2c_class_init(ObjectClass *klass, void *data)
205{
206 DeviceClass *dc = DEVICE_CLASS(klass);

--- 19 unchanged lines hidden ---