2
0

i2c.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * QEMU I2C bus interface.
  3. *
  4. * Copyright (c) 2007 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licensed under the LGPL.
  8. */
  9. #include "i2c.h"
  10. struct i2c_bus
  11. {
  12. BusState qbus;
  13. i2c_slave *current_dev;
  14. i2c_slave *dev;
  15. uint8_t saved_address;
  16. };
  17. static struct BusInfo i2c_bus_info = {
  18. .name = "I2C",
  19. .size = sizeof(i2c_bus),
  20. .props = (Property[]) {
  21. DEFINE_PROP_UINT8("address", struct i2c_slave, address, 0),
  22. DEFINE_PROP_END_OF_LIST(),
  23. }
  24. };
  25. static void i2c_bus_pre_save(void *opaque)
  26. {
  27. i2c_bus *bus = opaque;
  28. bus->saved_address = bus->current_dev ? bus->current_dev->address : -1;
  29. }
  30. static int i2c_bus_post_load(void *opaque, int version_id)
  31. {
  32. i2c_bus *bus = opaque;
  33. /* The bus is loaded before attached devices, so load and save the
  34. current device id. Devices will check themselves as loaded. */
  35. bus->current_dev = NULL;
  36. return 0;
  37. }
  38. static const VMStateDescription vmstate_i2c_bus = {
  39. .name = "i2c_bus",
  40. .version_id = 1,
  41. .minimum_version_id = 1,
  42. .minimum_version_id_old = 1,
  43. .pre_save = i2c_bus_pre_save,
  44. .post_load = i2c_bus_post_load,
  45. .fields = (VMStateField []) {
  46. VMSTATE_UINT8(saved_address, i2c_bus),
  47. VMSTATE_END_OF_LIST()
  48. }
  49. };
  50. /* Create a new I2C bus. */
  51. i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
  52. {
  53. i2c_bus *bus;
  54. bus = FROM_QBUS(i2c_bus, qbus_create(&i2c_bus_info, parent, name));
  55. vmstate_register(NULL, -1, &vmstate_i2c_bus, bus);
  56. return bus;
  57. }
  58. void i2c_set_slave_address(i2c_slave *dev, uint8_t address)
  59. {
  60. dev->address = address;
  61. }
  62. /* Return nonzero if bus is busy. */
  63. int i2c_bus_busy(i2c_bus *bus)
  64. {
  65. return bus->current_dev != NULL;
  66. }
  67. /* Returns non-zero if the address is not valid. */
  68. /* TODO: Make this handle multiple masters. */
  69. int i2c_start_transfer(i2c_bus *bus, uint8_t address, int recv)
  70. {
  71. DeviceState *qdev;
  72. i2c_slave *slave = NULL;
  73. QLIST_FOREACH(qdev, &bus->qbus.children, sibling) {
  74. i2c_slave *candidate = I2C_SLAVE_FROM_QDEV(qdev);
  75. if (candidate->address == address) {
  76. slave = candidate;
  77. break;
  78. }
  79. }
  80. if (!slave)
  81. return 1;
  82. /* If the bus is already busy, assume this is a repeated
  83. start condition. */
  84. bus->current_dev = slave;
  85. slave->info->event(slave, recv ? I2C_START_RECV : I2C_START_SEND);
  86. return 0;
  87. }
  88. void i2c_end_transfer(i2c_bus *bus)
  89. {
  90. i2c_slave *dev = bus->current_dev;
  91. if (!dev)
  92. return;
  93. dev->info->event(dev, I2C_FINISH);
  94. bus->current_dev = NULL;
  95. }
  96. int i2c_send(i2c_bus *bus, uint8_t data)
  97. {
  98. i2c_slave *dev = bus->current_dev;
  99. if (!dev)
  100. return -1;
  101. return dev->info->send(dev, data);
  102. }
  103. int i2c_recv(i2c_bus *bus)
  104. {
  105. i2c_slave *dev = bus->current_dev;
  106. if (!dev)
  107. return -1;
  108. return dev->info->recv(dev);
  109. }
  110. void i2c_nack(i2c_bus *bus)
  111. {
  112. i2c_slave *dev = bus->current_dev;
  113. if (!dev)
  114. return;
  115. dev->info->event(dev, I2C_NACK);
  116. }
  117. static int i2c_slave_post_load(void *opaque, int version_id)
  118. {
  119. i2c_slave *dev = opaque;
  120. i2c_bus *bus;
  121. bus = FROM_QBUS(i2c_bus, qdev_get_parent_bus(&dev->qdev));
  122. if (bus->saved_address == dev->address) {
  123. bus->current_dev = dev;
  124. }
  125. return 0;
  126. }
  127. const VMStateDescription vmstate_i2c_slave = {
  128. .name = "i2c_slave",
  129. .version_id = 1,
  130. .minimum_version_id = 1,
  131. .minimum_version_id_old = 1,
  132. .post_load = i2c_slave_post_load,
  133. .fields = (VMStateField []) {
  134. VMSTATE_UINT8(address, i2c_slave),
  135. VMSTATE_END_OF_LIST()
  136. }
  137. };
  138. static int i2c_slave_qdev_init(DeviceState *dev, DeviceInfo *base)
  139. {
  140. I2CSlaveInfo *info = container_of(base, I2CSlaveInfo, qdev);
  141. i2c_slave *s = I2C_SLAVE_FROM_QDEV(dev);
  142. s->info = info;
  143. return info->init(s);
  144. }
  145. void i2c_register_slave(I2CSlaveInfo *info)
  146. {
  147. assert(info->qdev.size >= sizeof(i2c_slave));
  148. info->qdev.init = i2c_slave_qdev_init;
  149. info->qdev.bus_info = &i2c_bus_info;
  150. qdev_register(&info->qdev);
  151. }
  152. DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, uint8_t addr)
  153. {
  154. DeviceState *dev;
  155. dev = qdev_create(&bus->qbus, name);
  156. qdev_prop_set_uint8(dev, "address", addr);
  157. qdev_init_nofail(dev);
  158. return dev;
  159. }