2
0

allwinner-i2c.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /*
  2. * Allwinner I2C Bus Serial Interface Emulation
  3. *
  4. * Copyright (C) 2022 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
  5. *
  6. * This file is derived from IMX I2C controller,
  7. * by Jean-Christophe DUBOIS .
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU General Public License as published by the
  11. * Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful, but WITHOUT
  15. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  17. * for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License along
  20. * with this program; if not, see <http://www.gnu.org/licenses/>.
  21. *
  22. * SPDX-License-Identifier: MIT
  23. */
  24. #include "qemu/osdep.h"
  25. #include "hw/i2c/allwinner-i2c.h"
  26. #include "hw/irq.h"
  27. #include "migration/vmstate.h"
  28. #include "hw/i2c/i2c.h"
  29. #include "qemu/log.h"
  30. #include "trace.h"
  31. #include "qemu/module.h"
  32. /* Allwinner I2C memory map */
  33. #define TWI_ADDR_REG 0x00 /* slave address register */
  34. #define TWI_XADDR_REG 0x04 /* extended slave address register */
  35. #define TWI_DATA_REG 0x08 /* data register */
  36. #define TWI_CNTR_REG 0x0c /* control register */
  37. #define TWI_STAT_REG 0x10 /* status register */
  38. #define TWI_CCR_REG 0x14 /* clock control register */
  39. #define TWI_SRST_REG 0x18 /* software reset register */
  40. #define TWI_EFR_REG 0x1c /* enhance feature register */
  41. #define TWI_LCR_REG 0x20 /* line control register */
  42. /* Used only in slave mode, do not set */
  43. #define TWI_ADDR_RESET 0
  44. #define TWI_XADDR_RESET 0
  45. /* Data register */
  46. #define TWI_DATA_MASK 0xFF
  47. #define TWI_DATA_RESET 0
  48. /* Control register */
  49. #define TWI_CNTR_INT_EN (1 << 7)
  50. #define TWI_CNTR_BUS_EN (1 << 6)
  51. #define TWI_CNTR_M_STA (1 << 5)
  52. #define TWI_CNTR_M_STP (1 << 4)
  53. #define TWI_CNTR_INT_FLAG (1 << 3)
  54. #define TWI_CNTR_A_ACK (1 << 2)
  55. #define TWI_CNTR_MASK 0xFC
  56. #define TWI_CNTR_RESET 0
  57. /* Status register */
  58. #define TWI_STAT_MASK 0xF8
  59. #define TWI_STAT_RESET 0xF8
  60. /* Clock register */
  61. #define TWI_CCR_CLK_M_MASK 0x78
  62. #define TWI_CCR_CLK_N_MASK 0x07
  63. #define TWI_CCR_MASK 0x7F
  64. #define TWI_CCR_RESET 0
  65. /* Soft reset */
  66. #define TWI_SRST_MASK 0x01
  67. #define TWI_SRST_RESET 0
  68. /* Enhance feature */
  69. #define TWI_EFR_MASK 0x03
  70. #define TWI_EFR_RESET 0
  71. /* Line control */
  72. #define TWI_LCR_SCL_STATE (1 << 5)
  73. #define TWI_LCR_SDA_STATE (1 << 4)
  74. #define TWI_LCR_SCL_CTL (1 << 3)
  75. #define TWI_LCR_SCL_CTL_EN (1 << 2)
  76. #define TWI_LCR_SDA_CTL (1 << 1)
  77. #define TWI_LCR_SDA_CTL_EN (1 << 0)
  78. #define TWI_LCR_MASK 0x3F
  79. #define TWI_LCR_RESET 0x3A
  80. /* Status value in STAT register is shifted by 3 bits */
  81. #define TWI_STAT_SHIFT 3
  82. #define STAT_FROM_STA(x) ((x) << TWI_STAT_SHIFT)
  83. #define STAT_TO_STA(x) ((x) >> TWI_STAT_SHIFT)
  84. enum {
  85. STAT_BUS_ERROR = 0,
  86. /* Master mode */
  87. STAT_M_STA_TX,
  88. STAT_M_RSTA_TX,
  89. STAT_M_ADDR_WR_ACK,
  90. STAT_M_ADDR_WR_NACK,
  91. STAT_M_DATA_TX_ACK,
  92. STAT_M_DATA_TX_NACK,
  93. STAT_M_ARB_LOST,
  94. STAT_M_ADDR_RD_ACK,
  95. STAT_M_ADDR_RD_NACK,
  96. STAT_M_DATA_RX_ACK,
  97. STAT_M_DATA_RX_NACK,
  98. /* Slave mode */
  99. STAT_S_ADDR_WR_ACK,
  100. STAT_S_ARB_LOST_AW_ACK,
  101. STAT_S_GCA_ACK,
  102. STAT_S_ARB_LOST_GCA_ACK,
  103. STAT_S_DATA_RX_SA_ACK,
  104. STAT_S_DATA_RX_SA_NACK,
  105. STAT_S_DATA_RX_GCA_ACK,
  106. STAT_S_DATA_RX_GCA_NACK,
  107. STAT_S_STP_RSTA,
  108. STAT_S_ADDR_RD_ACK,
  109. STAT_S_ARB_LOST_AR_ACK,
  110. STAT_S_DATA_TX_ACK,
  111. STAT_S_DATA_TX_NACK,
  112. STAT_S_LB_TX_ACK,
  113. /* Master mode, 10-bit */
  114. STAT_M_2ND_ADDR_WR_ACK,
  115. STAT_M_2ND_ADDR_WR_NACK,
  116. /* Idle */
  117. STAT_IDLE = 0x1f
  118. } TWI_STAT_STA;
  119. static const char *allwinner_i2c_get_regname(unsigned offset)
  120. {
  121. switch (offset) {
  122. case TWI_ADDR_REG:
  123. return "ADDR";
  124. case TWI_XADDR_REG:
  125. return "XADDR";
  126. case TWI_DATA_REG:
  127. return "DATA";
  128. case TWI_CNTR_REG:
  129. return "CNTR";
  130. case TWI_STAT_REG:
  131. return "STAT";
  132. case TWI_CCR_REG:
  133. return "CCR";
  134. case TWI_SRST_REG:
  135. return "SRST";
  136. case TWI_EFR_REG:
  137. return "EFR";
  138. case TWI_LCR_REG:
  139. return "LCR";
  140. default:
  141. return "[?]";
  142. }
  143. }
  144. static inline bool allwinner_i2c_is_reset(AWI2CState *s)
  145. {
  146. return s->srst & TWI_SRST_MASK;
  147. }
  148. static inline bool allwinner_i2c_bus_is_enabled(AWI2CState *s)
  149. {
  150. return s->cntr & TWI_CNTR_BUS_EN;
  151. }
  152. static inline bool allwinner_i2c_interrupt_is_enabled(AWI2CState *s)
  153. {
  154. return s->cntr & TWI_CNTR_INT_EN;
  155. }
  156. static void allwinner_i2c_reset_hold(Object *obj, ResetType type)
  157. {
  158. AWI2CState *s = AW_I2C(obj);
  159. if (STAT_TO_STA(s->stat) != STAT_IDLE) {
  160. i2c_end_transfer(s->bus);
  161. }
  162. s->addr = TWI_ADDR_RESET;
  163. s->xaddr = TWI_XADDR_RESET;
  164. s->data = TWI_DATA_RESET;
  165. s->cntr = TWI_CNTR_RESET;
  166. s->stat = TWI_STAT_RESET;
  167. s->ccr = TWI_CCR_RESET;
  168. s->srst = TWI_SRST_RESET;
  169. s->efr = TWI_EFR_RESET;
  170. s->lcr = TWI_LCR_RESET;
  171. }
  172. static inline void allwinner_i2c_raise_interrupt(AWI2CState *s)
  173. {
  174. /*
  175. * Raise an interrupt if the device is not reset and it is configured
  176. * to generate some interrupts.
  177. */
  178. if (!allwinner_i2c_is_reset(s) && allwinner_i2c_bus_is_enabled(s)) {
  179. if (STAT_TO_STA(s->stat) != STAT_IDLE) {
  180. s->cntr |= TWI_CNTR_INT_FLAG;
  181. if (allwinner_i2c_interrupt_is_enabled(s)) {
  182. qemu_irq_raise(s->irq);
  183. }
  184. }
  185. }
  186. }
  187. static uint64_t allwinner_i2c_read(void *opaque, hwaddr offset,
  188. unsigned size)
  189. {
  190. uint16_t value;
  191. AWI2CState *s = AW_I2C(opaque);
  192. switch (offset) {
  193. case TWI_ADDR_REG:
  194. value = s->addr;
  195. break;
  196. case TWI_XADDR_REG:
  197. value = s->xaddr;
  198. break;
  199. case TWI_DATA_REG:
  200. if ((STAT_TO_STA(s->stat) == STAT_M_ADDR_RD_ACK) ||
  201. (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_ACK) ||
  202. (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_NACK)) {
  203. /* Get the next byte */
  204. s->data = i2c_recv(s->bus);
  205. if (s->cntr & TWI_CNTR_A_ACK) {
  206. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
  207. } else {
  208. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
  209. }
  210. allwinner_i2c_raise_interrupt(s);
  211. }
  212. value = s->data;
  213. break;
  214. case TWI_CNTR_REG:
  215. value = s->cntr;
  216. break;
  217. case TWI_STAT_REG:
  218. value = s->stat;
  219. /*
  220. * If polling when reading then change state to indicate data
  221. * is available
  222. */
  223. if (STAT_TO_STA(s->stat) == STAT_M_ADDR_RD_ACK) {
  224. if (s->cntr & TWI_CNTR_A_ACK) {
  225. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
  226. } else {
  227. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
  228. }
  229. allwinner_i2c_raise_interrupt(s);
  230. }
  231. break;
  232. case TWI_CCR_REG:
  233. value = s->ccr;
  234. break;
  235. case TWI_SRST_REG:
  236. value = s->srst;
  237. break;
  238. case TWI_EFR_REG:
  239. value = s->efr;
  240. break;
  241. case TWI_LCR_REG:
  242. value = s->lcr;
  243. break;
  244. default:
  245. qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
  246. HWADDR_PRIx "\n", TYPE_AW_I2C, __func__, offset);
  247. value = 0;
  248. break;
  249. }
  250. trace_allwinner_i2c_read(allwinner_i2c_get_regname(offset), offset, value);
  251. return (uint64_t)value;
  252. }
  253. static void allwinner_i2c_write(void *opaque, hwaddr offset,
  254. uint64_t value, unsigned size)
  255. {
  256. AWI2CState *s = AW_I2C(opaque);
  257. value &= 0xff;
  258. trace_allwinner_i2c_write(allwinner_i2c_get_regname(offset), offset, value);
  259. switch (offset) {
  260. case TWI_ADDR_REG:
  261. s->addr = (uint8_t)value;
  262. break;
  263. case TWI_XADDR_REG:
  264. s->xaddr = (uint8_t)value;
  265. break;
  266. case TWI_DATA_REG:
  267. /* If the device is in reset or not enabled, nothing to do */
  268. if (allwinner_i2c_is_reset(s) || (!allwinner_i2c_bus_is_enabled(s))) {
  269. break;
  270. }
  271. s->data = value & TWI_DATA_MASK;
  272. switch (STAT_TO_STA(s->stat)) {
  273. case STAT_M_STA_TX:
  274. case STAT_M_RSTA_TX:
  275. /* Send address */
  276. if (i2c_start_transfer(s->bus, extract32(s->data, 1, 7),
  277. extract32(s->data, 0, 1))) {
  278. /* If non zero is returned, the address is not valid */
  279. s->stat = STAT_FROM_STA(STAT_M_ADDR_WR_NACK);
  280. } else {
  281. /* Determine if read of write */
  282. if (extract32(s->data, 0, 1)) {
  283. s->stat = STAT_FROM_STA(STAT_M_ADDR_RD_ACK);
  284. } else {
  285. s->stat = STAT_FROM_STA(STAT_M_ADDR_WR_ACK);
  286. }
  287. allwinner_i2c_raise_interrupt(s);
  288. }
  289. break;
  290. case STAT_M_ADDR_WR_ACK:
  291. case STAT_M_DATA_TX_ACK:
  292. if (i2c_send(s->bus, s->data)) {
  293. /* If the target return non zero then end the transfer */
  294. s->stat = STAT_FROM_STA(STAT_M_DATA_TX_NACK);
  295. i2c_end_transfer(s->bus);
  296. } else {
  297. s->stat = STAT_FROM_STA(STAT_M_DATA_TX_ACK);
  298. allwinner_i2c_raise_interrupt(s);
  299. }
  300. break;
  301. default:
  302. break;
  303. }
  304. break;
  305. case TWI_CNTR_REG:
  306. if (!allwinner_i2c_is_reset(s)) {
  307. /* Do something only if not in software reset */
  308. s->cntr = value & TWI_CNTR_MASK;
  309. /* Check if start condition should be sent */
  310. if (s->cntr & TWI_CNTR_M_STA) {
  311. /* Update status */
  312. if (STAT_TO_STA(s->stat) == STAT_IDLE) {
  313. /* Send start condition */
  314. s->stat = STAT_FROM_STA(STAT_M_STA_TX);
  315. } else {
  316. /* Send repeated start condition */
  317. s->stat = STAT_FROM_STA(STAT_M_RSTA_TX);
  318. }
  319. /* Clear start condition */
  320. s->cntr &= ~TWI_CNTR_M_STA;
  321. }
  322. if (s->cntr & TWI_CNTR_M_STP) {
  323. /* Update status */
  324. i2c_end_transfer(s->bus);
  325. s->stat = STAT_FROM_STA(STAT_IDLE);
  326. s->cntr &= ~TWI_CNTR_M_STP;
  327. }
  328. if (!s->irq_clear_inverted && !(s->cntr & TWI_CNTR_INT_FLAG)) {
  329. /* Write 0 to clear this flag */
  330. qemu_irq_lower(s->irq);
  331. } else if (s->irq_clear_inverted && (s->cntr & TWI_CNTR_INT_FLAG)) {
  332. /* Write 1 to clear this flag */
  333. s->cntr &= ~TWI_CNTR_INT_FLAG;
  334. qemu_irq_lower(s->irq);
  335. }
  336. if ((s->cntr & TWI_CNTR_A_ACK) == 0) {
  337. if (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_ACK) {
  338. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_NACK);
  339. }
  340. } else {
  341. if (STAT_TO_STA(s->stat) == STAT_M_DATA_RX_NACK) {
  342. s->stat = STAT_FROM_STA(STAT_M_DATA_RX_ACK);
  343. }
  344. }
  345. allwinner_i2c_raise_interrupt(s);
  346. }
  347. break;
  348. case TWI_CCR_REG:
  349. s->ccr = value & TWI_CCR_MASK;
  350. break;
  351. case TWI_SRST_REG:
  352. if (((value & TWI_SRST_MASK) == 0) && (s->srst & TWI_SRST_MASK)) {
  353. device_cold_reset(DEVICE(s));
  354. }
  355. s->srst = value & TWI_SRST_MASK;
  356. break;
  357. case TWI_EFR_REG:
  358. s->efr = value & TWI_EFR_MASK;
  359. break;
  360. case TWI_LCR_REG:
  361. s->lcr = value & TWI_LCR_MASK;
  362. break;
  363. default:
  364. qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
  365. HWADDR_PRIx "\n", TYPE_AW_I2C, __func__, offset);
  366. break;
  367. }
  368. }
  369. static const MemoryRegionOps allwinner_i2c_ops = {
  370. .read = allwinner_i2c_read,
  371. .write = allwinner_i2c_write,
  372. .valid.min_access_size = 1,
  373. .valid.max_access_size = 4,
  374. .endianness = DEVICE_LITTLE_ENDIAN,
  375. };
  376. static const VMStateDescription allwinner_i2c_vmstate = {
  377. .name = TYPE_AW_I2C,
  378. .version_id = 1,
  379. .minimum_version_id = 1,
  380. .fields = (const VMStateField[]) {
  381. VMSTATE_UINT8(addr, AWI2CState),
  382. VMSTATE_UINT8(xaddr, AWI2CState),
  383. VMSTATE_UINT8(data, AWI2CState),
  384. VMSTATE_UINT8(cntr, AWI2CState),
  385. VMSTATE_UINT8(ccr, AWI2CState),
  386. VMSTATE_UINT8(srst, AWI2CState),
  387. VMSTATE_UINT8(efr, AWI2CState),
  388. VMSTATE_UINT8(lcr, AWI2CState),
  389. VMSTATE_END_OF_LIST()
  390. }
  391. };
  392. static void allwinner_i2c_realize(DeviceState *dev, Error **errp)
  393. {
  394. AWI2CState *s = AW_I2C(dev);
  395. memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_i2c_ops, s,
  396. TYPE_AW_I2C, AW_I2C_MEM_SIZE);
  397. sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
  398. sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
  399. s->bus = i2c_init_bus(dev, "i2c");
  400. }
  401. static void allwinner_i2c_class_init(ObjectClass *klass, void *data)
  402. {
  403. DeviceClass *dc = DEVICE_CLASS(klass);
  404. ResettableClass *rc = RESETTABLE_CLASS(klass);
  405. rc->phases.hold = allwinner_i2c_reset_hold;
  406. dc->vmsd = &allwinner_i2c_vmstate;
  407. dc->realize = allwinner_i2c_realize;
  408. dc->desc = "Allwinner I2C Controller";
  409. }
  410. static const TypeInfo allwinner_i2c_type_info = {
  411. .name = TYPE_AW_I2C,
  412. .parent = TYPE_SYS_BUS_DEVICE,
  413. .instance_size = sizeof(AWI2CState),
  414. .class_init = allwinner_i2c_class_init,
  415. };
  416. static void allwinner_i2c_sun6i_init(Object *obj)
  417. {
  418. AWI2CState *s = AW_I2C(obj);
  419. s->irq_clear_inverted = true;
  420. }
  421. static const TypeInfo allwinner_i2c_sun6i_type_info = {
  422. .name = TYPE_AW_I2C_SUN6I,
  423. .parent = TYPE_AW_I2C,
  424. .instance_init = allwinner_i2c_sun6i_init,
  425. };
  426. static void allwinner_i2c_register_types(void)
  427. {
  428. type_register_static(&allwinner_i2c_type_info);
  429. type_register_static(&allwinner_i2c_sun6i_type_info);
  430. }
  431. type_init(allwinner_i2c_register_types)