core.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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 "hw/i2c/i2c.h"
  10. struct I2CBus
  11. {
  12. BusState qbus;
  13. I2CSlave *current_dev;
  14. I2CSlave *dev;
  15. uint8_t saved_address;
  16. };
  17. static Property i2c_props[] = {
  18. DEFINE_PROP_UINT8("address", struct I2CSlave, address, 0),
  19. DEFINE_PROP_END_OF_LIST(),
  20. };
  21. #define TYPE_I2C_BUS "i2c-bus"
  22. #define I2C_BUS(obj) OBJECT_CHECK(I2CBus, (obj), TYPE_I2C_BUS)
  23. static const TypeInfo i2c_bus_info = {
  24. .name = TYPE_I2C_BUS,
  25. .parent = TYPE_BUS,
  26. .instance_size = sizeof(I2CBus),
  27. };
  28. static void i2c_bus_pre_save(void *opaque)
  29. {
  30. I2CBus *bus = opaque;
  31. bus->saved_address = bus->current_dev ? bus->current_dev->address : -1;
  32. }
  33. static int i2c_bus_post_load(void *opaque, int version_id)
  34. {
  35. I2CBus *bus = opaque;
  36. /* The bus is loaded before attached devices, so load and save the
  37. current device id. Devices will check themselves as loaded. */
  38. bus->current_dev = NULL;
  39. return 0;
  40. }
  41. static const VMStateDescription vmstate_i2c_bus = {
  42. .name = "i2c_bus",
  43. .version_id = 1,
  44. .minimum_version_id = 1,
  45. .pre_save = i2c_bus_pre_save,
  46. .post_load = i2c_bus_post_load,
  47. .fields = (VMStateField[]) {
  48. VMSTATE_UINT8(saved_address, I2CBus),
  49. VMSTATE_END_OF_LIST()
  50. }
  51. };
  52. /* Create a new I2C bus. */
  53. I2CBus *i2c_init_bus(DeviceState *parent, const char *name)
  54. {
  55. I2CBus *bus;
  56. bus = I2C_BUS(qbus_create(TYPE_I2C_BUS, parent, name));
  57. vmstate_register(NULL, -1, &vmstate_i2c_bus, bus);
  58. return bus;
  59. }
  60. void i2c_set_slave_address(I2CSlave *dev, uint8_t address)
  61. {
  62. dev->address = address;
  63. }
  64. /* Return nonzero if bus is busy. */
  65. int i2c_bus_busy(I2CBus *bus)
  66. {
  67. return bus->current_dev != NULL;
  68. }
  69. /* Returns non-zero if the address is not valid. */
  70. /* TODO: Make this handle multiple masters. */
  71. int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
  72. {
  73. BusChild *kid;
  74. I2CSlave *slave = NULL;
  75. I2CSlaveClass *sc;
  76. QTAILQ_FOREACH(kid, &bus->qbus.children, sibling) {
  77. DeviceState *qdev = kid->child;
  78. I2CSlave *candidate = I2C_SLAVE(qdev);
  79. if (candidate->address == address) {
  80. slave = candidate;
  81. break;
  82. }
  83. }
  84. if (!slave) {
  85. return 1;
  86. }
  87. sc = I2C_SLAVE_GET_CLASS(slave);
  88. /* If the bus is already busy, assume this is a repeated
  89. start condition. */
  90. bus->current_dev = slave;
  91. if (sc->event) {
  92. sc->event(slave, recv ? I2C_START_RECV : I2C_START_SEND);
  93. }
  94. return 0;
  95. }
  96. void i2c_end_transfer(I2CBus *bus)
  97. {
  98. I2CSlave *dev = bus->current_dev;
  99. I2CSlaveClass *sc;
  100. if (!dev) {
  101. return;
  102. }
  103. sc = I2C_SLAVE_GET_CLASS(dev);
  104. if (sc->event) {
  105. sc->event(dev, I2C_FINISH);
  106. }
  107. bus->current_dev = NULL;
  108. }
  109. int i2c_send(I2CBus *bus, uint8_t data)
  110. {
  111. I2CSlave *dev = bus->current_dev;
  112. I2CSlaveClass *sc;
  113. if (!dev) {
  114. return -1;
  115. }
  116. sc = I2C_SLAVE_GET_CLASS(dev);
  117. if (sc->send) {
  118. return sc->send(dev, data);
  119. }
  120. return -1;
  121. }
  122. int i2c_recv(I2CBus *bus)
  123. {
  124. I2CSlave *dev = bus->current_dev;
  125. I2CSlaveClass *sc;
  126. if (!dev) {
  127. return -1;
  128. }
  129. sc = I2C_SLAVE_GET_CLASS(dev);
  130. if (sc->recv) {
  131. return sc->recv(dev);
  132. }
  133. return -1;
  134. }
  135. void i2c_nack(I2CBus *bus)
  136. {
  137. I2CSlave *dev = bus->current_dev;
  138. I2CSlaveClass *sc;
  139. if (!dev) {
  140. return;
  141. }
  142. sc = I2C_SLAVE_GET_CLASS(dev);
  143. if (sc->event) {
  144. sc->event(dev, I2C_NACK);
  145. }
  146. }
  147. static int i2c_slave_post_load(void *opaque, int version_id)
  148. {
  149. I2CSlave *dev = opaque;
  150. I2CBus *bus;
  151. bus = I2C_BUS(qdev_get_parent_bus(DEVICE(dev)));
  152. if (bus->saved_address == dev->address) {
  153. bus->current_dev = dev;
  154. }
  155. return 0;
  156. }
  157. const VMStateDescription vmstate_i2c_slave = {
  158. .name = "I2CSlave",
  159. .version_id = 1,
  160. .minimum_version_id = 1,
  161. .post_load = i2c_slave_post_load,
  162. .fields = (VMStateField[]) {
  163. VMSTATE_UINT8(address, I2CSlave),
  164. VMSTATE_END_OF_LIST()
  165. }
  166. };
  167. static int i2c_slave_qdev_init(DeviceState *dev)
  168. {
  169. I2CSlave *s = I2C_SLAVE(dev);
  170. I2CSlaveClass *sc = I2C_SLAVE_GET_CLASS(s);
  171. return sc->init(s);
  172. }
  173. DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr)
  174. {
  175. DeviceState *dev;
  176. dev = qdev_create(&bus->qbus, name);
  177. qdev_prop_set_uint8(dev, "address", addr);
  178. qdev_init_nofail(dev);
  179. return dev;
  180. }
  181. static void i2c_slave_class_init(ObjectClass *klass, void *data)
  182. {
  183. DeviceClass *k = DEVICE_CLASS(klass);
  184. k->init = i2c_slave_qdev_init;
  185. set_bit(DEVICE_CATEGORY_MISC, k->categories);
  186. k->bus_type = TYPE_I2C_BUS;
  187. k->props = i2c_props;
  188. }
  189. static const TypeInfo i2c_slave_type_info = {
  190. .name = TYPE_I2C_SLAVE,
  191. .parent = TYPE_DEVICE,
  192. .instance_size = sizeof(I2CSlave),
  193. .abstract = true,
  194. .class_size = sizeof(I2CSlaveClass),
  195. .class_init = i2c_slave_class_init,
  196. };
  197. static void i2c_slave_register_types(void)
  198. {
  199. type_register_static(&i2c_bus_info);
  200. type_register_static(&i2c_slave_type_info);
  201. }
  202. type_init(i2c_slave_register_types)