From 1c036493121b0e2d84a806714030972d022f87ca Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Wed, 10 Jun 2020 13:46:12 -0500 Subject: Move ARM PL011 UART driver This UART driver is now needed for BSPs other than ARM. --- bsps/arm/headers.am | 2 - bsps/arm/include/bsp/arm-pl011-regs.h | 130 --------------------- bsps/arm/include/bsp/arm-pl011.h | 51 -------- bsps/arm/raspberrypi/console/console-config.c | 2 +- bsps/arm/realview-pbx-a9/include/bsp/console.h | 2 +- bsps/arm/shared/serial/arm-pl011.c | 91 --------------- bsps/arm/xen/console/console.c | 2 +- bsps/headers.am | 5 + bsps/include/dev/serial/arm-pl011-regs.h | 130 +++++++++++++++++++++ bsps/include/dev/serial/arm-pl011.h | 51 ++++++++ bsps/shared/dev/serial/arm-pl011.c | 91 +++++++++++++++ c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 2 +- c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am | 2 +- c/src/lib/libbsp/arm/xen/Makefile.am | 2 +- spec/build/bsps/arm/grp.yml | 2 - spec/build/bsps/arm/raspberrypi/obj.yml | 1 - .../bsps/arm/realview-pbx-a9/bsprealviewpbxa9.yml | 1 - spec/build/bsps/arm/xen/bspxen.yml | 1 - spec/build/bsps/obj.yml | 5 + 19 files changed, 288 insertions(+), 285 deletions(-) delete mode 100644 bsps/arm/include/bsp/arm-pl011-regs.h delete mode 100644 bsps/arm/include/bsp/arm-pl011.h delete mode 100644 bsps/arm/shared/serial/arm-pl011.c create mode 100644 bsps/include/dev/serial/arm-pl011-regs.h create mode 100644 bsps/include/dev/serial/arm-pl011.h create mode 100644 bsps/shared/dev/serial/arm-pl011.c diff --git a/bsps/arm/headers.am b/bsps/arm/headers.am index 3d2b09effa..f0d498c8f4 100644 --- a/bsps/arm/headers.am +++ b/bsps/arm/headers.am @@ -21,8 +21,6 @@ include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-gic-irq.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-gic-regs.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-gic-tm27.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-gic.h -include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-pl011-regs.h -include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-pl011.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-pl050-regs.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-pl050.h include_bsp_HEADERS += ../../../../../bsps/arm/include/bsp/arm-pl111-fb.h diff --git a/bsps/arm/include/bsp/arm-pl011-regs.h b/bsps/arm/include/bsp/arm-pl011-regs.h deleted file mode 100644 index afe80a6262..0000000000 --- a/bsps/arm/include/bsp/arm-pl011-regs.h +++ /dev/null @@ -1,130 +0,0 @@ -/** - * @file - * - * @ingroup RTEMSBSPsARMShared - * - * @brief ARM PL011 Register definitions - */ - -/* - * Copyright (c) 2013 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifndef LIBBSP_ARM_SHARED_ARM_PL011_REGS_H -#define LIBBSP_ARM_SHARED_ARM_PL011_REGS_H - -#include - -typedef struct { - uint32_t uartdr; -#define PL011_UARTDR_OE BSP_BIT32(11) -#define PL011_UARTDR_BE BSP_BIT32(10) -#define PL011_UARTDR_PE BSP_BIT32(9) -#define PL011_UARTDR_FE BSP_BIT32(8) -#define PL011_UARTDR_DATA(val) BSP_FLD32(val, 0, 7) -#define PL011_UARTDR_DATA_GET(reg) BSP_FLD32GET(reg, 0, 7) -#define PL011_UARTDR_DATA_SET(reg, val) BSP_FLD32SET(reg, val, 0, 7) - uint32_t uartrsr_uartecr; -#define PL011_UARTRSR_UARTECR_OE BSP_BIT32(3) -#define PL011_UARTRSR_UARTECR_BE BSP_BIT32(2) -#define PL011_UARTRSR_UARTECR_PE BSP_BIT32(1) -#define PL011_UARTRSR_UARTECR_FE BSP_BIT32(0) - uint32_t reserved_08[4]; - uint32_t uartfr; -#define PL011_UARTFR_RI BSP_BIT32(8) -#define PL011_UARTFR_TXFE BSP_BIT32(7) -#define PL011_UARTFR_RXFF BSP_BIT32(6) -#define PL011_UARTFR_TXFF BSP_BIT32(5) -#define PL011_UARTFR_RXFE BSP_BIT32(4) -#define PL011_UARTFR_BUSY BSP_BIT32(3) -#define PL011_UARTFR_DCD BSP_BIT32(2) -#define PL011_UARTFR_DSR BSP_BIT32(1) -#define PL011_UARTFR_CTS BSP_BIT32(0) - uint32_t reserved_1c; - uint32_t uartilpr; -#define PL011_UARTILPR_ILPDVSR(val) BSP_FLD32(val, 0, 7) -#define PL011_UARTILPR_ILPDVSR_GET(reg) BSP_FLD32GET(reg, 0, 7) -#define PL011_UARTILPR_ILPDVSR_SET(reg, val) BSP_FLD32SET(reg, val, 0, 7) - uint32_t uartibrd; -#define PL011_UARTIBRD_BAUD_DIVINT(val) BSP_FLD32(val, 0, 15) -#define PL011_UARTIBRD_BAUD_DIVINT_GET(reg) BSP_FLD32GET(reg, 0, 15) -#define PL011_UARTIBRD_BAUD_DIVINT_SET(reg, val) BSP_FLD32SET(reg, val, 0, 15) - uint32_t uartfbrd; -#define PL011_UARTFBRD_BAUD_DIVFRAC(val) BSP_FLD32(val, 0, 5) -#define PL011_UARTFBRD_BAUD_DIVFRAC_GET(reg) BSP_FLD32GET(reg, 0, 5) -#define PL011_UARTFBRD_BAUD_DIVFRAC_SET(reg, val) BSP_FLD32SET(reg, val, 0, 5) - uint32_t uartlcr_h; -#define PL011_UARTLCR_H_SPS BSP_BIT32(7) -#define PL011_UARTLCR_H_WLEN(val) BSP_FLD32(val, 5, 6) -#define PL011_UARTLCR_H_WLEN_GET(reg) BSP_FLD32GET(reg, 5, 6) -#define PL011_UARTLCR_H_WLEN_SET(reg, val) BSP_FLD32SET(reg, val, 5, 6) -#define PL011_UARTLCR_H_WLEN_5 0x00U -#define PL011_UARTLCR_H_WLEN_6 0x01U -#define PL011_UARTLCR_H_WLEN_7 0x02U -#define PL011_UARTLCR_H_WLEN_8 0x03U -#define PL011_UARTLCR_H_FEN BSP_BIT32(4) -#define PL011_UARTLCR_H_STP2 BSP_BIT32(3) -#define PL011_UARTLCR_H_EPS BSP_BIT32(2) -#define PL011_UARTLCR_H_PEN BSP_BIT32(1) -#define PL011_UARTLCR_H_BRK BSP_BIT32(0) - uint32_t uartcr; -#define PL011_UARTCR_CTSEN BSP_BIT32(15) -#define PL011_UARTCR_RTSEN BSP_BIT32(14) -#define PL011_UARTCR_OUT2 BSP_BIT32(13) -#define PL011_UARTCR_OUT1 BSP_BIT32(12) -#define PL011_UARTCR_RTS BSP_BIT32(11) -#define PL011_UARTCR_DTR BSP_BIT32(10) -#define PL011_UARTCR_RXE BSP_BIT32(9) -#define PL011_UARTCR_TXE BSP_BIT32(8) -#define PL011_UARTCR_LBE BSP_BIT32(7) -#define PL011_UARTCR_SIRLP BSP_BIT32(3) -#define PL011_UARTCR_SIREN BSP_BIT32(2) -#define PL011_UARTCR_UARTEN BSP_BIT32(1) - uint32_t uartifls; -#define PL011_UARTIFLS_RXIFLSEL(val) BSP_FLD32(val, 3, 5) -#define PL011_UARTIFLS_RXIFLSEL_GET(reg) BSP_FLD32GET(reg, 3, 5) -#define PL011_UARTIFLS_RXIFLSEL_SET(reg, val) BSP_FLD32SET(reg, val, 3, 5) -#define PL011_UARTIFLS_TXIFLSEL(val) BSP_FLD32(val, 0, 2) -#define PL011_UARTIFLS_TXIFLSEL_GET(reg) BSP_FLD32GET(reg, 0, 2) -#define PL011_UARTIFLS_TXIFLSEL_SET(reg, val) BSP_FLD32SET(reg, val, 0, 2) - uint32_t uartimsc; - uint32_t uartris; - uint32_t uartmis; - uint32_t uarticr; -#define PL011_UARTI_OEI BSP_BIT32(10) -#define PL011_UARTI_BEI BSP_BIT32(9) -#define PL011_UARTI_PEI BSP_BIT32(8) -#define PL011_UARTI_FEI BSP_BIT32(7) -#define PL011_UARTI_RTI BSP_BIT32(6) -#define PL011_UARTI_TXI BSP_BIT32(5) -#define PL011_UARTI_RXI BSP_BIT32(4) -#define PL011_UARTI_DSRMI BSP_BIT32(3) -#define PL011_UARTI_DCDMI BSP_BIT32(2) -#define PL011_UARTI_CTSMI BSP_BIT32(1) -#define PL011_UARTI_RIMI BSP_BIT32(0) - uint32_t uartdmacr; -#define PL011_UARTDMACR_DMAONERR BSP_BIT32(2) -#define PL011_UARTDMACR_TXDMAE BSP_BIT32(1) -#define PL011_UARTDMACR_RXDMAE BSP_BIT32(0) - uint32_t reserved_4c[997]; - uint32_t uartperiphid0; - uint32_t uartperiphid1; - uint32_t uartperiphid2; - uint32_t uartperiphid3; - uint32_t uartpcellid0; - uint32_t uartpcellid1; - uint32_t uartpcellid2; - uint32_t uartpcellid3; -} pl011; - -#endif /* LIBBSP_ARM_SHARED_ARM_PL011_REGS_H */ diff --git a/bsps/arm/include/bsp/arm-pl011.h b/bsps/arm/include/bsp/arm-pl011.h deleted file mode 100644 index 49ff413581..0000000000 --- a/bsps/arm/include/bsp/arm-pl011.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file - * - * @ingroup RTEMSBSPsARMShared - * - * @brief ARM PL011 Support Package - */ - -/* - * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifndef LIBBSP_ARM_SHARED_ARM_PL011_H -#define LIBBSP_ARM_SHARED_ARM_PL011_H - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef struct { - rtems_termios_device_context base; - volatile pl011 *regs; - rtems_vector_number irq; - uint32_t initial_baud; -} arm_pl011_context; - -bool arm_pl011_probe(rtems_termios_device_context *base); - -void arm_pl011_write_polled(rtems_termios_device_context *base, char c); - -extern const rtems_termios_device_handler arm_pl011_fns; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* LIBBSP_ARM_SHARED_ARM_PL011_H */ diff --git a/bsps/arm/raspberrypi/console/console-config.c b/bsps/arm/raspberrypi/console/console-config.c index bb0b596019..6b8eb80aa4 100644 --- a/bsps/arm/raspberrypi/console/console-config.c +++ b/bsps/arm/raspberrypi/console/console-config.c @@ -25,13 +25,13 @@ #include #include #include +#include #include #include #include #include #include -#include #include #include #include diff --git a/bsps/arm/realview-pbx-a9/include/bsp/console.h b/bsps/arm/realview-pbx-a9/include/bsp/console.h index da2e4099e2..2019fc2509 100644 --- a/bsps/arm/realview-pbx-a9/include/bsp/console.h +++ b/bsps/arm/realview-pbx-a9/include/bsp/console.h @@ -15,7 +15,7 @@ #ifndef LIBBSP_ARM_REALVIEW_PBX_A9_BSP_CONSOLE_H #define LIBBSP_ARM_REALVIEW_PBX_A9_BSP_CONSOLE_H -#include +#include #ifdef __cplusplus extern "C" { diff --git a/bsps/arm/shared/serial/arm-pl011.c b/bsps/arm/shared/serial/arm-pl011.c deleted file mode 100644 index 44a409e551..0000000000 --- a/bsps/arm/shared/serial/arm-pl011.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include - -static volatile pl011 *pl011_get_regs(rtems_termios_device_context *base) -{ - arm_pl011_context *ctx = (arm_pl011_context *) base; - - return ctx->regs; -} - - -bool arm_pl011_probe(rtems_termios_device_context *base) -{ - volatile pl011 *regs = pl011_get_regs(base); - - regs->uartlcr_h = PL011_UARTLCR_H_WLEN(PL011_UARTLCR_H_WLEN_8); - regs->uartcr = PL011_UARTCR_RXE - | PL011_UARTCR_TXE - | PL011_UARTCR_UARTEN; - - return true; -} - -static bool pl011_first_open( - struct rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - arm_pl011_context *ctx = (arm_pl011_context *) base; - - rtems_termios_set_initial_baud(tty, ctx->initial_baud); - - return true; -} - -static int pl011_read_polled(rtems_termios_device_context *base) -{ - volatile pl011 *regs = pl011_get_regs(base); - - if ((regs->uartfr & PL011_UARTFR_RXFE) != 0) { - return -1; - } else { - return PL011_UARTDR_DATA_GET(regs->uartdr); - } -} - -void arm_pl011_write_polled(rtems_termios_device_context *base, char c) -{ - volatile pl011 *regs = pl011_get_regs(base); - - while ((regs->uartfr & PL011_UARTFR_TXFF) != 0) { - /* Wait */ - } - - regs->uartdr = PL011_UARTDR_DATA(c); -} - -static void pl011_write_support_polled( - rtems_termios_device_context *base, - const char *s, - size_t n -) -{ - size_t i; - - for (i = 0; i < n; ++i) { - arm_pl011_write_polled(base, s[i]); - } -} - -const rtems_termios_device_handler arm_pl011_fns = { - .first_open = pl011_first_open, - .poll_read = pl011_read_polled, - .write = pl011_write_support_polled, - .mode = TERMIOS_POLLED -}; diff --git a/bsps/arm/xen/console/console.c b/bsps/arm/xen/console/console.c index 786b98f3ba..05eceae438 100644 --- a/bsps/arm/xen/console/console.c +++ b/bsps/arm/xen/console/console.c @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff --git a/bsps/headers.am b/bsps/headers.am index 5af7e43b4a..aaf13284bd 100644 --- a/bsps/headers.am +++ b/bsps/headers.am @@ -21,6 +21,11 @@ include_bsp_HEADERS += ../../bsps/include/bsp/u-boot.h include_bsp_HEADERS += ../../bsps/include/bsp/uart-output-char.h include_bsp_HEADERS += ../../bsps/include/bsp/utility.h +include_dev_serialdir = $(includedir)/dev/serial +include_dev_serial_HEADERS = +include_dev_serial_HEADERS += ../../bsps/include/dev/serial/arm-pl011-regs.h +include_dev_serial_HEADERS += ../../bsps/include/dev/serial/arm-pl011.h + include_grlibdir = $(includedir)/grlib include_grlib_HEADERS = include_grlib_HEADERS += ../../bsps/include/grlib/ahbstat.h diff --git a/bsps/include/dev/serial/arm-pl011-regs.h b/bsps/include/dev/serial/arm-pl011-regs.h new file mode 100644 index 0000000000..afe80a6262 --- /dev/null +++ b/bsps/include/dev/serial/arm-pl011-regs.h @@ -0,0 +1,130 @@ +/** + * @file + * + * @ingroup RTEMSBSPsARMShared + * + * @brief ARM PL011 Register definitions + */ + +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef LIBBSP_ARM_SHARED_ARM_PL011_REGS_H +#define LIBBSP_ARM_SHARED_ARM_PL011_REGS_H + +#include + +typedef struct { + uint32_t uartdr; +#define PL011_UARTDR_OE BSP_BIT32(11) +#define PL011_UARTDR_BE BSP_BIT32(10) +#define PL011_UARTDR_PE BSP_BIT32(9) +#define PL011_UARTDR_FE BSP_BIT32(8) +#define PL011_UARTDR_DATA(val) BSP_FLD32(val, 0, 7) +#define PL011_UARTDR_DATA_GET(reg) BSP_FLD32GET(reg, 0, 7) +#define PL011_UARTDR_DATA_SET(reg, val) BSP_FLD32SET(reg, val, 0, 7) + uint32_t uartrsr_uartecr; +#define PL011_UARTRSR_UARTECR_OE BSP_BIT32(3) +#define PL011_UARTRSR_UARTECR_BE BSP_BIT32(2) +#define PL011_UARTRSR_UARTECR_PE BSP_BIT32(1) +#define PL011_UARTRSR_UARTECR_FE BSP_BIT32(0) + uint32_t reserved_08[4]; + uint32_t uartfr; +#define PL011_UARTFR_RI BSP_BIT32(8) +#define PL011_UARTFR_TXFE BSP_BIT32(7) +#define PL011_UARTFR_RXFF BSP_BIT32(6) +#define PL011_UARTFR_TXFF BSP_BIT32(5) +#define PL011_UARTFR_RXFE BSP_BIT32(4) +#define PL011_UARTFR_BUSY BSP_BIT32(3) +#define PL011_UARTFR_DCD BSP_BIT32(2) +#define PL011_UARTFR_DSR BSP_BIT32(1) +#define PL011_UARTFR_CTS BSP_BIT32(0) + uint32_t reserved_1c; + uint32_t uartilpr; +#define PL011_UARTILPR_ILPDVSR(val) BSP_FLD32(val, 0, 7) +#define PL011_UARTILPR_ILPDVSR_GET(reg) BSP_FLD32GET(reg, 0, 7) +#define PL011_UARTILPR_ILPDVSR_SET(reg, val) BSP_FLD32SET(reg, val, 0, 7) + uint32_t uartibrd; +#define PL011_UARTIBRD_BAUD_DIVINT(val) BSP_FLD32(val, 0, 15) +#define PL011_UARTIBRD_BAUD_DIVINT_GET(reg) BSP_FLD32GET(reg, 0, 15) +#define PL011_UARTIBRD_BAUD_DIVINT_SET(reg, val) BSP_FLD32SET(reg, val, 0, 15) + uint32_t uartfbrd; +#define PL011_UARTFBRD_BAUD_DIVFRAC(val) BSP_FLD32(val, 0, 5) +#define PL011_UARTFBRD_BAUD_DIVFRAC_GET(reg) BSP_FLD32GET(reg, 0, 5) +#define PL011_UARTFBRD_BAUD_DIVFRAC_SET(reg, val) BSP_FLD32SET(reg, val, 0, 5) + uint32_t uartlcr_h; +#define PL011_UARTLCR_H_SPS BSP_BIT32(7) +#define PL011_UARTLCR_H_WLEN(val) BSP_FLD32(val, 5, 6) +#define PL011_UARTLCR_H_WLEN_GET(reg) BSP_FLD32GET(reg, 5, 6) +#define PL011_UARTLCR_H_WLEN_SET(reg, val) BSP_FLD32SET(reg, val, 5, 6) +#define PL011_UARTLCR_H_WLEN_5 0x00U +#define PL011_UARTLCR_H_WLEN_6 0x01U +#define PL011_UARTLCR_H_WLEN_7 0x02U +#define PL011_UARTLCR_H_WLEN_8 0x03U +#define PL011_UARTLCR_H_FEN BSP_BIT32(4) +#define PL011_UARTLCR_H_STP2 BSP_BIT32(3) +#define PL011_UARTLCR_H_EPS BSP_BIT32(2) +#define PL011_UARTLCR_H_PEN BSP_BIT32(1) +#define PL011_UARTLCR_H_BRK BSP_BIT32(0) + uint32_t uartcr; +#define PL011_UARTCR_CTSEN BSP_BIT32(15) +#define PL011_UARTCR_RTSEN BSP_BIT32(14) +#define PL011_UARTCR_OUT2 BSP_BIT32(13) +#define PL011_UARTCR_OUT1 BSP_BIT32(12) +#define PL011_UARTCR_RTS BSP_BIT32(11) +#define PL011_UARTCR_DTR BSP_BIT32(10) +#define PL011_UARTCR_RXE BSP_BIT32(9) +#define PL011_UARTCR_TXE BSP_BIT32(8) +#define PL011_UARTCR_LBE BSP_BIT32(7) +#define PL011_UARTCR_SIRLP BSP_BIT32(3) +#define PL011_UARTCR_SIREN BSP_BIT32(2) +#define PL011_UARTCR_UARTEN BSP_BIT32(1) + uint32_t uartifls; +#define PL011_UARTIFLS_RXIFLSEL(val) BSP_FLD32(val, 3, 5) +#define PL011_UARTIFLS_RXIFLSEL_GET(reg) BSP_FLD32GET(reg, 3, 5) +#define PL011_UARTIFLS_RXIFLSEL_SET(reg, val) BSP_FLD32SET(reg, val, 3, 5) +#define PL011_UARTIFLS_TXIFLSEL(val) BSP_FLD32(val, 0, 2) +#define PL011_UARTIFLS_TXIFLSEL_GET(reg) BSP_FLD32GET(reg, 0, 2) +#define PL011_UARTIFLS_TXIFLSEL_SET(reg, val) BSP_FLD32SET(reg, val, 0, 2) + uint32_t uartimsc; + uint32_t uartris; + uint32_t uartmis; + uint32_t uarticr; +#define PL011_UARTI_OEI BSP_BIT32(10) +#define PL011_UARTI_BEI BSP_BIT32(9) +#define PL011_UARTI_PEI BSP_BIT32(8) +#define PL011_UARTI_FEI BSP_BIT32(7) +#define PL011_UARTI_RTI BSP_BIT32(6) +#define PL011_UARTI_TXI BSP_BIT32(5) +#define PL011_UARTI_RXI BSP_BIT32(4) +#define PL011_UARTI_DSRMI BSP_BIT32(3) +#define PL011_UARTI_DCDMI BSP_BIT32(2) +#define PL011_UARTI_CTSMI BSP_BIT32(1) +#define PL011_UARTI_RIMI BSP_BIT32(0) + uint32_t uartdmacr; +#define PL011_UARTDMACR_DMAONERR BSP_BIT32(2) +#define PL011_UARTDMACR_TXDMAE BSP_BIT32(1) +#define PL011_UARTDMACR_RXDMAE BSP_BIT32(0) + uint32_t reserved_4c[997]; + uint32_t uartperiphid0; + uint32_t uartperiphid1; + uint32_t uartperiphid2; + uint32_t uartperiphid3; + uint32_t uartpcellid0; + uint32_t uartpcellid1; + uint32_t uartpcellid2; + uint32_t uartpcellid3; +} pl011; + +#endif /* LIBBSP_ARM_SHARED_ARM_PL011_REGS_H */ diff --git a/bsps/include/dev/serial/arm-pl011.h b/bsps/include/dev/serial/arm-pl011.h new file mode 100644 index 0000000000..c7e65656a3 --- /dev/null +++ b/bsps/include/dev/serial/arm-pl011.h @@ -0,0 +1,51 @@ +/** + * @file + * + * @ingroup RTEMSBSPsARMShared + * + * @brief ARM PL011 Support Package + */ + +/* + * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef LIBBSP_ARM_SHARED_ARM_PL011_H +#define LIBBSP_ARM_SHARED_ARM_PL011_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef struct { + rtems_termios_device_context base; + volatile pl011 *regs; + rtems_vector_number irq; + uint32_t initial_baud; +} arm_pl011_context; + +bool arm_pl011_probe(rtems_termios_device_context *base); + +void arm_pl011_write_polled(rtems_termios_device_context *base, char c); + +extern const rtems_termios_device_handler arm_pl011_fns; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_ARM_SHARED_ARM_PL011_H */ diff --git a/bsps/shared/dev/serial/arm-pl011.c b/bsps/shared/dev/serial/arm-pl011.c new file mode 100644 index 0000000000..c3cbab6f3e --- /dev/null +++ b/bsps/shared/dev/serial/arm-pl011.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include + +static volatile pl011 *pl011_get_regs(rtems_termios_device_context *base) +{ + arm_pl011_context *ctx = (arm_pl011_context *) base; + + return ctx->regs; +} + + +bool arm_pl011_probe(rtems_termios_device_context *base) +{ + volatile pl011 *regs = pl011_get_regs(base); + + regs->uartlcr_h = PL011_UARTLCR_H_WLEN(PL011_UARTLCR_H_WLEN_8); + regs->uartcr = PL011_UARTCR_RXE + | PL011_UARTCR_TXE + | PL011_UARTCR_UARTEN; + + return true; +} + +static bool pl011_first_open( + struct rtems_termios_tty *tty, + rtems_termios_device_context *base, + struct termios *term, + rtems_libio_open_close_args_t *args +) +{ + arm_pl011_context *ctx = (arm_pl011_context *) base; + + rtems_termios_set_initial_baud(tty, ctx->initial_baud); + + return true; +} + +static int pl011_read_polled(rtems_termios_device_context *base) +{ + volatile pl011 *regs = pl011_get_regs(base); + + if ((regs->uartfr & PL011_UARTFR_RXFE) != 0) { + return -1; + } else { + return PL011_UARTDR_DATA_GET(regs->uartdr); + } +} + +void arm_pl011_write_polled(rtems_termios_device_context *base, char c) +{ + volatile pl011 *regs = pl011_get_regs(base); + + while ((regs->uartfr & PL011_UARTFR_TXFF) != 0) { + /* Wait */ + } + + regs->uartdr = PL011_UARTDR_DATA(c); +} + +static void pl011_write_support_polled( + rtems_termios_device_context *base, + const char *s, + size_t n +) +{ + size_t i; + + for (i = 0; i < n; ++i) { + arm_pl011_write_polled(base, s[i]); + } +} + +const rtems_termios_device_handler arm_pl011_fns = { + .first_open = pl011_first_open, + .poll_read = pl011_read_polled, + .write = pl011_write_support_polled, + .mode = TERMIOS_POLLED +}; diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am index 48c346d3a3..01f44a7636 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am @@ -64,7 +64,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/irq/irq.c # Console librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c -librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/serial/arm-pl011.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/arm-pl011.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/console-config.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/fb.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/fbcons.c diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am index d5549275be..77b7db4cca 100644 --- a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am +++ b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am @@ -62,7 +62,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/irq/irq-gic.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/getserialmouseps2.c -librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/serial/arm-pl011.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/arm-pl011.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/serial/arm-pl050.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/realview-pbx-a9/console/console-config.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/realview-pbx-a9/console/console-polled.c diff --git a/c/src/lib/libbsp/arm/xen/Makefile.am b/c/src/lib/libbsp/arm/xen/Makefile.am index fecb665af4..18cce5ec29 100644 --- a/c/src/lib/libbsp/arm/xen/Makefile.am +++ b/c/src/lib/libbsp/arm/xen/Makefile.am @@ -39,7 +39,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/irq/irq-gic.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/xen/console/console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c -librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/serial/arm-pl011.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/arm-pl011.c # timer librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/btimer/btimer-stub.c diff --git a/spec/build/bsps/arm/grp.yml b/spec/build/bsps/arm/grp.yml index 2bf0b82423..b6fcb56a25 100644 --- a/spec/build/bsps/arm/grp.yml +++ b/spec/build/bsps/arm/grp.yml @@ -26,8 +26,6 @@ install: - bsps/arm/include/bsp/arm-gic-regs.h - bsps/arm/include/bsp/arm-gic-tm27.h - bsps/arm/include/bsp/arm-gic.h - - bsps/arm/include/bsp/arm-pl011-regs.h - - bsps/arm/include/bsp/arm-pl011.h - bsps/arm/include/bsp/arm-pl050-regs.h - bsps/arm/include/bsp/arm-pl050.h - bsps/arm/include/bsp/arm-pl111-fb.h diff --git a/spec/build/bsps/arm/raspberrypi/obj.yml b/spec/build/bsps/arm/raspberrypi/obj.yml index 45180cdd5f..a120d8007b 100644 --- a/spec/build/bsps/arm/raspberrypi/obj.yml +++ b/spec/build/bsps/arm/raspberrypi/obj.yml @@ -47,7 +47,6 @@ source: - bsps/arm/shared/cache/cache-v7ar-disable-data.S - bsps/arm/shared/cp15/arm-cp15-set-exception-handler.c - bsps/arm/shared/cp15/arm-cp15-set-ttb-entries.c -- bsps/arm/shared/serial/arm-pl011.c - bsps/arm/shared/start/bsp-start-memcpy.S - bsps/shared/dev/cpucounter/cpucounterfrequency.c - bsps/shared/dev/cpucounter/cpucounterread.c diff --git a/spec/build/bsps/arm/realview-pbx-a9/bsprealviewpbxa9.yml b/spec/build/bsps/arm/realview-pbx-a9/bsprealviewpbxa9.yml index 2721152b93..9b24f8eae2 100644 --- a/spec/build/bsps/arm/realview-pbx-a9/bsprealviewpbxa9.yml +++ b/spec/build/bsps/arm/realview-pbx-a9/bsprealviewpbxa9.yml @@ -68,7 +68,6 @@ source: - bsps/arm/shared/cp15/arm-cp15-set-ttb-entries.c - bsps/arm/shared/fb/arm-pl111.c - bsps/arm/shared/irq/irq-gic.c -- bsps/arm/shared/serial/arm-pl011.c - bsps/arm/shared/serial/arm-pl050.c - bsps/arm/shared/start/bsp-start-memcpy.S - bsps/shared/dev/btimer/btimer-stub.c diff --git a/spec/build/bsps/arm/xen/bspxen.yml b/spec/build/bsps/arm/xen/bspxen.yml index e469170e34..df14fcce66 100644 --- a/spec/build/bsps/arm/xen/bspxen.yml +++ b/spec/build/bsps/arm/xen/bspxen.yml @@ -60,7 +60,6 @@ source: - bsps/arm/shared/cp15/arm-cp15-set-exception-handler.c - bsps/arm/shared/cp15/arm-cp15-set-ttb-entries.c - bsps/arm/shared/irq/irq-gic.c -- bsps/arm/shared/serial/arm-pl011.c - bsps/arm/shared/start/bsp-start-memcpy.S - bsps/arm/xen/console/console.c - bsps/arm/xen/start/bspstart.c diff --git a/spec/build/bsps/obj.yml b/spec/build/bsps/obj.yml index 8809238057..29084a70b8 100644 --- a/spec/build/bsps/obj.yml +++ b/spec/build/bsps/obj.yml @@ -52,6 +52,10 @@ install: - bsps/include/libchip/spi-sd-card.h - bsps/include/libchip/wd80x3.h - bsps/include/libchip/z85c30.h +- destination: ${BSP_INCLUDEDIR}/dev/serial + source: + - bsps/include/dev/serial/arm-pl011-regs.h + - bsps/include/dev/serial/arm-pl011.h - destination: ${BSP_INCLUDEDIR}/rtems/zilog source: - bsps/include/rtems/zilog/z8036.h @@ -91,6 +95,7 @@ source: - bsps/shared/dev/rtc/mc146818a.c - bsps/shared/dev/rtc/mc146818a_ioreg.c - bsps/shared/dev/rtc/rtcprobe.c +- bsps/shared/dev/serial/arm-pl011.c - bsps/shared/dev/serial/mc68681_baud.c - bsps/shared/dev/serial/mc68681.c - bsps/shared/dev/serial/mc68681_reg2.c -- cgit v1.2.3