bitbang_i2c.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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 "hw.h"
  13. #include "bitbang_i2c.h"
  14. #include "sysbus.h"
  15. //#define DEBUG_BITBANG_I2C
  16. #ifdef DEBUG_BITBANG_I2C
  17. #define DPRINTF(fmt, ...) \
  18. do { printf("bitbang_i2c: " fmt , ## __VA_ARGS__); } while (0)
  19. #else
  20. #define DPRINTF(fmt, ...) do {} while(0)
  21. #endif
  22. typedef enum bitbang_i2c_state {
  23. STOPPED = 0,
  24. SENDING_BIT7,
  25. SENDING_BIT6,
  26. SENDING_BIT5,
  27. SENDING_BIT4,
  28. SENDING_BIT3,
  29. SENDING_BIT2,
  30. SENDING_BIT1,
  31. SENDING_BIT0,
  32. WAITING_FOR_ACK,
  33. RECEIVING_BIT7,
  34. RECEIVING_BIT6,
  35. RECEIVING_BIT5,
  36. RECEIVING_BIT4,
  37. RECEIVING_BIT3,
  38. RECEIVING_BIT2,
  39. RECEIVING_BIT1,
  40. RECEIVING_BIT0,
  41. SENDING_ACK,
  42. SENT_NACK
  43. } bitbang_i2c_state;
  44. struct bitbang_i2c_interface {
  45. i2c_bus *bus;
  46. bitbang_i2c_state state;
  47. int last_data;
  48. int last_clock;
  49. int device_out;
  50. uint8_t buffer;
  51. int current_addr;
  52. };
  53. static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c)
  54. {
  55. DPRINTF("STOP\n");
  56. if (i2c->current_addr >= 0)
  57. i2c_end_transfer(i2c->bus);
  58. i2c->current_addr = -1;
  59. i2c->state = STOPPED;
  60. }
  61. /* Set device data pin. */
  62. static int bitbang_i2c_ret(bitbang_i2c_interface *i2c, int level)
  63. {
  64. i2c->device_out = level;
  65. //DPRINTF("%d %d %d\n", i2c->last_clock, i2c->last_data, i2c->device_out);
  66. return level & i2c->last_data;
  67. }
  68. /* Leave device data pin unodified. */
  69. static int bitbang_i2c_nop(bitbang_i2c_interface *i2c)
  70. {
  71. return bitbang_i2c_ret(i2c, i2c->device_out);
  72. }
  73. /* Returns data line level. */
  74. int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level)
  75. {
  76. int data;
  77. if (level != 0 && level != 1) {
  78. abort();
  79. }
  80. if (line == BITBANG_I2C_SDA) {
  81. if (level == i2c->last_data) {
  82. return bitbang_i2c_nop(i2c);
  83. }
  84. i2c->last_data = level;
  85. if (i2c->last_clock == 0) {
  86. return bitbang_i2c_nop(i2c);
  87. }
  88. if (level == 0) {
  89. DPRINTF("START\n");
  90. /* START condition. */
  91. i2c->state = SENDING_BIT7;
  92. i2c->current_addr = -1;
  93. } else {
  94. /* STOP condition. */
  95. bitbang_i2c_enter_stop(i2c);
  96. }
  97. return bitbang_i2c_ret(i2c, 1);
  98. }
  99. data = i2c->last_data;
  100. if (i2c->last_clock == level) {
  101. return bitbang_i2c_nop(i2c);
  102. }
  103. i2c->last_clock = level;
  104. if (level == 0) {
  105. /* State is set/read at the start of the clock pulse.
  106. release the data line at the end. */
  107. return bitbang_i2c_ret(i2c, 1);
  108. }
  109. switch (i2c->state) {
  110. case STOPPED:
  111. case SENT_NACK:
  112. return bitbang_i2c_ret(i2c, 1);
  113. case SENDING_BIT7 ... SENDING_BIT0:
  114. i2c->buffer = (i2c->buffer << 1) | data;
  115. /* will end up in WAITING_FOR_ACK */
  116. i2c->state++;
  117. return bitbang_i2c_ret(i2c, 1);
  118. case WAITING_FOR_ACK:
  119. if (i2c->current_addr < 0) {
  120. i2c->current_addr = i2c->buffer;
  121. DPRINTF("Address 0x%02x\n", i2c->current_addr);
  122. i2c_start_transfer(i2c->bus, i2c->current_addr >> 1,
  123. i2c->current_addr & 1);
  124. } else {
  125. DPRINTF("Sent 0x%02x\n", i2c->buffer);
  126. i2c_send(i2c->bus, i2c->buffer);
  127. }
  128. if (i2c->current_addr & 1) {
  129. i2c->state = RECEIVING_BIT7;
  130. } else {
  131. i2c->state = SENDING_BIT7;
  132. }
  133. return bitbang_i2c_ret(i2c, 0);
  134. case RECEIVING_BIT7:
  135. i2c->buffer = i2c_recv(i2c->bus);
  136. DPRINTF("RX byte 0x%02x\n", i2c->buffer);
  137. /* Fall through... */
  138. case RECEIVING_BIT6 ... RECEIVING_BIT0:
  139. data = i2c->buffer >> 7;
  140. /* will end up in SENDING_ACK */
  141. i2c->state++;
  142. i2c->buffer <<= 1;
  143. return bitbang_i2c_ret(i2c, data);
  144. case SENDING_ACK:
  145. i2c->state = RECEIVING_BIT7;
  146. if (data != 0) {
  147. DPRINTF("NACKED\n");
  148. i2c->state = SENT_NACK;
  149. i2c_nack(i2c->bus);
  150. } else {
  151. DPRINTF("ACKED\n");
  152. }
  153. return bitbang_i2c_ret(i2c, 1);
  154. }
  155. abort();
  156. }
  157. bitbang_i2c_interface *bitbang_i2c_init(i2c_bus *bus)
  158. {
  159. bitbang_i2c_interface *s;
  160. s = g_malloc0(sizeof(bitbang_i2c_interface));
  161. s->bus = bus;
  162. s->last_data = 1;
  163. s->last_clock = 1;
  164. s->device_out = 1;
  165. return s;
  166. }
  167. /* GPIO interface. */
  168. typedef struct {
  169. SysBusDevice busdev;
  170. MemoryRegion dummy_iomem;
  171. bitbang_i2c_interface *bitbang;
  172. int last_level;
  173. qemu_irq out;
  174. } GPIOI2CState;
  175. static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
  176. {
  177. GPIOI2CState *s = opaque;
  178. level = bitbang_i2c_set(s->bitbang, irq, level);
  179. if (level != s->last_level) {
  180. s->last_level = level;
  181. qemu_set_irq(s->out, level);
  182. }
  183. }
  184. static int gpio_i2c_init(SysBusDevice *dev)
  185. {
  186. GPIOI2CState *s = FROM_SYSBUS(GPIOI2CState, dev);
  187. i2c_bus *bus;
  188. memory_region_init(&s->dummy_iomem, "gpio_i2c", 0);
  189. sysbus_init_mmio(dev, &s->dummy_iomem);
  190. bus = i2c_init_bus(&dev->qdev, "i2c");
  191. s->bitbang = bitbang_i2c_init(bus);
  192. qdev_init_gpio_in(&dev->qdev, bitbang_i2c_gpio_set, 2);
  193. qdev_init_gpio_out(&dev->qdev, &s->out, 1);
  194. return 0;
  195. }
  196. static void gpio_i2c_class_init(ObjectClass *klass, void *data)
  197. {
  198. DeviceClass *dc = DEVICE_CLASS(klass);
  199. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  200. k->init = gpio_i2c_init;
  201. dc->desc = "Virtual GPIO to I2C bridge";
  202. }
  203. static const TypeInfo gpio_i2c_info = {
  204. .name = "gpio_i2c",
  205. .parent = TYPE_SYS_BUS_DEVICE,
  206. .instance_size = sizeof(GPIOI2CState),
  207. .class_init = gpio_i2c_class_init,
  208. };
  209. static void bitbang_i2c_register_types(void)
  210. {
  211. type_register_static(&gpio_i2c_info);
  212. }
  213. type_init(bitbang_i2c_register_types)