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