bitbang_i2c.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. *
  9. * Contributions after 2012-01-13 are licensed under the terms of the
  10. * GNU GPL, version 2 or (at your option) any later version.
  11. */
  12. #include "qemu/osdep.h"
  13. #include "hw/irq.h"
  14. #include "hw/i2c/bitbang_i2c.h"
  15. #include "hw/sysbus.h"
  16. #include "qemu/module.h"
  17. #include "qom/object.h"
  18. //#define DEBUG_BITBANG_I2C
  19. #ifdef DEBUG_BITBANG_I2C
  20. #define DPRINTF(fmt, ...) \
  21. do { printf("bitbang_i2c: " fmt , ## __VA_ARGS__); } while (0)
  22. #else
  23. #define DPRINTF(fmt, ...) do {} while(0)
  24. #endif
  25. static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c)
  26. {
  27. DPRINTF("STOP\n");
  28. if (i2c->current_addr >= 0)
  29. i2c_end_transfer(i2c->bus);
  30. i2c->current_addr = -1;
  31. i2c->state = STOPPED;
  32. }
  33. /* Set device data pin. */
  34. static int bitbang_i2c_ret(bitbang_i2c_interface *i2c, int level)
  35. {
  36. i2c->device_out = level;
  37. //DPRINTF("%d %d %d\n", i2c->last_clock, i2c->last_data, i2c->device_out);
  38. return level & i2c->last_data;
  39. }
  40. /* Leave device data pin unodified. */
  41. static int bitbang_i2c_nop(bitbang_i2c_interface *i2c)
  42. {
  43. return bitbang_i2c_ret(i2c, i2c->device_out);
  44. }
  45. /* Returns data line level. */
  46. int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level)
  47. {
  48. int data;
  49. if (level != 0 && level != 1) {
  50. abort();
  51. }
  52. if (line == BITBANG_I2C_SDA) {
  53. if (level == i2c->last_data) {
  54. return bitbang_i2c_nop(i2c);
  55. }
  56. i2c->last_data = level;
  57. if (i2c->last_clock == 0) {
  58. return bitbang_i2c_nop(i2c);
  59. }
  60. if (level == 0) {
  61. DPRINTF("START\n");
  62. /* START condition. */
  63. i2c->state = SENDING_BIT7;
  64. i2c->current_addr = -1;
  65. } else {
  66. /* STOP condition. */
  67. bitbang_i2c_enter_stop(i2c);
  68. }
  69. return bitbang_i2c_ret(i2c, 1);
  70. }
  71. data = i2c->last_data;
  72. if (i2c->last_clock == level) {
  73. return bitbang_i2c_nop(i2c);
  74. }
  75. i2c->last_clock = level;
  76. if (level == 0) {
  77. /* State is set/read at the start of the clock pulse.
  78. release the data line at the end. */
  79. return bitbang_i2c_ret(i2c, 1);
  80. }
  81. switch (i2c->state) {
  82. case STOPPED:
  83. case SENT_NACK:
  84. return bitbang_i2c_ret(i2c, 1);
  85. case SENDING_BIT7 ... SENDING_BIT0:
  86. i2c->buffer = (i2c->buffer << 1) | data;
  87. /* will end up in WAITING_FOR_ACK */
  88. i2c->state++;
  89. return bitbang_i2c_ret(i2c, 1);
  90. case WAITING_FOR_ACK:
  91. {
  92. int ret;
  93. if (i2c->current_addr < 0) {
  94. i2c->current_addr = i2c->buffer;
  95. DPRINTF("Address 0x%02x\n", i2c->current_addr);
  96. ret = i2c_start_transfer(i2c->bus, i2c->current_addr >> 1,
  97. i2c->current_addr & 1);
  98. } else {
  99. DPRINTF("Sent 0x%02x\n", i2c->buffer);
  100. ret = i2c_send(i2c->bus, i2c->buffer);
  101. }
  102. if (ret) {
  103. /* NACK (either addressing a nonexistent device, or the
  104. * device we were sending to decided to NACK us).
  105. */
  106. DPRINTF("Got NACK\n");
  107. bitbang_i2c_enter_stop(i2c);
  108. return bitbang_i2c_ret(i2c, 1);
  109. }
  110. if (i2c->current_addr & 1) {
  111. i2c->state = RECEIVING_BIT7;
  112. } else {
  113. i2c->state = SENDING_BIT7;
  114. }
  115. return bitbang_i2c_ret(i2c, 0);
  116. }
  117. case RECEIVING_BIT7:
  118. i2c->buffer = i2c_recv(i2c->bus);
  119. DPRINTF("RX byte 0x%02x\n", i2c->buffer);
  120. /* Fall through... */
  121. case RECEIVING_BIT6 ... RECEIVING_BIT0:
  122. data = i2c->buffer >> 7;
  123. /* will end up in SENDING_ACK */
  124. i2c->state++;
  125. i2c->buffer <<= 1;
  126. return bitbang_i2c_ret(i2c, data);
  127. case SENDING_ACK:
  128. i2c->state = RECEIVING_BIT7;
  129. if (data != 0) {
  130. DPRINTF("NACKED\n");
  131. i2c->state = SENT_NACK;
  132. i2c_nack(i2c->bus);
  133. } else {
  134. DPRINTF("ACKED\n");
  135. }
  136. return bitbang_i2c_ret(i2c, 1);
  137. }
  138. abort();
  139. }
  140. void bitbang_i2c_init(bitbang_i2c_interface *s, I2CBus *bus)
  141. {
  142. s->bus = bus;
  143. s->last_data = 1;
  144. s->last_clock = 1;
  145. s->device_out = 1;
  146. }
  147. /* GPIO interface. */
  148. #define TYPE_GPIO_I2C "gpio_i2c"
  149. OBJECT_DECLARE_SIMPLE_TYPE(GPIOI2CState, GPIO_I2C)
  150. struct GPIOI2CState {
  151. SysBusDevice parent_obj;
  152. MemoryRegion dummy_iomem;
  153. bitbang_i2c_interface bitbang;
  154. int last_level;
  155. qemu_irq out;
  156. };
  157. static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
  158. {
  159. GPIOI2CState *s = opaque;
  160. level = bitbang_i2c_set(&s->bitbang, irq, level);
  161. if (level != s->last_level) {
  162. s->last_level = level;
  163. qemu_set_irq(s->out, level);
  164. }
  165. }
  166. static void gpio_i2c_init(Object *obj)
  167. {
  168. DeviceState *dev = DEVICE(obj);
  169. GPIOI2CState *s = GPIO_I2C(obj);
  170. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  171. I2CBus *bus;
  172. memory_region_init(&s->dummy_iomem, obj, "gpio_i2c", 0);
  173. sysbus_init_mmio(sbd, &s->dummy_iomem);
  174. bus = i2c_init_bus(dev, "i2c");
  175. bitbang_i2c_init(&s->bitbang, bus);
  176. qdev_init_gpio_in(dev, bitbang_i2c_gpio_set, 2);
  177. qdev_init_gpio_out(dev, &s->out, 1);
  178. }
  179. static void gpio_i2c_class_init(ObjectClass *klass, void *data)
  180. {
  181. DeviceClass *dc = DEVICE_CLASS(klass);
  182. set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
  183. dc->desc = "Virtual GPIO to I2C bridge";
  184. }
  185. static const TypeInfo gpio_i2c_info = {
  186. .name = TYPE_GPIO_I2C,
  187. .parent = TYPE_SYS_BUS_DEVICE,
  188. .instance_size = sizeof(GPIOI2CState),
  189. .instance_init = gpio_i2c_init,
  190. .class_init = gpio_i2c_class_init,
  191. };
  192. static void bitbang_i2c_register_types(void)
  193. {
  194. type_register_static(&gpio_i2c_info);
  195. }
  196. type_init(bitbang_i2c_register_types)