This is an automated email from the ASF dual-hosted git repository. jerpelea pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 7f4cb3057a230f5996fdaadad7919748f9749fef Author: hujun5 <huj...@xiaomi.com> AuthorDate: Wed Mar 8 19:53:36 2023 +0800 arch/arm64: merge serial_pl011.c and qemu_serial.c At present, the serial drivers qemu_serial.c and serial_pl011.c on the fvp-v8r and qemu platforms in arm64 are duplicated and need to be merged. The plan is to place them under the drivers\serial directory to create a common code module, so that both fvp-v8r and qemu can use the same code. In the future, if new platforms use pl011 serial ports, they can also be directly reused Signed-off-by: hujun5 <huj...@xiaomi.com> --- arch/arm64/src/fvp-v8r/Kconfig | 7 - arch/arm64/src/fvp-v8r/Make.defs | 2 +- arch/arm64/src/fvp-v8r/fvp_boot.h | 2 - .../{qemu/qemu_serial.h => fvp-v8r/fvp_serial.c} | 75 +- arch/arm64/src/fvp-v8r/serial_pl011.h | 15 - arch/arm64/src/qemu/Kconfig | 7 - arch/arm64/src/qemu/qemu_boot.h | 2 - arch/arm64/src/qemu/qemu_serial.c | 796 +-------------------- arch/arm64/src/qemu/qemu_serial.h | 3 - .../arm64/fvp-v8r/fvp-armv8r/configs/nsh/defconfig | 14 +- .../fvp-v8r/fvp-armv8r/configs/nsh_smp/defconfig | 14 +- .../configs/{nsh_gicv2 => citest}/defconfig | 7 +- .../qemu/qemu-armv8a/configs/netnsh/defconfig | 5 +- .../qemu/qemu-armv8a/configs/netnsh_smp/defconfig | 5 +- .../arm64/qemu/qemu-armv8a/configs/nsh/defconfig | 5 +- .../qemu/qemu-armv8a/configs/nsh_gicv2/defconfig | 5 +- .../qemu/qemu-armv8a/configs/nsh_smp/defconfig | 5 +- .../qemu-armv8a/configs/nsh_smp_tickless/defconfig | 5 +- drivers/serial/Kconfig | 8 + drivers/serial/Kconfig-pl011 | 60 ++ drivers/serial/Make.defs | 4 + .../src/fvp-v8r => drivers/serial}/serial_pl011.c | 30 +- .../nuttx/serial/uart_pl011.h | 31 +- 23 files changed, 197 insertions(+), 910 deletions(-) diff --git a/arch/arm64/src/fvp-v8r/Kconfig b/arch/arm64/src/fvp-v8r/Kconfig index c79840f7ae..d8b4704c38 100644 --- a/arch/arm64/src/fvp-v8r/Kconfig +++ b/arch/arm64/src/fvp-v8r/Kconfig @@ -21,11 +21,4 @@ endchoice # FVP Chip Selection endmenu # "FVP Chip Selection" -menu "FVP Peripheral Selection" -config FVP_UART_PL011 - bool "UART" - default n - select UART1_SERIALDRIVER -endmenu # FVP Peripheral Selection - endif # ARCH_CHIP_FVP_ARMV8R diff --git a/arch/arm64/src/fvp-v8r/Make.defs b/arch/arm64/src/fvp-v8r/Make.defs index 0f5d396c1b..c314e8d139 100644 --- a/arch/arm64/src/fvp-v8r/Make.defs +++ b/arch/arm64/src/fvp-v8r/Make.defs @@ -21,7 +21,7 @@ include common/Make.defs # fvp-specific C source files -CHIP_CSRCS = fvp_boot.c serial_pl011.c +CHIP_CSRCS = fvp_boot.c fvp_serial.c ifeq ($(CONFIG_ARCH_EARLY_PRINT),y) CHIP_ASRCS += fvp_lowputc.S diff --git a/arch/arm64/src/fvp-v8r/fvp_boot.h b/arch/arm64/src/fvp-v8r/fvp_boot.h index 611d23a962..0ef44f255d 100644 --- a/arch/arm64/src/fvp-v8r/fvp_boot.h +++ b/arch/arm64/src/fvp-v8r/fvp_boot.h @@ -31,8 +31,6 @@ #include <stdint.h> #include <stdbool.h> #include <arch/chip/chip.h> -#include "arm64_internal.h" -#include "arm64_arch.h" /**************************************************************************** * Pre-processor Definitions diff --git a/arch/arm64/src/qemu/qemu_serial.h b/arch/arm64/src/fvp-v8r/fvp_serial.c similarity index 61% copy from arch/arm64/src/qemu/qemu_serial.h copy to arch/arm64/src/fvp-v8r/fvp_serial.c index 815ec639a3..4d08cf373f 100644 --- a/arch/arm64/src/qemu/qemu_serial.h +++ b/arch/arm64/src/fvp-v8r/fvp_serial.c @@ -1,5 +1,5 @@ -/**************************************************************************** - * arch/arm64/src/qemu/qemu_serial.h +/*************************************************************************** + * arch/arm64/src/fvp-v8r/fvp_serial.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -16,46 +16,59 @@ * License for the specific language governing permissions and limitations * under the License. * - ****************************************************************************/ + ***************************************************************************/ -#ifndef __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H -#define __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H - -/**************************************************************************** +/*************************************************************************** * Included Files - ****************************************************************************/ + ***************************************************************************/ #include <nuttx/config.h> +#include <sys/types.h> +#include <stdint.h> +#include <stdbool.h> +#include <unistd.h> +#include <string.h> +#include <assert.h> +#include <errno.h> +#include <debug.h> +#include <nuttx/serial/uart_pl011.h> #include "arm64_internal.h" -#include "arm64_gic.h" -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ +#ifdef USE_SERIALDRIVER -/**************************************************************************** - * Public Types - ****************************************************************************/ +/*************************************************************************** + * Public Functions + ***************************************************************************/ -/**************************************************************************** - * Inline Functions - ****************************************************************************/ +/*************************************************************************** + * Name: arm64_earlyserialinit + * + * Description: + * see arm64_internal.h + * + ***************************************************************************/ -#ifndef __ASSEMBLY__ +void arm64_earlyserialinit(void) +{ + /* Enable the console UART. The other UARTs will be initialized if and + * when they are first opened. + */ -/**************************************************************************** - * Public Data - ****************************************************************************/ + pl011_earlyserialinit(); +} -#ifdef CONFIG_ARCH_CHIP_QEMU -#define CONFIG_QEMU_UART_BASE 0x9000000 -#define CONFIG_QEMU_UART_IRQ (GIC_SPI_INT_BASE + 1) -#endif +/*************************************************************************** + * Name: arm64_serialinit + * + * Description: + * see arm64_internal.h + * + ***************************************************************************/ -/**************************************************************************** - * Public Function Prototypes - ****************************************************************************/ +void arm64_serialinit(void) +{ + pl011_serialinit(); +} -#endif /* __ASSEMBLY__ */ -#endif /* __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H */ +#endif /* USE_SERIALDRIVER */ diff --git a/arch/arm64/src/fvp-v8r/serial_pl011.h b/arch/arm64/src/fvp-v8r/serial_pl011.h index 0eeb0e73d3..39715a9741 100644 --- a/arch/arm64/src/fvp-v8r/serial_pl011.h +++ b/arch/arm64/src/fvp-v8r/serial_pl011.h @@ -35,21 +35,6 @@ * Public Types ****************************************************************************/ -#ifdef CONFIG_FVP_UART_PL011 -#define CONFIG_UART0_BASE 0x9c090000 -#define CONFIG_UART0_IRQ (GIC_SPI_INT_BASE + 5) - -#define CONFIG_UART1_BASE 0x9c0a0000 -#define CONFIG_UART1_IRQ (GIC_SPI_INT_BASE + 6) - -#define CONFIG_UART2_BASE 0x9c0b0000 -#define CONFIG_UART2_IRQ (GIC_SPI_INT_BASE + 7) - -#define CONFIG_UART3_BASE 0x9c0c0000 -#define CONFIG_UART3_IRQ (GIC_SPI_INT_BASE + 8) - -#endif - /**************************************************************************** * Inline Functions ****************************************************************************/ diff --git a/arch/arm64/src/qemu/Kconfig b/arch/arm64/src/qemu/Kconfig index 32e6b6959d..484f7bfd75 100644 --- a/arch/arm64/src/qemu/Kconfig +++ b/arch/arm64/src/qemu/Kconfig @@ -33,11 +33,4 @@ endchoice # Qemu Chip Selection endmenu # "Qemu Chip Selection" -menu "Qemu Peripheral Selection" -config QEMU_UART_PL011 - bool "UART" - default n - select UART1_SERIALDRIVER -endmenu # Qemu Peripheral Selection - endif # ARCH_CHIP_QEMU diff --git a/arch/arm64/src/qemu/qemu_boot.h b/arch/arm64/src/qemu/qemu_boot.h index 4859535cad..301ef88db1 100644 --- a/arch/arm64/src/qemu/qemu_boot.h +++ b/arch/arm64/src/qemu/qemu_boot.h @@ -31,8 +31,6 @@ #include <stdint.h> #include <stdbool.h> #include <arch/chip/chip.h> -#include "arm64_internal.h" -#include "arm64_arch.h" /**************************************************************************** * Pre-processor Definitions diff --git a/arch/arm64/src/qemu/qemu_serial.c b/arch/arm64/src/qemu/qemu_serial.c index 563c51dc72..69e4d410f4 100644 --- a/arch/arm64/src/qemu/qemu_serial.c +++ b/arch/arm64/src/qemu/qemu_serial.c @@ -32,755 +32,10 @@ #include <errno.h> #include <debug.h> -#ifdef CONFIG_SERIAL_TERMIOS -# include <termios.h> -#endif - -#include <nuttx/irq.h> -#include <nuttx/arch.h> -#include <nuttx/spinlock.h> -#include <nuttx/init.h> -#include <nuttx/fs/ioctl.h> -#include <nuttx/semaphore.h> -#include <nuttx/serial/serial.h> - -#include "arm64_arch.h" +#include <nuttx/serial/uart_pl011.h> #include "arm64_internal.h" -#include "qemu_serial.h" -#include "arm64_arch_timer.h" -#include "qemu_boot.h" -#include "arm64_gic.h" #ifdef USE_SERIALDRIVER - -/*************************************************************************** - * Pre-processor Definitions - ***************************************************************************/ - -/* Which UART with be tty0/console and which tty1-4? The console will - * always be ttyS0. If there is no console then will use the lowest - * numbered UART. - */ - -/* First pick the console and ttys0. This could be any of UART1-5 */ - -#if defined(CONFIG_UART1_SERIAL_CONSOLE) -# define CONSOLE_DEV g_uart1port /* UART1 is console */ -# define TTYS0_DEV g_uart1port /* UART1 is ttyS0 */ -# define UART1_ASSIGNED 1 -#endif - -#define PL011_BIT_MASK(x, y) (((2 << (x)) - 1) << (y)) - -/* PL011 Uart Flags Register */ -#define PL011_FR_CTS BIT(0) /* clear to send - inverted */ -#define PL011_FR_DSR BIT(1) /* data set ready - inverted - */ -#define PL011_FR_DCD BIT(2) /* data carrier detect - - * inverted */ -#define PL011_FR_BUSY BIT(3) /* busy transmitting data */ -#define PL011_FR_RXFE BIT(4) /* receive FIFO empty */ -#define PL011_FR_TXFF BIT(5) /* transmit FIFO full */ -#define PL011_FR_RXFF BIT(6) /* receive FIFO full */ -#define PL011_FR_TXFE BIT(7) /* transmit FIFO empty */ -#define PL011_FR_RI BIT(8) /* ring indicator - inverted */ - -/* PL011 Integer baud rate register */ -#define PL011_IBRD_BAUD_DIVINT_MASK 0xff /* 16 bits of divider */ - -/* PL011 Fractional baud rate register */ -#define PL011_FBRD_BAUD_DIVFRAC 0x3f -#define PL011_FBRD_WIDTH 6u - -/* PL011 Receive status register / error clear register */ -#define PL011_RSR_ECR_FE BIT(0) /* framing error */ -#define PL011_RSR_ECR_PE BIT(1) /* parity error */ -#define PL011_RSR_ECR_BE BIT(2) /* break error */ -#define PL011_RSR_ECR_OE BIT(3) /* overrun error */ - -#define PL011_RSR_ERROR_MASK (PL011_RSR_ECR_FE | PL011_RSR_ECR_PE | \ - PL011_RSR_ECR_BE | PL011_RSR_ECR_OE) - -/* PL011 Line Control Register */ -#define PL011_LCRH_BRK BIT(0) /* send break */ -#define PL011_LCRH_PEN BIT(1) /* enable parity */ -#define PL011_LCRH_EPS BIT(2) /* select even parity */ -#define PL011_LCRH_STP2 BIT(3) /* select two stop bits */ -#define PL011_LCRH_FEN BIT(4) /* enable FIFOs */ -#define PL011_LCRH_WLEN_SHIFT 5 /* word length */ -#define PL011_LCRH_WLEN_WIDTH 2 -#define PL011_LCRH_SPS BIT(7) /* stick parity bit */ - -#define PL011_LCRH_WLEN_SIZE(x) ((x) - 5) - -#define PL011_LCRH_FORMAT_MASK (PL011_LCRH_PEN | PL011_LCRH_EPS | \ - PL011_LCRH_SPS | \ - PL011_BIT_MASK(PL011_LCRH_WLEN_WIDTH, \ - PL011_LCRH_WLEN_SHIFT)) - -#define PL011_LCRH_PARTIY_EVEN (PL011_LCRH_PEN | PL011_LCRH_EPS) -#define PL011_LCRH_PARITY_ODD (PL011_LCRH_PEN) -#define PL011_LCRH_PARITY_NONE (0) - -/* PL011 Control Register */ -#define PL011_CR_UARTEN BIT(0) /* enable uart operations */ -#define PL011_CR_SIREN BIT(1) /* enable IrDA SIR */ -#define PL011_CR_SIRLP BIT(2) /* IrDA SIR low power mode */ -#define PL011_CR_LBE BIT(7) /* loop back enable */ -#define PL011_CR_TXE BIT(8) /* transmit enable */ -#define PL011_CR_RXE BIT(9) /* receive enable */ -#define PL011_CR_DTR BIT(10) /* data transmit ready */ -#define PL011_CR_RTS BIT(11) /* request to send */ -#define PL011_CR_Out1 BIT(12) -#define PL011_CR_Out2 BIT(13) -#define PL011_CR_RTSEn BIT(14) /* RTS hw flow control enable - */ -#define PL011_CR_CTSEn BIT(15) /* CTS hw flow control enable - */ - -/* PL011 Interrupt Fifo Level Select Register */ -#define PL011_IFLS_TXIFLSEL_SHIFT 0 /* bits 2:0 */ -#define PL011_IFLS_TXIFLSEL_WIDTH 3 -#define PL011_IFLS_RXIFLSEL_SHIFT 3 /* bits 5:3 */ -#define PL011_IFLS_RXIFLSEL_WIDTH 3 - -/* PL011 Interrupt Mask Set/Clear Register */ -#define PL011_IMSC_RIMIM BIT(0) /* RTR modem interrupt mask */ -#define PL011_IMSC_CTSMIM BIT(1) /* CTS modem interrupt mask */ -#define PL011_IMSC_DCDMIM BIT(2) /* DCD modem interrupt mask */ -#define PL011_IMSC_DSRMIM BIT(3) /* DSR modem interrupt mask */ -#define PL011_IMSC_RXIM BIT(4) /* receive interrupt mask */ -#define PL011_IMSC_TXIM BIT(5) /* transmit interrupt mask */ -#define PL011_IMSC_RTIM BIT(6) /* receive timeout interrupt - * mask */ -#define PL011_IMSC_FEIM BIT(7) /* framing error interrupt - * mask */ -#define PL011_IMSC_PEIM BIT(8) /* parity error interrupt mask - */ -#define PL011_IMSC_BEIM BIT(9) /* break error interrupt mask - */ -#define PL011_IMSC_OEIM BIT(10) /* overrun error interrupt - * mask */ - -#define PL011_IMSC_ERROR_MASK (PL011_IMSC_FEIM | \ - PL011_IMSC_PEIM | PL011_IMSC_BEIM | \ - PL011_IMSC_OEIM) - -#define PL011_IMSC_MASK_ALL (PL011_IMSC_OEIM | PL011_IMSC_BEIM | \ - PL011_IMSC_PEIM | PL011_IMSC_FEIM | \ - PL011_IMSC_RIMIM | \ - PL011_IMSC_CTSMIM | \ - PL011_IMSC_DCDMIM | \ - PL011_IMSC_DSRMIM | \ - PL011_IMSC_RXIM | PL011_IMSC_TXIM | \ - PL011_IMSC_RTIM) - -/*************************************************************************** - * Private Types - ***************************************************************************/ - -/* UART PL011 register map structure */ - -struct pl011_regs -{ - uint32_t dr; /* data register */ - union - { - uint32_t rsr; - uint32_t ecr; - }; - - uint32_t reserved_0[4]; - uint32_t fr; /* flags register */ - uint32_t reserved_1; - uint32_t ilpr; - uint32_t ibrd; - uint32_t fbrd; - uint32_t lcr_h; - uint32_t cr; - uint32_t ifls; - uint32_t imsc; - uint32_t ris; - uint32_t mis; - uint32_t icr; - uint32_t dmacr; -}; - -struct pl011_config -{ - volatile struct pl011_regs *uart; - uint32_t sys_clk_freq; -}; - -/* Device data structure */ - -struct pl011_data -{ - uint32_t baud_rate; - bool sbsa; -}; - -struct pl011_uart_port_s -{ - struct pl011_data data; - struct pl011_config config; - unsigned int irq_num; - bool is_console; -}; - -/*************************************************************************** - * Private Functions - ***************************************************************************/ - -static void pl011_enable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->cr |= PL011_CR_UARTEN; -} - -static void pl011_disable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->cr &= ~PL011_CR_UARTEN; -} - -static void pl011_enable_fifo(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->lcr_h |= PL011_LCRH_FEN; -} - -static void pl011_disable_fifo(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->lcr_h &= ~PL011_LCRH_FEN; -} - -static int pl011_set_baudrate(const struct pl011_uart_port_s *sport, - uint32_t clk, uint32_t baudrate) -{ - const struct pl011_config *config = &sport->config; - - /* Avoiding float calculations, bauddiv is left shifted by 6 */ - - uint64_t bauddiv = - (((uint64_t)clk) << PL011_FBRD_WIDTH) / (baudrate * 16U); - - /* Valid bauddiv value - * uart_clk (min) >= 16 x baud_rate (max) - * uart_clk (max) <= 16 x 65535 x baud_rate (min) - */ - - if ((bauddiv < (1U << PL011_FBRD_WIDTH)) || - (bauddiv > (65535U << PL011_FBRD_WIDTH))) - { - return -EINVAL; - } - - config->uart->ibrd = bauddiv >> PL011_FBRD_WIDTH; - config->uart->fbrd = bauddiv & ((1U << PL011_FBRD_WIDTH) - 1U); - - ARM64_DMB(); - - /* In order to internally update the contents of ibrd or fbrd, a - * lcr_h write must always be performed at the end - * ARM DDI 0183F, Pg 3-13 - */ - - config->uart->lcr_h = config->uart->lcr_h; - - return 0; -} - -static void pl011_irq_tx_enable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->imsc |= PL011_IMSC_TXIM; -} - -static void pl011_irq_tx_disable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->imsc &= ~PL011_IMSC_TXIM; -} - -static void pl011_irq_rx_enable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->imsc |= PL011_IMSC_RXIM | PL011_IMSC_RTIM; -} - -static void pl011_irq_rx_disable(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - config->uart->imsc &= ~(PL011_IMSC_RXIM | PL011_IMSC_RTIM); -} - -static int pl011_irq_tx_complete(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - - /* check for TX FIFO empty */ - - return config->uart->fr & PL011_FR_TXFE; -} - -static int pl011_irq_rx_ready(const struct pl011_uart_port_s *sport) -{ - const struct pl011_config *config = &sport->config; - const struct pl011_data *data = &sport->data; - - if (!data->sbsa && !(config->uart->cr & PL011_CR_RXE)) - { - return false; - } - - return (config->uart->imsc & PL011_IMSC_RXIM) && - (!(config->uart->fr & PL011_FR_RXFE)); -} - -/*************************************************************************** - * Name: qemu_pl011_txready - * - * Description: - * Return true if the tranmsit fifo is not full - * - ***************************************************************************/ - -static bool qemu_pl011_txready(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - const struct pl011_config *config = &sport->config; - struct pl011_data *data = &sport->data; - - if (!data->sbsa && !(config->uart->cr & PL011_CR_TXE)) - { - return false; - } - - return (config->uart->imsc & PL011_IMSC_TXIM) && - pl011_irq_tx_complete(sport); -} - -/*************************************************************************** - * Name: qemu_pl011_txempty - * - * Description: - * Return true if the transmit fifo is empty - * - ***************************************************************************/ - -static bool qemu_pl011_txempty(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - - return pl011_irq_tx_complete(sport); -} - -/*************************************************************************** - * Name: qemu_pl011_send - * - * Description: - * This method will send one byte on the UART - * - ***************************************************************************/ - -static void qemu_pl011_send(struct uart_dev_s *dev, int ch) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - const struct pl011_config *config = &sport->config; - - config->uart->dr = ch; -} - -/*************************************************************************** - * Name: qemu_pl011_rxavailable - * - * Description: - * Return true if the receive fifo is not empty - * - ***************************************************************************/ - -static bool qemu_pl011_rxavailable(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - const struct pl011_config *config = &sport->config; - struct pl011_data *data = &sport->data; - - if (!data->sbsa && - (!(config->uart->cr & PL011_CR_UARTEN) || - !(config->uart->cr & PL011_CR_RXE))) - { - return false; - } - - return (config->uart->fr & PL011_FR_RXFE) == 0U; -} - -/*************************************************************************** - * Name: qemu_pl011_rxint - * - * Description: - * Call to enable or disable RX interrupts - * - ***************************************************************************/ - -static void qemu_pl011_rxint(struct uart_dev_s *dev, bool enable) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - - if (enable) - { - pl011_irq_rx_enable(sport); - } - else - { - pl011_irq_rx_disable(sport); - } -} - -/*************************************************************************** - * Name: qemu_pl011_txint - * - * Description: - * Call to enable or disable TX interrupts - * - ***************************************************************************/ - -static void qemu_pl011_txint(struct uart_dev_s *dev, bool enable) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - irqstate_t flags; - - flags = enter_critical_section(); - - if (enable) - { - pl011_irq_tx_enable(sport); - - /* Fake a TX interrupt here by just calling uart_xmitchars() with - * interrupts disabled (note this may recurse). - */ - - uart_xmitchars(dev); - } - else - { - pl011_irq_tx_disable(sport); - } - - leave_critical_section(flags); -} - -/*************************************************************************** - * Name: qemu_pl011_receive - * - * Description: - * Called (usually) from the interrupt level to receive one - * character from the UART. Error bits associated with the - * receipt are provided in the return 'status'. - * - ***************************************************************************/ - -static int qemu_pl011_receive(struct uart_dev_s *dev, unsigned int *status) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - const struct pl011_config *config = &sport->config; - unsigned int rx; - - rx = config->uart->dr; - - *status = 0; - - return rx; -} - -/*************************************************************************** - * Name: qemu_pl011_ioctl - * - * Description: - * All ioctl calls will be routed through this method - * for current qemu configure, - * - ***************************************************************************/ - -static int qemu_pl011_ioctl(struct file *filep, int cmd, unsigned long arg) -{ - int ret = OK; - UNUSED(filep); - UNUSED(arg); - - switch (cmd) - { - case TIOCSBRK: /* BSD compatibility: Turn break on, unconditionally */ - case TIOCCBRK: /* BSD compatibility: Turn break off, unconditionally */ - default: - { - ret = -ENOTTY; - break; - } - } - - return ret; -} - -/*************************************************************************** - * Name: qemu_pl011_irq_handler (and front-ends) - * - * Description: - * This is the UART interrupt handler. It will be invoked when an - * interrupt is received on the 'irq'. It should call uart_xmitchars or - * uart_recvchars to perform the appropriate data transfers. The - * interrupt handling logic must be able to map the 'arg' to the - * appropriate uart_dev_s structure in order to call these functions. - * - ***************************************************************************/ - -static int qemu_pl011_irq_handler(int irq, void *context, void *arg) -{ - struct uart_dev_s *dev = (struct uart_dev_s *)arg; - struct pl011_uart_port_s *sport; - UNUSED(irq); - UNUSED(context); - - DEBUGASSERT(dev != NULL && dev->priv != NULL); - sport = (struct pl011_uart_port_s *)dev->priv; - - if (pl011_irq_rx_ready(sport)) - { - uart_recvchars(dev); - } - - if (qemu_pl011_txready(dev)) - { - uart_xmitchars(dev); - } - - return OK; -} - -/*************************************************************************** - * Name: qemu_pl011_detach - * - * Description: - * Detach UART interrupts. This method is called when the serial port is - * closed normally just before the shutdown method is called. The - * exception is the serial console which is never shutdown. - * - ***************************************************************************/ - -static void qemu_pl011_detach(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - - up_disable_irq(sport->irq_num); - irq_detach(sport->irq_num); -} - -/*************************************************************************** - * Name: qemu_pl011_attach - * - * Description: - * Configure the UART to operation in interrupt driven mode. - * This method is called when the serial port is opened. - * Normally, this is just after the setup() method is called, - * however, the serial console may operate in - * a non-interrupt driven mode during the boot phase. - * - * RX and TX interrupts are not enabled when by the attach method - * (unless the hardware supports multiple levels of interrupt - * enabling). The RX and TX interrupts are not enabled until - * the txint() and rxint() methods are called. - * - ***************************************************************************/ - -static int qemu_pl011_attach(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport; - struct pl011_data *data; - int ret; - - sport = (struct pl011_uart_port_s *)dev->priv; - data = &sport->data; - - ret = irq_attach(sport->irq_num, qemu_pl011_irq_handler, dev); - - if (ret == OK) - { - up_enable_irq(sport->irq_num); - } - else - { - sinfo("error ret=%d\n", ret); - } - - if (!data->sbsa) - { - pl011_enable(sport); - } - - return ret; -} - -/*************************************************************************** - * Name: qemu_pl011_shutdown - * - * Description: - * Disable the UART. This method is called when the serial - * port is closed - * - ***************************************************************************/ - -static void qemu_pl011_shutdown(struct uart_dev_s *dev) -{ - UNUSED(dev); - sinfo("%s: call unexpected\n", __func__); -} - -static int qemu_pl011_setup(struct uart_dev_s *dev) -{ - struct pl011_uart_port_s *sport = (struct pl011_uart_port_s *)dev->priv; - const struct pl011_config *config = &sport->config; - struct pl011_data *data = &sport->data; - int ret; - uint32_t lcrh; - irqstate_t i_flags; - - i_flags = up_irq_save(); - - /* If working in SBSA mode, we assume that UART is already configured, - * or does not require configuration at all (if UART is emulated by - * virtualization software). - */ - - if (!data->sbsa) - { - /* disable the uart */ - - pl011_disable(sport); - pl011_disable_fifo(sport); - - /* Set baud rate */ - - ret = pl011_set_baudrate(sport, config->sys_clk_freq, - data->baud_rate); - if (ret != 0) - { - up_irq_restore(i_flags); - return ret; - } - - /* Setting the default character format */ - - lcrh = config->uart->lcr_h & ~(PL011_LCRH_FORMAT_MASK); - lcrh &= ~(BIT(0) | BIT(7)); - lcrh |= PL011_LCRH_WLEN_SIZE(8) << PL011_LCRH_WLEN_SHIFT; - config->uart->lcr_h = lcrh; - - /* Enabling the FIFOs */ - - pl011_enable_fifo(sport); - } - - /* initialize all IRQs as masked */ - - config->uart->imsc = 0U; - config->uart->icr = PL011_IMSC_MASK_ALL; - - if (!data->sbsa) - { - config->uart->dmacr = 0U; - ARM64_ISB(); - config->uart->cr &= ~(BIT(14) | BIT(15) | BIT(1)); - config->uart->cr |= PL011_CR_RXE | PL011_CR_TXE; - ARM64_ISB(); - } - - up_irq_restore(i_flags); - - return 0; -} - -/*************************************************************************** - * Private Data - ***************************************************************************/ - -/* Serial driver UART operations */ - -static const struct uart_ops_s g_uart_ops = -{ - .setup = qemu_pl011_setup, - .shutdown = qemu_pl011_shutdown, - .attach = qemu_pl011_attach, - .detach = qemu_pl011_detach, - .ioctl = qemu_pl011_ioctl, - .receive = qemu_pl011_receive, - .rxint = qemu_pl011_rxint, - .rxavailable = qemu_pl011_rxavailable, -#ifdef CONFIG_SERIAL_IFLOWCONTROL - .rxflowcontrol = NULL, -#endif - .send = qemu_pl011_send, - .txint = qemu_pl011_txint, - .txready = qemu_pl011_txready, - .txempty = qemu_pl011_txempty, -}; - -/* This describes the state of the uart1 port. */ - -static struct pl011_uart_port_s g_uart1priv = -{ - .data = - { - .baud_rate = CONFIG_UART1_BAUD, - .sbsa = false, - }, - - .config = - { - .uart = (volatile struct pl011_regs *)CONFIG_QEMU_UART_BASE, - .sys_clk_freq = 24000000, - }, - - .irq_num = CONFIG_QEMU_UART_IRQ, - .is_console = 1, -}; - -/* I/O buffers */ - -#ifdef CONFIG_QEMU_UART_PL011 - -static char g_uart1rxbuffer[CONFIG_UART1_RXBUFSIZE]; -static char g_uart1txbuffer[CONFIG_UART1_TXBUFSIZE]; - -static struct uart_dev_s g_uart1port = -{ - .recv = - { - .size = CONFIG_UART1_RXBUFSIZE, - .buffer = g_uart1rxbuffer, - }, - - .xmit = - { - .size = CONFIG_UART1_TXBUFSIZE, - .buffer = g_uart1txbuffer, - }, - - .ops = &g_uart_ops, - .priv = &g_uart1priv, -}; - -#endif - /*************************************************************************** * Public Functions ***************************************************************************/ @@ -798,38 +53,8 @@ void arm64_earlyserialinit(void) /* Enable the console UART. The other UARTs will be initialized if and * when they are first opened. */ -#ifdef CONSOLE_DEV - CONSOLE_DEV.isconsole = true; - qemu_pl011_setup(&CONSOLE_DEV); -#endif -} - -/*************************************************************************** - * Name: up_putc - * - * Description: - * Provide priority, low-level access to support OS debug - * writes - * - ***************************************************************************/ -int up_putc(int ch) -{ -#ifdef CONSOLE_DEV - struct uart_dev_s *dev = &CONSOLE_DEV; - - /* Check for LF */ - - if (ch == '\n') - { - /* Add CR */ - - qemu_pl011_send(dev, '\r'); - } - - qemu_pl011_send(dev, ch); -#endif - return ch; + pl011_earlyserialinit(); } /*************************************************************************** @@ -842,22 +67,7 @@ int up_putc(int ch) void arm64_serialinit(void) { -#ifdef CONSOLE_DEV - int ret; - - ret = uart_register("/dev/console", &CONSOLE_DEV); - if (ret < 0) - { - sinfo("error at register dev/console, ret =%d\n", ret); - } - - ret = uart_register("/dev/ttyS0", &TTYS0_DEV); - - if (ret < 0) - { - sinfo("error at register dev/ttyS0, ret =%d\n", ret); - } -#endif + pl011_serialinit(); } #endif /* USE_SERIALDRIVER */ diff --git a/arch/arm64/src/qemu/qemu_serial.h b/arch/arm64/src/qemu/qemu_serial.h index 815ec639a3..e6b420f281 100644 --- a/arch/arm64/src/qemu/qemu_serial.h +++ b/arch/arm64/src/qemu/qemu_serial.h @@ -27,9 +27,6 @@ #include <nuttx/config.h> -#include "arm64_internal.h" -#include "arm64_gic.h" - /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ diff --git a/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh/defconfig b/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh/defconfig index 11222b7444..9a7dd51de8 100644 --- a/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh/defconfig +++ b/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh/defconfig @@ -33,7 +33,19 @@ CONFIG_EXPERIMENTAL=y CONFIG_FS_PROCFS=y CONFIG_FS_PROCFS_REGISTER=y CONFIG_FS_ROMFS=y -CONFIG_FVP_UART_PL011=y +CONFIG_UART0_PL011=y +CONFIG_UART0_BASE=0x9c090000 +CONFIG_UART0_IRQ=37 +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9c0a0000 +CONFIG_UART1_IRQ=38 +CONFIG_UART2_PL011=y +CONFIG_UART2_BASE=0x9c0b0000 +CONFIG_UART2_IRQ=39 +CONFIG_UART3_PL011=y +CONFIG_UART3_BASE=0x9c0c0000 +CONFIG_UART3_IRQ=40 +CONFIG_UART_PL011=y CONFIG_IDLETHREAD_STACKSIZE=8192 CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INTELHEX_BINARY=y diff --git a/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh_smp/defconfig b/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh_smp/defconfig index ffd4b8c486..22fd417b8d 100644 --- a/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh_smp/defconfig +++ b/boards/arm64/fvp-v8r/fvp-armv8r/configs/nsh_smp/defconfig @@ -33,7 +33,19 @@ CONFIG_EXPERIMENTAL=y CONFIG_FS_PROCFS=y CONFIG_FS_PROCFS_REGISTER=y CONFIG_FS_ROMFS=y -CONFIG_FVP_UART_PL011=y +CONFIG_UART0_PL011=y +CONFIG_UART0_BASE=0x9c090000 +CONFIG_UART0_IRQ=37 +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9c0a0000 +CONFIG_UART1_IRQ=38 +CONFIG_UART2_PL011=y +CONFIG_UART2_BASE=0x9c0b0000 +CONFIG_UART2_IRQ=39 +CONFIG_UART3_PL011=y +CONFIG_UART3_BASE=0x9c0c0000 +CONFIG_UART3_IRQ=40 +CONFIG_UART_PL011=y CONFIG_IDLETHREAD_STACKSIZE=8192 CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INTELHEX_BINARY=y diff --git a/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/citest/defconfig similarity index 94% copy from boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig copy to boards/arm64/qemu/qemu-armv8a/configs/citest/defconfig index bf88943447..b2c18b5552 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/citest/defconfig @@ -13,7 +13,6 @@ CONFIG_ARCH_CHIP="qemu" CONFIG_ARCH_CHIP_QEMU=y CONFIG_ARCH_CHIP_QEMU_A53=y CONFIG_ARCH_INTERRUPTSTACK=4096 -CONFIG_ARM_GIC_VERSION=2 CONFIG_BUILTIN=y CONFIG_DEBUG_ASSERTIONS=y CONFIG_DEBUG_ERROR=y @@ -44,7 +43,10 @@ CONFIG_NSH_READLINE=y CONFIG_NSH_ROMFSETC=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=8192 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAMLOG=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 @@ -60,7 +62,6 @@ CONFIG_START_YEAR=2022 CONFIG_SYMTAB_ORDEREDBYNAME=y CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_SYSTEM=y -CONFIG_SYSTEM_TIME64=y CONFIG_TESTING_GETPRIME=y CONFIG_TESTING_OSTEST=y CONFIG_UART1_SERIAL_CONSOLE=y diff --git a/boards/arm64/qemu/qemu-armv8a/configs/netnsh/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/netnsh/defconfig index 05d91bbc78..48397c7174 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/netnsh/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/netnsh/defconfig @@ -59,7 +59,10 @@ CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_READLINE=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=8192 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 CONFIG_RAW_BINARY=y diff --git a/boards/arm64/qemu/qemu-armv8a/configs/netnsh_smp/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/netnsh_smp/defconfig index 88733f9011..ec582e26ac 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/netnsh_smp/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/netnsh_smp/defconfig @@ -61,7 +61,10 @@ CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_READLINE=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=8192 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 CONFIG_RAW_BINARY=y diff --git a/boards/arm64/qemu/qemu-armv8a/configs/nsh/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/nsh/defconfig index c1d0d712c7..cc0f09e2c6 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/nsh/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/nsh/defconfig @@ -45,7 +45,10 @@ CONFIG_NSH_READLINE=y CONFIG_NSH_ROMFSETC=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=8192 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAMLOG=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 diff --git a/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig index bf88943447..469550af2c 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/nsh_gicv2/defconfig @@ -44,7 +44,10 @@ CONFIG_NSH_READLINE=y CONFIG_NSH_ROMFSETC=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=8192 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAMLOG=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 diff --git a/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp/defconfig index 858b59a6d3..a69116a788 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp/defconfig @@ -43,7 +43,10 @@ CONFIG_NSH_READLINE=y CONFIG_NSH_ROMFSETC=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=16384 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAMLOG=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 diff --git a/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp_tickless/defconfig b/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp_tickless/defconfig index 43f67e6709..a143f19244 100644 --- a/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp_tickless/defconfig +++ b/boards/arm64/qemu/qemu-armv8a/configs/nsh_smp_tickless/defconfig @@ -43,7 +43,10 @@ CONFIG_NSH_READLINE=y CONFIG_NSH_ROMFSETC=y CONFIG_PREALLOC_TIMERS=4 CONFIG_PTHREAD_STACK_MIN=16384 -CONFIG_QEMU_UART_PL011=y +CONFIG_UART1_PL011=y +CONFIG_UART1_BASE=0x9000000 +CONFIG_UART1_IRQ=33 +CONFIG_UART_PL011=y CONFIG_RAMLOG=y CONFIG_RAM_SIZE=134217728 CONFIG_RAM_START=0x40000000 diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 7db9c16524..7d1187f543 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -41,6 +41,14 @@ config SERIAL_CONSOLE bool default n +menuconfig UART_PL011 + bool "PL011 Chip support" + default n + +if UART_PL011 +source "drivers/serial/Kconfig-pl011" +endif + menuconfig 16550_UART bool "16550 UART Chip support" select ARCH_HAVE_SERIAL_TERMIOS diff --git a/drivers/serial/Kconfig-pl011 b/drivers/serial/Kconfig-pl011 new file mode 100644 index 0000000000..9d562761bc --- /dev/null +++ b/drivers/serial/Kconfig-pl011 @@ -0,0 +1,60 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if UART_PL011 + +config UART0_PL011 + bool "UART0 PL011" + select UART0_SERIALDRIVER + default n + +config UART1_PL011 + bool "UART1 PL011" + select UART1_SERIALDRIVER + default n + +config UART2_PL011 + bool "UART2 PL011" + select UART2_SERIALDRIVER + default n + +config UART3_PL011 + bool "UART3 PL011" + select UART3_SERIALDRIVER + default n + +config UART0_BASE + hex "UART0 base address" + depends on UART0_PL011 + +config UART1_BASE + hex "UART1 base address" + depends on UART1_PL011 + +config UART2_BASE + hex "UART2 base address" + depends on UART2_PL011 + +config UART3_BASE + hex "UART3 base address" + depends on UART3_PL011 + +config UART0_IRQ + int "PL011 UART0 IRQ number" + depends on UART0_PL011 + +config UART1_IRQ + int "PL011 UART1 IRQ number" + depends on UART1_PL011 + +config UART2_IRQ + int "PL011 UART2 IRQ number" + depends on UART2_PL011 + +config UART3_IRQ + int "PL011 UART3 IRQ number" + depends on UART3_PL011 + +endif # UART_PL011 diff --git a/drivers/serial/Make.defs b/drivers/serial/Make.defs index 1486d58ab1..8270a2df4d 100644 --- a/drivers/serial/Make.defs +++ b/drivers/serial/Make.defs @@ -22,6 +22,10 @@ CSRCS += serial.c serial_io.c +ifeq ($(CONFIG_UART_PL011),y) + CSRCS += serial_pl011.c +endif + ifeq ($(CONFIG_SERIAL_RXDMA),y) CSRCS += serial_dma.c else ifeq ($(CONFIG_SERIAL_TXDMA),y) diff --git a/arch/arm64/src/fvp-v8r/serial_pl011.c b/drivers/serial/serial_pl011.c similarity index 98% rename from arch/arm64/src/fvp-v8r/serial_pl011.c rename to drivers/serial/serial_pl011.c index f3eae01bcd..600ac0bc4f 100644 --- a/arch/arm64/src/fvp-v8r/serial_pl011.c +++ b/drivers/serial/serial_pl011.c @@ -1,5 +1,5 @@ /*************************************************************************** - * arch/arm64/src/fvp-v8r/serial_pl011.c + * drivers/serial/serial_pl011.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -43,16 +43,9 @@ #include <nuttx/fs/ioctl.h> #include <nuttx/semaphore.h> #include <nuttx/serial/serial.h> +#include <nuttx/serial/uart_pl011.h> -#include "arm64_arch.h" -#include "arm64_internal.h" -#include "serial_pl011.h" -#include "arm64_arch_timer.h" -#include "fvp_boot.h" -#include "arm64_gic.h" -#include "chip.h" - -#ifdef USE_SERIALDRIVER +#ifdef CONFIG_UART_PL011 /*************************************************************************** * Pre-processor Definitions @@ -72,6 +65,7 @@ #endif #define PL011_BIT_MASK(x, y) (((2 << (x)) - 1) << (y)) +#define BIT(n) ((1UL) << (n)) /* PL011 Uart Flags Register */ #define PL011_FR_CTS BIT(0) /* clear to send - inverted */ @@ -285,8 +279,6 @@ static int pl011_set_baudrate(const struct pl011_uart_port_s *sport, config->uart->ibrd = bauddiv >> PL011_FBRD_WIDTH; config->uart->fbrd = bauddiv & ((1U << PL011_FBRD_WIDTH) - 1U); - ARM64_DMB(); - /* In order to internally update the contents of ibrd or fbrd, a * lcr_h write must always be performed at the end * ARM DDI 0183F, Pg 3-13 @@ -697,10 +689,8 @@ static int pl011_setup(struct uart_dev_s *dev) if (!data->sbsa) { config->uart->dmacr = 0U; - ARM64_ISB(); config->uart->cr &= ~(BIT(14) | BIT(15) | BIT(1)); config->uart->cr |= PL011_CR_RXE | PL011_CR_TXE; - ARM64_ISB(); } up_irq_restore(i_flags); @@ -781,14 +771,14 @@ static struct uart_dev_s g_uart1port = ***************************************************************************/ /*************************************************************************** - * Name: arm64_earlyserialinit + * Name: pl011_earlyserialinit * * Description: - * see arm64_internal.h + * see nuttx/serial/uart_pl011.h * ***************************************************************************/ -void arm64_earlyserialinit(void) +void pl011_earlyserialinit(void) { /* Enable the console UART. The other UARTs will be initialized if and * when they are first opened. @@ -829,14 +819,14 @@ int up_putc(int ch) } /*************************************************************************** - * Name: arm64_serialinit + * Name: pl011_serialinit * * Description: - * see arm64_internal.h + * see nuttx/serial/uart_pl011.h * ***************************************************************************/ -void arm64_serialinit(void) +void pl011_serialinit(void) { #ifdef CONSOLE_DEV int ret; diff --git a/arch/arm64/src/qemu/qemu_serial.h b/include/nuttx/serial/uart_pl011.h similarity index 81% copy from arch/arm64/src/qemu/qemu_serial.h copy to include/nuttx/serial/uart_pl011.h index 815ec639a3..52de87d9bf 100644 --- a/arch/arm64/src/qemu/qemu_serial.h +++ b/include/nuttx/serial/uart_pl011.h @@ -1,5 +1,5 @@ /**************************************************************************** - * arch/arm64/src/qemu/qemu_serial.h + * include/nuttx/serial/uart_pl011.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -18,8 +18,8 @@ * ****************************************************************************/ -#ifndef __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H -#define __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H +#ifndef __INCLUDE_NUTTX_SERIAL_UART_PL011_H +#define __INCLUDE_NUTTX_SERIAL_UART_PL011_H /**************************************************************************** * Included Files @@ -27,35 +27,30 @@ #include <nuttx/config.h> -#include "arm64_internal.h" -#include "arm64_gic.h" +#ifdef CONFIG_UART_PL011 /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /**************************************************************************** - * Public Types + * Pre-processor Definitions ****************************************************************************/ /**************************************************************************** - * Inline Functions + * Public Functions Definitions ****************************************************************************/ -#ifndef __ASSEMBLY__ +void pl011_earlyserialinit(void); + +void pl011_serialinit(void); /**************************************************************************** - * Public Data + * Public Types ****************************************************************************/ -#ifdef CONFIG_ARCH_CHIP_QEMU -#define CONFIG_QEMU_UART_BASE 0x9000000 -#define CONFIG_QEMU_UART_IRQ (GIC_SPI_INT_BASE + 1) -#endif - /**************************************************************************** - * Public Function Prototypes + * Inline Functions ****************************************************************************/ - -#endif /* __ASSEMBLY__ */ -#endif /* __ARCH_ARM64_SRC_QEMU_QEMU_SERIAL_H */ +#endif /* CONFIG_UART_PL011 */ +#endif /* __INCLUDE_NUTTX_SERIAL_UART_PL011_H */