xref: /qemu/include/hw/char/nrf51_uart.h (revision 19790847e25c7e82bba9eb13d82894506eeabe09)
1*19790847SJulia Suvorova /*
2*19790847SJulia Suvorova  * nRF51 SoC UART emulation
3*19790847SJulia Suvorova  *
4*19790847SJulia Suvorova  * Copyright (c) 2018 Julia Suvorova <jusual@mail.ru>
5*19790847SJulia Suvorova  *
6*19790847SJulia Suvorova  * This program is free software; you can redistribute it and/or modify
7*19790847SJulia Suvorova  * it under the terms of the GNU General Public License version 2 or
8*19790847SJulia Suvorova  * (at your option) any later version.
9*19790847SJulia Suvorova  */
10*19790847SJulia Suvorova 
11*19790847SJulia Suvorova #ifndef NRF51_UART_H
12*19790847SJulia Suvorova #define NRF51_UART_H
13*19790847SJulia Suvorova 
14*19790847SJulia Suvorova #include "hw/sysbus.h"
15*19790847SJulia Suvorova #include "chardev/char-fe.h"
16*19790847SJulia Suvorova #include "hw/registerfields.h"
17*19790847SJulia Suvorova 
18*19790847SJulia Suvorova #define UART_FIFO_LENGTH 6
19*19790847SJulia Suvorova #define UART_BASE 0x40002000
20*19790847SJulia Suvorova #define UART_SIZE 0x1000
21*19790847SJulia Suvorova 
22*19790847SJulia Suvorova #define TYPE_NRF51_UART "nrf51_soc.uart"
23*19790847SJulia Suvorova #define NRF51_UART(obj) OBJECT_CHECK(NRF51UARTState, (obj), TYPE_NRF51_UART)
24*19790847SJulia Suvorova 
25*19790847SJulia Suvorova REG32(UART_STARTRX, 0x000)
26*19790847SJulia Suvorova REG32(UART_STOPRX, 0x004)
27*19790847SJulia Suvorova REG32(UART_STARTTX, 0x008)
28*19790847SJulia Suvorova REG32(UART_STOPTX, 0x00C)
29*19790847SJulia Suvorova REG32(UART_SUSPEND, 0x01C)
30*19790847SJulia Suvorova 
31*19790847SJulia Suvorova REG32(UART_CTS, 0x100)
32*19790847SJulia Suvorova REG32(UART_NCTS, 0x104)
33*19790847SJulia Suvorova REG32(UART_RXDRDY, 0x108)
34*19790847SJulia Suvorova REG32(UART_TXDRDY, 0x11C)
35*19790847SJulia Suvorova REG32(UART_ERROR, 0x124)
36*19790847SJulia Suvorova REG32(UART_RXTO, 0x144)
37*19790847SJulia Suvorova 
38*19790847SJulia Suvorova REG32(UART_INTEN, 0x300)
39*19790847SJulia Suvorova     FIELD(UART_INTEN, CTS, 0, 1)
40*19790847SJulia Suvorova     FIELD(UART_INTEN, NCTS, 1, 1)
41*19790847SJulia Suvorova     FIELD(UART_INTEN, RXDRDY, 2, 1)
42*19790847SJulia Suvorova     FIELD(UART_INTEN, TXDRDY, 7, 1)
43*19790847SJulia Suvorova     FIELD(UART_INTEN, ERROR, 9, 1)
44*19790847SJulia Suvorova     FIELD(UART_INTEN, RXTO, 17, 1)
45*19790847SJulia Suvorova REG32(UART_INTENSET, 0x304)
46*19790847SJulia Suvorova REG32(UART_INTENCLR, 0x308)
47*19790847SJulia Suvorova REG32(UART_ERRORSRC, 0x480)
48*19790847SJulia Suvorova REG32(UART_ENABLE, 0x500)
49*19790847SJulia Suvorova REG32(UART_PSELRTS, 0x508)
50*19790847SJulia Suvorova REG32(UART_PSELTXD, 0x50C)
51*19790847SJulia Suvorova REG32(UART_PSELCTS, 0x510)
52*19790847SJulia Suvorova REG32(UART_PSELRXD, 0x514)
53*19790847SJulia Suvorova REG32(UART_RXD, 0x518)
54*19790847SJulia Suvorova REG32(UART_TXD, 0x51C)
55*19790847SJulia Suvorova REG32(UART_BAUDRATE, 0x524)
56*19790847SJulia Suvorova REG32(UART_CONFIG, 0x56C)
57*19790847SJulia Suvorova 
58*19790847SJulia Suvorova typedef struct NRF51UARTState {
59*19790847SJulia Suvorova     SysBusDevice parent_obj;
60*19790847SJulia Suvorova 
61*19790847SJulia Suvorova     MemoryRegion iomem;
62*19790847SJulia Suvorova     CharBackend chr;
63*19790847SJulia Suvorova     qemu_irq irq;
64*19790847SJulia Suvorova     guint watch_tag;
65*19790847SJulia Suvorova 
66*19790847SJulia Suvorova     uint8_t rx_fifo[UART_FIFO_LENGTH];
67*19790847SJulia Suvorova     unsigned int rx_fifo_pos;
68*19790847SJulia Suvorova     unsigned int rx_fifo_len;
69*19790847SJulia Suvorova 
70*19790847SJulia Suvorova     uint32_t reg[0x56C];
71*19790847SJulia Suvorova 
72*19790847SJulia Suvorova     bool rx_started;
73*19790847SJulia Suvorova     bool tx_started;
74*19790847SJulia Suvorova     bool pending_tx_byte;
75*19790847SJulia Suvorova     bool enabled;
76*19790847SJulia Suvorova } NRF51UARTState;
77*19790847SJulia Suvorova 
78*19790847SJulia Suvorova #endif
79