bitbang_i2c.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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/hw.h"
  13. #include "bitbang_i2c.h"
  14. #include "hw/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. I2CBus *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(I2CBus *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. #define TYPE_GPIO_I2C "gpio_i2c"
  169. #define GPIO_I2C(obj) OBJECT_CHECK(GPIOI2CState, (obj), TYPE_GPIO_I2C)
  170. typedef struct GPIOI2CState {
  171. SysBusDevice parent_obj;
  172. MemoryRegion dummy_iomem;
  173. bitbang_i2c_interface *bitbang;
  174. int last_level;
  175. qemu_irq out;
  176. } GPIOI2CState;
  177. static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
  178. {
  179. GPIOI2CState *s = opaque;
  180. level = bitbang_i2c_set(s->bitbang, irq, level);
  181. if (level != s->last_level) {
  182. s->last_level = level;
  183. qemu_set_irq(s->out, level);
  184. }
  185. }
  186. static int gpio_i2c_init(SysBusDevice *sbd)
  187. {
  188. DeviceState *dev = DEVICE(sbd);
  189. GPIOI2CState *s = GPIO_I2C(dev);
  190. I2CBus *bus;
  191. memory_region_init(&s->dummy_iomem, OBJECT(s), "gpio_i2c", 0);
  192. sysbus_init_mmio(sbd, &s->dummy_iomem);
  193. bus = i2c_init_bus(dev, "i2c");
  194. s->bitbang = bitbang_i2c_init(bus);
  195. qdev_init_gpio_in(dev, bitbang_i2c_gpio_set, 2);
  196. qdev_init_gpio_out(dev, &s->out, 1);
  197. return 0;
  198. }
  199. static void gpio_i2c_class_init(ObjectClass *klass, void *data)
  200. {
  201. DeviceClass *dc = DEVICE_CLASS(klass);
  202. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  203. k->init = gpio_i2c_init;
  204. set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
  205. dc->desc = "Virtual GPIO to I2C bridge";
  206. }
  207. static const TypeInfo gpio_i2c_info = {
  208. .name = TYPE_GPIO_I2C,
  209. .parent = TYPE_SYS_BUS_DEVICE,
  210. .instance_size = sizeof(GPIOI2CState),
  211. .class_init = gpio_i2c_class_init,
  212. };
  213. static void bitbang_i2c_register_types(void)
  214. {
  215. type_register_static(&gpio_i2c_info);
  216. }
  217. type_init(bitbang_i2c_register_types)