2
0

imx_serial.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. /*
  2. * IMX31 UARTS
  3. *
  4. * Copyright (c) 2008 OKL
  5. * Originally Written by Hans Jiang
  6. * Copyright (c) 2011 NICTA Pty Ltd.
  7. *
  8. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  9. * See the COPYING file in the top-level directory.
  10. *
  11. * This is a `bare-bones' implementation of the IMX series serial ports.
  12. * TODO:
  13. * -- implement FIFOs. The real hardware has 32 word transmit
  14. * and receive FIFOs; we currently use a 1-char buffer
  15. * -- implement DMA
  16. * -- implement BAUD-rate and modem lines, for when the backend
  17. * is a real serial device.
  18. */
  19. #include "hw.h"
  20. #include "sysbus.h"
  21. #include "sysemu/sysemu.h"
  22. #include "char/char.h"
  23. #include "imx.h"
  24. //#define DEBUG_SERIAL 1
  25. #ifdef DEBUG_SERIAL
  26. #define DPRINTF(fmt, args...) \
  27. do { printf("imx_serial: " fmt , ##args); } while (0)
  28. #else
  29. #define DPRINTF(fmt, args...) do {} while (0)
  30. #endif
  31. /*
  32. * Define to 1 for messages about attempts to
  33. * access unimplemented registers or similar.
  34. */
  35. //#define DEBUG_IMPLEMENTATION 1
  36. #ifdef DEBUG_IMPLEMENTATION
  37. # define IPRINTF(fmt, args...) \
  38. do { fprintf(stderr, "imx_serial: " fmt, ##args); } while (0)
  39. #else
  40. # define IPRINTF(fmt, args...) do {} while (0)
  41. #endif
  42. typedef struct {
  43. SysBusDevice busdev;
  44. MemoryRegion iomem;
  45. int32_t readbuff;
  46. uint32_t usr1;
  47. uint32_t usr2;
  48. uint32_t ucr1;
  49. uint32_t ucr2;
  50. uint32_t uts1;
  51. /*
  52. * The registers below are implemented just so that the
  53. * guest OS sees what it has written
  54. */
  55. uint32_t onems;
  56. uint32_t ufcr;
  57. uint32_t ubmr;
  58. uint32_t ubrc;
  59. uint32_t ucr3;
  60. qemu_irq irq;
  61. CharDriverState *chr;
  62. } IMXSerialState;
  63. static const VMStateDescription vmstate_imx_serial = {
  64. .name = "imx-serial",
  65. .version_id = 1,
  66. .minimum_version_id = 1,
  67. .minimum_version_id_old = 1,
  68. .fields = (VMStateField[]) {
  69. VMSTATE_INT32(readbuff, IMXSerialState),
  70. VMSTATE_UINT32(usr1, IMXSerialState),
  71. VMSTATE_UINT32(usr2, IMXSerialState),
  72. VMSTATE_UINT32(ucr1, IMXSerialState),
  73. VMSTATE_UINT32(uts1, IMXSerialState),
  74. VMSTATE_UINT32(onems, IMXSerialState),
  75. VMSTATE_UINT32(ufcr, IMXSerialState),
  76. VMSTATE_UINT32(ubmr, IMXSerialState),
  77. VMSTATE_UINT32(ubrc, IMXSerialState),
  78. VMSTATE_UINT32(ucr3, IMXSerialState),
  79. VMSTATE_END_OF_LIST()
  80. },
  81. };
  82. #define URXD_CHARRDY (1<<15) /* character read is valid */
  83. #define URXD_ERR (1<<14) /* Character has error */
  84. #define URXD_BRK (1<<11) /* Break received */
  85. #define USR1_PARTYER (1<<15) /* Parity Error */
  86. #define USR1_RTSS (1<<14) /* RTS pin status */
  87. #define USR1_TRDY (1<<13) /* Tx ready */
  88. #define USR1_RTSD (1<<12) /* RTS delta: pin changed state */
  89. #define USR1_ESCF (1<<11) /* Escape sequence interrupt */
  90. #define USR1_FRAMERR (1<<10) /* Framing error */
  91. #define USR1_RRDY (1<<9) /* receiver ready */
  92. #define USR1_AGTIM (1<<8) /* Aging timer interrupt */
  93. #define USR1_DTRD (1<<7) /* DTR changed */
  94. #define USR1_RXDS (1<<6) /* Receiver is idle */
  95. #define USR1_AIRINT (1<<5) /* Aysnch IR interrupt */
  96. #define USR1_AWAKE (1<<4) /* Falling edge detected on RXd pin */
  97. #define USR2_ADET (1<<15) /* Autobaud complete */
  98. #define USR2_TXFE (1<<14) /* Transmit FIFO empty */
  99. #define USR2_DTRF (1<<13) /* DTR/DSR transition */
  100. #define USR2_IDLE (1<<12) /* UART has been idle for too long */
  101. #define USR2_ACST (1<<11) /* Autobaud counter stopped */
  102. #define USR2_RIDELT (1<<10) /* Ring Indicator delta */
  103. #define USR2_RIIN (1<<9) /* Ring Indicator Input */
  104. #define USR2_IRINT (1<<8) /* Serial Infrared Interrupt */
  105. #define USR2_WAKE (1<<7) /* Start bit detected */
  106. #define USR2_DCDDELT (1<<6) /* Data Carrier Detect delta */
  107. #define USR2_DCDIN (1<<5) /* Data Carrier Detect Input */
  108. #define USR2_RTSF (1<<4) /* RTS transition */
  109. #define USR2_TXDC (1<<3) /* Transmission complete */
  110. #define USR2_BRCD (1<<2) /* Break condition detected */
  111. #define USR2_ORE (1<<1) /* Overrun error */
  112. #define USR2_RDR (1<<0) /* Receive data ready */
  113. #define UCR1_TRDYEN (1<<13) /* Tx Ready Interrupt Enable */
  114. #define UCR1_RRDYEN (1<<9) /* Rx Ready Interrupt Enable */
  115. #define UCR1_TXMPTYEN (1<<6) /* Tx Empty Interrupt Enable */
  116. #define UCR1_UARTEN (1<<0) /* UART Enable */
  117. #define UCR2_TXEN (1<<2) /* Transmitter enable */
  118. #define UCR2_RXEN (1<<1) /* Receiver enable */
  119. #define UCR2_SRST (1<<0) /* Reset complete */
  120. #define UTS1_TXEMPTY (1<<6)
  121. #define UTS1_RXEMPTY (1<<5)
  122. #define UTS1_TXFULL (1<<4)
  123. #define UTS1_RXFULL (1<<3)
  124. static void imx_update(IMXSerialState *s)
  125. {
  126. uint32_t flags;
  127. flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
  128. if (!(s->ucr1 & UCR1_TXMPTYEN)) {
  129. flags &= ~USR1_TRDY;
  130. }
  131. qemu_set_irq(s->irq, !!flags);
  132. }
  133. static void imx_serial_reset(IMXSerialState *s)
  134. {
  135. s->usr1 = USR1_TRDY | USR1_RXDS;
  136. /*
  137. * Fake attachment of a terminal: assert RTS.
  138. */
  139. s->usr1 |= USR1_RTSS;
  140. s->usr2 = USR2_TXFE | USR2_TXDC | USR2_DCDIN;
  141. s->uts1 = UTS1_RXEMPTY | UTS1_TXEMPTY;
  142. s->ucr1 = 0;
  143. s->ucr2 = UCR2_SRST;
  144. s->ucr3 = 0x700;
  145. s->ubmr = 0;
  146. s->ubrc = 4;
  147. s->readbuff = URXD_ERR;
  148. }
  149. static void imx_serial_reset_at_boot(DeviceState *dev)
  150. {
  151. IMXSerialState *s = container_of(dev, IMXSerialState, busdev.qdev);
  152. imx_serial_reset(s);
  153. /*
  154. * enable the uart on boot, so messages from the linux decompresser
  155. * are visible. On real hardware this is done by the boot rom
  156. * before anything else is loaded.
  157. */
  158. s->ucr1 = UCR1_UARTEN;
  159. s->ucr2 = UCR2_TXEN;
  160. }
  161. static uint64_t imx_serial_read(void *opaque, hwaddr offset,
  162. unsigned size)
  163. {
  164. IMXSerialState *s = (IMXSerialState *)opaque;
  165. uint32_t c;
  166. DPRINTF("read(offset=%x)\n", offset >> 2);
  167. switch (offset >> 2) {
  168. case 0x0: /* URXD */
  169. c = s->readbuff;
  170. if (!(s->uts1 & UTS1_RXEMPTY)) {
  171. /* Character is valid */
  172. c |= URXD_CHARRDY;
  173. s->usr1 &= ~USR1_RRDY;
  174. s->usr2 &= ~USR2_RDR;
  175. s->uts1 |= UTS1_RXEMPTY;
  176. imx_update(s);
  177. qemu_chr_accept_input(s->chr);
  178. }
  179. return c;
  180. case 0x20: /* UCR1 */
  181. return s->ucr1;
  182. case 0x21: /* UCR2 */
  183. return s->ucr2;
  184. case 0x25: /* USR1 */
  185. return s->usr1;
  186. case 0x26: /* USR2 */
  187. return s->usr2;
  188. case 0x2A: /* BRM Modulator */
  189. return s->ubmr;
  190. case 0x2B: /* Baud Rate Count */
  191. return s->ubrc;
  192. case 0x2d: /* Test register */
  193. return s->uts1;
  194. case 0x24: /* UFCR */
  195. return s->ufcr;
  196. case 0x2c:
  197. return s->onems;
  198. case 0x22: /* UCR3 */
  199. return s->ucr3;
  200. case 0x23: /* UCR4 */
  201. case 0x29: /* BRM Incremental */
  202. return 0x0; /* TODO */
  203. default:
  204. IPRINTF("imx_serial_read: bad offset: 0x%x\n", (int)offset);
  205. return 0;
  206. }
  207. }
  208. static void imx_serial_write(void *opaque, hwaddr offset,
  209. uint64_t value, unsigned size)
  210. {
  211. IMXSerialState *s = (IMXSerialState *)opaque;
  212. unsigned char ch;
  213. DPRINTF("write(offset=%x, value = %x) to %s\n",
  214. offset >> 2,
  215. (unsigned int)value, s->chr ? s->chr->label : "NODEV");
  216. switch (offset >> 2) {
  217. case 0x10: /* UTXD */
  218. ch = value;
  219. if (s->ucr2 & UCR2_TXEN) {
  220. if (s->chr) {
  221. qemu_chr_fe_write(s->chr, &ch, 1);
  222. }
  223. s->usr1 &= ~USR1_TRDY;
  224. imx_update(s);
  225. s->usr1 |= USR1_TRDY;
  226. imx_update(s);
  227. }
  228. break;
  229. case 0x20: /* UCR1 */
  230. s->ucr1 = value & 0xffff;
  231. DPRINTF("write(ucr1=%x)\n", (unsigned int)value);
  232. imx_update(s);
  233. break;
  234. case 0x21: /* UCR2 */
  235. /*
  236. * Only a few bits in control register 2 are implemented as yet.
  237. * If it's intended to use a real serial device as a back-end, this
  238. * register will have to be implemented more fully.
  239. */
  240. if (!(value & UCR2_SRST)) {
  241. imx_serial_reset(s);
  242. imx_update(s);
  243. value |= UCR2_SRST;
  244. }
  245. if (value & UCR2_RXEN) {
  246. if (!(s->ucr2 & UCR2_RXEN)) {
  247. qemu_chr_accept_input(s->chr);
  248. }
  249. }
  250. s->ucr2 = value & 0xffff;
  251. break;
  252. case 0x25: /* USR1 */
  253. value &= USR1_AWAKE | USR1_AIRINT | USR1_DTRD | USR1_AGTIM |
  254. USR1_FRAMERR | USR1_ESCF | USR1_RTSD | USR1_PARTYER;
  255. s->usr1 &= ~value;
  256. break;
  257. case 0x26: /* USR2 */
  258. /*
  259. * Writing 1 to some bits clears them; all other
  260. * values are ignored
  261. */
  262. value &= USR2_ADET | USR2_DTRF | USR2_IDLE | USR2_ACST |
  263. USR2_RIDELT | USR2_IRINT | USR2_WAKE |
  264. USR2_DCDDELT | USR2_RTSF | USR2_BRCD | USR2_ORE;
  265. s->usr2 &= ~value;
  266. break;
  267. /*
  268. * Linux expects to see what it writes to these registers
  269. * We don't currently alter the baud rate
  270. */
  271. case 0x29: /* UBIR */
  272. s->ubrc = value & 0xffff;
  273. break;
  274. case 0x2a: /* UBMR */
  275. s->ubmr = value & 0xffff;
  276. break;
  277. case 0x2c: /* One ms reg */
  278. s->onems = value & 0xffff;
  279. break;
  280. case 0x24: /* FIFO control register */
  281. s->ufcr = value & 0xffff;
  282. break;
  283. case 0x22: /* UCR3 */
  284. s->ucr3 = value & 0xffff;
  285. break;
  286. case 0x2d: /* UTS1 */
  287. case 0x23: /* UCR4 */
  288. IPRINTF("Unimplemented Register %x written to\n", offset >> 2);
  289. /* TODO */
  290. break;
  291. default:
  292. IPRINTF("imx_serial_write: Bad offset 0x%x\n", (int)offset);
  293. }
  294. }
  295. static int imx_can_receive(void *opaque)
  296. {
  297. IMXSerialState *s = (IMXSerialState *)opaque;
  298. return !(s->usr1 & USR1_RRDY);
  299. }
  300. static void imx_put_data(void *opaque, uint32_t value)
  301. {
  302. IMXSerialState *s = (IMXSerialState *)opaque;
  303. DPRINTF("received char\n");
  304. s->usr1 |= USR1_RRDY;
  305. s->usr2 |= USR2_RDR;
  306. s->uts1 &= ~UTS1_RXEMPTY;
  307. s->readbuff = value;
  308. imx_update(s);
  309. }
  310. static void imx_receive(void *opaque, const uint8_t *buf, int size)
  311. {
  312. imx_put_data(opaque, *buf);
  313. }
  314. static void imx_event(void *opaque, int event)
  315. {
  316. if (event == CHR_EVENT_BREAK) {
  317. imx_put_data(opaque, URXD_BRK);
  318. }
  319. }
  320. static const struct MemoryRegionOps imx_serial_ops = {
  321. .read = imx_serial_read,
  322. .write = imx_serial_write,
  323. .endianness = DEVICE_NATIVE_ENDIAN,
  324. };
  325. static int imx_serial_init(SysBusDevice *dev)
  326. {
  327. IMXSerialState *s = FROM_SYSBUS(IMXSerialState, dev);
  328. memory_region_init_io(&s->iomem, &imx_serial_ops, s, "imx-serial", 0x1000);
  329. sysbus_init_mmio(dev, &s->iomem);
  330. sysbus_init_irq(dev, &s->irq);
  331. if (s->chr) {
  332. qemu_chr_add_handlers(s->chr, imx_can_receive, imx_receive,
  333. imx_event, s);
  334. } else {
  335. DPRINTF("No char dev for uart at 0x%lx\n",
  336. (unsigned long)s->iomem.ram_addr);
  337. }
  338. return 0;
  339. }
  340. void imx_serial_create(int uart, const hwaddr addr, qemu_irq irq)
  341. {
  342. DeviceState *dev;
  343. SysBusDevice *bus;
  344. CharDriverState *chr;
  345. const char chr_name[] = "serial";
  346. char label[ARRAY_SIZE(chr_name) + 1];
  347. dev = qdev_create(NULL, "imx-serial");
  348. if (uart >= MAX_SERIAL_PORTS) {
  349. hw_error("Cannot assign uart %d: QEMU supports only %d ports\n",
  350. uart, MAX_SERIAL_PORTS);
  351. }
  352. chr = serial_hds[uart];
  353. if (!chr) {
  354. snprintf(label, ARRAY_SIZE(label), "%s%d", chr_name, uart);
  355. chr = qemu_chr_new(label, "null", NULL);
  356. if (!(chr)) {
  357. hw_error("Can't assign serial port to imx-uart%d.\n", uart);
  358. }
  359. }
  360. qdev_prop_set_chr(dev, "chardev", chr);
  361. bus = SYS_BUS_DEVICE(dev);
  362. qdev_init_nofail(dev);
  363. if (addr != (hwaddr)-1) {
  364. sysbus_mmio_map(bus, 0, addr);
  365. }
  366. sysbus_connect_irq(bus, 0, irq);
  367. }
  368. static Property imx32_serial_properties[] = {
  369. DEFINE_PROP_CHR("chardev", IMXSerialState, chr),
  370. DEFINE_PROP_END_OF_LIST(),
  371. };
  372. static void imx_serial_class_init(ObjectClass *klass, void *data)
  373. {
  374. DeviceClass *dc = DEVICE_CLASS(klass);
  375. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  376. k->init = imx_serial_init;
  377. dc->vmsd = &vmstate_imx_serial;
  378. dc->reset = imx_serial_reset_at_boot;
  379. dc->desc = "i.MX series UART";
  380. dc->props = imx32_serial_properties;
  381. }
  382. static const TypeInfo imx_serial_info = {
  383. .name = "imx-serial",
  384. .parent = TYPE_SYS_BUS_DEVICE,
  385. .instance_size = sizeof(IMXSerialState),
  386. .class_init = imx_serial_class_init,
  387. };
  388. static void imx_serial_register_types(void)
  389. {
  390. type_register_static(&imx_serial_info);
  391. }
  392. type_init(imx_serial_register_types)