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 --- |