imx_serial.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. /*
  2. * IMX31 UARTS
  3. *
  4. * Copyright (c) 2008 OKL
  5. * Originally Written by Hans Jiang
  6. * Copyright (c) 2011 NICTA Pty Ltd.
  7. * Updated by Jean-Christophe Dubois <jcd@tribudubois.net>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. *
  12. * This is a `bare-bones' implementation of the IMX series serial ports.
  13. * TODO:
  14. * -- implement FIFOs. The real hardware has 32 word transmit
  15. * and receive FIFOs; we currently use a 1-char buffer
  16. * -- implement DMA
  17. * -- implement BAUD-rate and modem lines, for when the backend
  18. * is a real serial device.
  19. */
  20. #include "qemu/osdep.h"
  21. #include "hw/char/imx_serial.h"
  22. #include "hw/irq.h"
  23. #include "hw/qdev-properties.h"
  24. #include "migration/vmstate.h"
  25. #include "qemu/log.h"
  26. #include "qemu/module.h"
  27. #ifndef DEBUG_IMX_UART
  28. #define DEBUG_IMX_UART 0
  29. #endif
  30. #define DPRINTF(fmt, args...) \
  31. do { \
  32. if (DEBUG_IMX_UART) { \
  33. fprintf(stderr, "[%s]%s: " fmt , TYPE_IMX_SERIAL, \
  34. __func__, ##args); \
  35. } \
  36. } while (0)
  37. static const VMStateDescription vmstate_imx_serial = {
  38. .name = TYPE_IMX_SERIAL,
  39. .version_id = 2,
  40. .minimum_version_id = 2,
  41. .fields = (VMStateField[]) {
  42. VMSTATE_INT32(readbuff, IMXSerialState),
  43. VMSTATE_UINT32(usr1, IMXSerialState),
  44. VMSTATE_UINT32(usr2, IMXSerialState),
  45. VMSTATE_UINT32(ucr1, IMXSerialState),
  46. VMSTATE_UINT32(uts1, IMXSerialState),
  47. VMSTATE_UINT32(onems, IMXSerialState),
  48. VMSTATE_UINT32(ufcr, IMXSerialState),
  49. VMSTATE_UINT32(ubmr, IMXSerialState),
  50. VMSTATE_UINT32(ubrc, IMXSerialState),
  51. VMSTATE_UINT32(ucr3, IMXSerialState),
  52. VMSTATE_UINT32(ucr4, IMXSerialState),
  53. VMSTATE_END_OF_LIST()
  54. },
  55. };
  56. static void imx_update(IMXSerialState *s)
  57. {
  58. uint32_t usr1;
  59. uint32_t usr2;
  60. uint32_t mask;
  61. /*
  62. * Lucky for us TRDY and RRDY has the same offset in both USR1 and
  63. * UCR1, so we can get away with something as simple as the
  64. * following:
  65. */
  66. usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
  67. /*
  68. * Bits that we want in USR2 are not as conveniently laid out,
  69. * unfortunately.
  70. */
  71. mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
  72. /*
  73. * TCEN and TXDC are both bit 3
  74. * RDR and DREN are both bit 0
  75. */
  76. mask |= s->ucr4 & (UCR4_TCEN | UCR4_DREN);
  77. usr2 = s->usr2 & mask;
  78. qemu_set_irq(s->irq, usr1 || usr2);
  79. }
  80. static void imx_serial_reset(IMXSerialState *s)
  81. {
  82. s->usr1 = USR1_TRDY | USR1_RXDS;
  83. /*
  84. * Fake attachment of a terminal: assert RTS.
  85. */
  86. s->usr1 |= USR1_RTSS;
  87. s->usr2 = USR2_TXFE | USR2_TXDC | USR2_DCDIN;
  88. s->uts1 = UTS1_RXEMPTY | UTS1_TXEMPTY;
  89. s->ucr1 = 0;
  90. s->ucr2 = UCR2_SRST;
  91. s->ucr3 = 0x700;
  92. s->ubmr = 0;
  93. s->ubrc = 4;
  94. s->readbuff = URXD_ERR;
  95. }
  96. static void imx_serial_reset_at_boot(DeviceState *dev)
  97. {
  98. IMXSerialState *s = IMX_SERIAL(dev);
  99. imx_serial_reset(s);
  100. /*
  101. * enable the uart on boot, so messages from the linux decompresser
  102. * are visible. On real hardware this is done by the boot rom
  103. * before anything else is loaded.
  104. */
  105. s->ucr1 = UCR1_UARTEN;
  106. s->ucr2 = UCR2_TXEN;
  107. }
  108. static uint64_t imx_serial_read(void *opaque, hwaddr offset,
  109. unsigned size)
  110. {
  111. IMXSerialState *s = (IMXSerialState *)opaque;
  112. uint32_t c;
  113. DPRINTF("read(offset=0x%" HWADDR_PRIx ")\n", offset);
  114. switch (offset >> 2) {
  115. case 0x0: /* URXD */
  116. c = s->readbuff;
  117. if (!(s->uts1 & UTS1_RXEMPTY)) {
  118. /* Character is valid */
  119. c |= URXD_CHARRDY;
  120. s->usr1 &= ~USR1_RRDY;
  121. s->usr2 &= ~USR2_RDR;
  122. s->uts1 |= UTS1_RXEMPTY;
  123. imx_update(s);
  124. qemu_chr_fe_accept_input(&s->chr);
  125. }
  126. return c;
  127. case 0x20: /* UCR1 */
  128. return s->ucr1;
  129. case 0x21: /* UCR2 */
  130. return s->ucr2;
  131. case 0x25: /* USR1 */
  132. return s->usr1;
  133. case 0x26: /* USR2 */
  134. return s->usr2;
  135. case 0x2A: /* BRM Modulator */
  136. return s->ubmr;
  137. case 0x2B: /* Baud Rate Count */
  138. return s->ubrc;
  139. case 0x2d: /* Test register */
  140. return s->uts1;
  141. case 0x24: /* UFCR */
  142. return s->ufcr;
  143. case 0x2c:
  144. return s->onems;
  145. case 0x22: /* UCR3 */
  146. return s->ucr3;
  147. case 0x23: /* UCR4 */
  148. return s->ucr4;
  149. case 0x29: /* BRM Incremental */
  150. return 0x0; /* TODO */
  151. default:
  152. qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
  153. HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
  154. return 0;
  155. }
  156. }
  157. static void imx_serial_write(void *opaque, hwaddr offset,
  158. uint64_t value, unsigned size)
  159. {
  160. IMXSerialState *s = (IMXSerialState *)opaque;
  161. Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
  162. unsigned char ch;
  163. DPRINTF("write(offset=0x%" HWADDR_PRIx ", value = 0x%x) to %s\n",
  164. offset, (unsigned int)value, chr ? chr->label : "NODEV");
  165. switch (offset >> 2) {
  166. case 0x10: /* UTXD */
  167. ch = value;
  168. if (s->ucr2 & UCR2_TXEN) {
  169. /* XXX this blocks entire thread. Rewrite to use
  170. * qemu_chr_fe_write and background I/O callbacks */
  171. qemu_chr_fe_write_all(&s->chr, &ch, 1);
  172. s->usr1 &= ~USR1_TRDY;
  173. s->usr2 &= ~USR2_TXDC;
  174. imx_update(s);
  175. s->usr1 |= USR1_TRDY;
  176. s->usr2 |= USR2_TXDC;
  177. imx_update(s);
  178. }
  179. break;
  180. case 0x20: /* UCR1 */
  181. s->ucr1 = value & 0xffff;
  182. DPRINTF("write(ucr1=%x)\n", (unsigned int)value);
  183. imx_update(s);
  184. break;
  185. case 0x21: /* UCR2 */
  186. /*
  187. * Only a few bits in control register 2 are implemented as yet.
  188. * If it's intended to use a real serial device as a back-end, this
  189. * register will have to be implemented more fully.
  190. */
  191. if (!(value & UCR2_SRST)) {
  192. imx_serial_reset(s);
  193. imx_update(s);
  194. value |= UCR2_SRST;
  195. }
  196. if (value & UCR2_RXEN) {
  197. if (!(s->ucr2 & UCR2_RXEN)) {
  198. qemu_chr_fe_accept_input(&s->chr);
  199. }
  200. }
  201. s->ucr2 = value & 0xffff;
  202. break;
  203. case 0x25: /* USR1 */
  204. value &= USR1_AWAKE | USR1_AIRINT | USR1_DTRD | USR1_AGTIM |
  205. USR1_FRAMERR | USR1_ESCF | USR1_RTSD | USR1_PARTYER;
  206. s->usr1 &= ~value;
  207. break;
  208. case 0x26: /* USR2 */
  209. /*
  210. * Writing 1 to some bits clears them; all other
  211. * values are ignored
  212. */
  213. value &= USR2_ADET | USR2_DTRF | USR2_IDLE | USR2_ACST |
  214. USR2_RIDELT | USR2_IRINT | USR2_WAKE |
  215. USR2_DCDDELT | USR2_RTSF | USR2_BRCD | USR2_ORE;
  216. s->usr2 &= ~value;
  217. break;
  218. /*
  219. * Linux expects to see what it writes to these registers
  220. * We don't currently alter the baud rate
  221. */
  222. case 0x29: /* UBIR */
  223. s->ubrc = value & 0xffff;
  224. break;
  225. case 0x2a: /* UBMR */
  226. s->ubmr = value & 0xffff;
  227. break;
  228. case 0x2c: /* One ms reg */
  229. s->onems = value & 0xffff;
  230. break;
  231. case 0x24: /* FIFO control register */
  232. s->ufcr = value & 0xffff;
  233. break;
  234. case 0x22: /* UCR3 */
  235. s->ucr3 = value & 0xffff;
  236. break;
  237. case 0x23: /* UCR4 */
  238. s->ucr4 = value & 0xffff;
  239. imx_update(s);
  240. break;
  241. case 0x2d: /* UTS1 */
  242. qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
  243. HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
  244. /* TODO */
  245. break;
  246. default:
  247. qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
  248. HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
  249. }
  250. }
  251. static int imx_can_receive(void *opaque)
  252. {
  253. IMXSerialState *s = (IMXSerialState *)opaque;
  254. return !(s->usr1 & USR1_RRDY);
  255. }
  256. static void imx_put_data(void *opaque, uint32_t value)
  257. {
  258. IMXSerialState *s = (IMXSerialState *)opaque;
  259. DPRINTF("received char\n");
  260. s->usr1 |= USR1_RRDY;
  261. s->usr2 |= USR2_RDR;
  262. s->uts1 &= ~UTS1_RXEMPTY;
  263. s->readbuff = value;
  264. if (value & URXD_BRK) {
  265. s->usr2 |= USR2_BRCD;
  266. }
  267. imx_update(s);
  268. }
  269. static void imx_receive(void *opaque, const uint8_t *buf, int size)
  270. {
  271. imx_put_data(opaque, *buf);
  272. }
  273. static void imx_event(void *opaque, QEMUChrEvent event)
  274. {
  275. if (event == CHR_EVENT_BREAK) {
  276. imx_put_data(opaque, URXD_BRK | URXD_FRMERR | URXD_ERR);
  277. }
  278. }
  279. static const struct MemoryRegionOps imx_serial_ops = {
  280. .read = imx_serial_read,
  281. .write = imx_serial_write,
  282. .endianness = DEVICE_NATIVE_ENDIAN,
  283. };
  284. static void imx_serial_realize(DeviceState *dev, Error **errp)
  285. {
  286. IMXSerialState *s = IMX_SERIAL(dev);
  287. DPRINTF("char dev for uart: %p\n", qemu_chr_fe_get_driver(&s->chr));
  288. qemu_chr_fe_set_handlers(&s->chr, imx_can_receive, imx_receive,
  289. imx_event, NULL, s, NULL, true);
  290. }
  291. static void imx_serial_init(Object *obj)
  292. {
  293. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  294. IMXSerialState *s = IMX_SERIAL(obj);
  295. memory_region_init_io(&s->iomem, obj, &imx_serial_ops, s,
  296. TYPE_IMX_SERIAL, 0x1000);
  297. sysbus_init_mmio(sbd, &s->iomem);
  298. sysbus_init_irq(sbd, &s->irq);
  299. }
  300. static Property imx_serial_properties[] = {
  301. DEFINE_PROP_CHR("chardev", IMXSerialState, chr),
  302. DEFINE_PROP_END_OF_LIST(),
  303. };
  304. static void imx_serial_class_init(ObjectClass *klass, void *data)
  305. {
  306. DeviceClass *dc = DEVICE_CLASS(klass);
  307. dc->realize = imx_serial_realize;
  308. dc->vmsd = &vmstate_imx_serial;
  309. dc->reset = imx_serial_reset_at_boot;
  310. set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
  311. dc->desc = "i.MX series UART";
  312. device_class_set_props(dc, imx_serial_properties);
  313. }
  314. static const TypeInfo imx_serial_info = {
  315. .name = TYPE_IMX_SERIAL,
  316. .parent = TYPE_SYS_BUS_DEVICE,
  317. .instance_size = sizeof(IMXSerialState),
  318. .instance_init = imx_serial_init,
  319. .class_init = imx_serial_class_init,
  320. };
  321. static void imx_serial_register_types(void)
  322. {
  323. type_register_static(&imx_serial_info);
  324. }
  325. type_init(imx_serial_register_types)